LOCODUINO

Programmer vos Arduino avec un fichier hexadécimal

.
Par : Christian

DIFFICULTÉ :

Si vous avez lu l’article Du sketch à l’exécutable, vous avez vu que l’IDE effectue plusieurs opérations pour transformer votre programme en un code binaire que le microcontrôleur est capable d’exécuter. Ce code binaire, appelé code objet, est d’abord transformé par avr-objcopy qui le présente sous la forme d’un fichier hexadécimal au standard Intel, et ce fichier est ensuite repris par avrdude pour programmer le microcontrôleur par l’intermédiaire du bootloader. Dans cet article, nous allons découvrir comment utiliser avrdude en mode console pour envoyer un fichier hexadécimal dans la mémoire programme du microcontrôleur.

On s’est tellement habitué à la convivialité de l’IDE d’Arduino qu’on peut se demander pourquoi revenir aux ordres en ligne du mode console de l’ordinateur. Il faut savoir qu’avrdude s’utilise avec des paramètres et qu’en les réglant par soi-même, on peut obtenir un résultat un peu différent de ce que fait l’IDE. Il suffit de taper avrdude en mode console sans aucun paramètre pour faire apparaître une page d’aide pour se repérer dans ces paramètres. Mais l’utilisation d’avrdude dans toutes ses possibilités n’est pas le sujet de cet article.

Intérêt des fichiers hexadécimaux

Voyons plutôt l’intérêt à programmer nos microcontrôleurs à partir d’un fichier hexadécimal au format Intel. Si vous voulez échanger un programme avec un ami, vous pensez tout naturellement à lui faire parvenir le fichier .ino de votre programme. Mais si ce programme utilise une bibliothèque non standard, votre ami devra l’installer dans son IDE s’il veut compiler votre programme et le télécharger dans sa carte Arduino. Saura-t-il choisir la bonne version de cette bibliothèque ? Et s’il choisit la dernière version publiée, sera-t-elle compatible avec votre code ?

En envoyant le fichier hexadécimal généré par avr-objcopy (voir article Du sketch à l’exécutable), vous lui fournissez le code exécutable qui contient tout ce qui est nécessaire à votre microcontrôleur pour exécuter correctement votre programme. C’est en effet ce fichier qui est utilisé pour effectuer le téléversement dans la carte Arduino ou le microcontrôleur. Bien évidemment, ce fichier hexadécimal ne convient qu’à un seul type de microcontrôleur alors qu’un fichier de programme peut être recompilé pour un autre type.

Un autre inconvénient est que votre ami ne disposera pas du listing lui permettant de comprendre comment le programme fonctionne et ne pourra pas effectuer de modifications ; un inconvénient qui peut aussi être un avantage si vous voulez conserver vos petits secrets. En effet, il est toujours possible d’extraire le code exécutable d’un fichier hexadécimal et de le soumettre à un désassembleur, mais le listing obtenu est en assembleur et de plus non commenté : un sacré casse-tête pour y comprendre quelque chose.

Le monde d’Arduino étant basé sur l’open source, nous préférons penser que le fichier hexadécimal est utilisé pour garantir un fonctionnement à coup sûr plutôt que pour préserver de petits secrets. Voyons maintenant comment faire pour générer un fichier hexadécimal à partir d’un programme fonctionnel.

Génération d’un fichier HEX à partir d’un programme

Ouvrez l’IDE d’Arduino et ouvrez le programme pour lequel vous voulez générer un fichier HEX (fichier hexadécimal au format Intel). Dans le menu Outils, sélectionner le type de carte ou de microcontrôleur qui sera la cible du fichier HEX. Pour l’instant, la carte n’a pas besoin d’être connectée. Dans le menu Croquis, sélectionner Exporter les binaires compilées comme le montre la figure 1.

Figure 1
Figure 1

Lorsque vous voyez « Compilation terminée » et le nombre d’octets utilisés dans les espaces mémoires, retournez dans le menu Croquis et sélectionner Afficher le dossier des croquis comme le montre la figure 2.

Figure 2
Figure 2

Dans le répertoire qui s’ouvre, vous pouvez voir un fichier HEX appelé nom_de_votre_programme.ino.standard.hex et un autre mentionnant « with_bootloader » entre ino et standard si vous avez compilé pour une carte Arduino et non un simple microcontrôleur. Le fichier qui vous intéresse est le fichier ino.standard (sans la mention bootloader) et c’est ce fichier que vous pouvez partager. Récupérer ce fichier pour l’installer sur votre bureau (ou faites en une copie).

Pour la suite de cet article, je vous conseille de préparer deux fichiers HEX sur votre bureau afin de bien observer les téléversements. Par exemple, ouvrez le programme Blink, modifiez les délais pour créer un clignotement rapide de la LED et sauvegardez ce programme sous le nom BlinkFast. Modifiez à nouveau les délais pour créer un clignotement lent et sauvegardez sous le nom BlinkSlow. Générez les deux fichiers HEX de ces deux programmes et mettez-les sur votre bureau.

Vous pouvez modifier le nom des fichiers HEX pour faire disparaître « .ino.standard » : ce qui compte, c’est d’avoir un fichier dont le nom est reconnaissable et l’extension est hex. Nous supposerons que vous avez maintenant sur votre bureau un fichier BlinkFast.hex et un fichier BlinkSlow.hex.

Repérage du chemin d’accès pour utiliser avrdude

Pour utiliser avrdude en mode console, il faut connaître le chemin d’accès vers le logiciel. L’IDE va nous l’indiquer. La procédure que je décris ici est faite pour Windows et a été adaptée à partir d’une vidéo en anglais dont je donne le lien en fin d’article. Ceux qui utilisent Mac-OS ont intérêt à aller directement voir la vidéo ; ils peuvent tout de même lire la suite car la procédure est quasiment la même.

Commencer par brancher la carte Arduino et repérer bien sur quel port elle se trouve (dans mon exemple, c’est le port COM3). Aller dans le menu Fichier puis Préférences et dans la fenêtre qui s’ouvre, cochez les cases « Afficher les résultats détaillés pendant : compilation et téléversement » comme le montre la figure 3.

Figure 3
Figure 3

Téléversez le programme dans la carte Arduino. Lorsque le message « Téléversement terminé » s’affiche, augmenter la taille de la zone d’affichage comme le montre la figure 4.

Figure 4
Figure 4

Scrollez le texte pour faire apparaître la dernière ligne en blanc comme le montre la figure 5.

Figure 5
Figure 5

Copiez cette ligne jusqu’au dernier caractère (un « i ») mais pas plus loin pour éviter de prendre le caractère return comme le montre la figure 6.

Figure 6
Figure 6

Vous pouvez maintenant refermer votre IDE.

Analyse et modification de la commande copiée

Collez la commande que vous avez copiée dans un éditeur de texte comme Bloc-notes ou bien notepad++, comme le montre la figure 7.

Figure 7
Figure 7

La première partie de cette commande, partie surlignée en bleu sur la figure 8, montre le chemin pour accéder à avrdude.

Figure 8
Figure 8

Vers la fin de la commande, partie surlignée en bleu sur la figure 9, on trouve un chemin d’accès vers le fichier HEX qu’on veut téléverser. C’est cette partie qu’il faudra modifier.

Figure 9
Figure 9

Modifiez le chemin d’accès et le nom pour le nouveau fichier (BlinkFast devant remplacer BlinkSlow), comme le montre la figure 10.

Figure 10
Figure 10

Une fois que les modifications sont faites, copiez à nouveau la commande dans sa totalité jusqu’au dernier caractère (mais pas plus).

Utilisation d’avrdude en mode console

Ouvrez la console de votre ordinateur (avec Windows, il suffit de taper cmd dans la zone de recherche). Vous obtenez l’invite de commande comme le montre la figure 11.

Figure 11
Figure 11

Coller la commande que vous venez de copier de votre éditeur de texte (figure 12).

Figure 12
Figure 12

Faites Entrée : avrdude entre en scène et téléverse le fichier HEX (ici BlinkFast.hex) dans la mémoire programme du microcontrôleur de la carte. Vous pouvez maintenant revenir à BlinkSlow : il est plus facile de modifier la commande à partir de l’éditeur de texte puis de l’importer dans la console. La figure 13 montre les deux commandes pour passer de BlinkSlow à BlinkFast.

Figure 13
Figure 13
Les commandes que vous voyez dans les différentes figures correspondent à mon ordinateur. Sur le vôtre, elles sont différentes puisque les chemins d’accès dépendent de la façon dont vous avez installé l’IDE d’Arduino.

Avec certains systèmes d’exploitation, notamment Windows, il est conseillé de rajouter des guillemets droits pour entourer certains chemins d’accès, comme le montre la figure 14 où ils sont surlignés en jaune. Sur mon système d’exploitation (W10), et avec les exemples donnés, la commande fonctionne avec ou sans les guillemets ; cependant, les guillemets sont nécessaires si dans l’arborescence d’un fichier, il y a des caractères qui peuvent être mal compris comme des tirets ou des espaces par exemple (c’est notamment le cas si vos chemins d’accès commencent par C :\Program Files). En ajoutant systématiquement des guillemets droits, vous vous placez du bon côté pour éviter des problèmes.

La figure 14 montre également des paramètres importants surlignés en vert (microcontrôleur, port de communication, vitesse de transmission) ; si votre carte Arduino est connectée à un port différent, il faut bien évidemment modifier la commande.

Figure 14
Figure 14

Si rien ne se passe quand vous exécutez la commande, regardez le message fourni par avrdude dans la console : bien souvent, c’est le nom de fichier HEX qui est incorrect ou bien son chemin d’accès. Ces deux données peuvent se retrouver en faisant Propriétés (après un clic droit) pour le fichier concerné comme le montre la figure 15 (le nom de fichier est encadré en vert et le chemin d’accès en bleu).

Figure 15
Figure 15

Voici le lien vers la vidéo à partir de laquelle j’ai adapté la procédure : https://www.youtube.com/watch?v=Lwp...

Vous savez générer les fichiers hexadécimaux au standard Intel nécessaires à la programmation des cartes Arduino via le bootloader ou avec un programmateur externe ISP, et vous savez aussi comment utiliser ces fichiers avec avrdude en mode console. Vous pouvez maintenant échanger des programmes avec vos amis en étant certain que le fichier HEX transmis contient bien tout ce qui est nécessaire au programme pour qu’il fonctionne. La procédure pour utiliser avrdude en mode console peut paraître un peu lourde au début mais avec un peu d’habitude, vous la ferez les yeux fermés.

11 Messages

  • Programmer vos Arduino avec un fichier hexadécimal 12 janvier 2021 21:08, par Laurent ROEKENS

    Bonjour

    Je recommande plutôt l utilisation de AVRDUDESS dont l interface est plus "sympa" et apporte beaucoup de souplesse.
    Dispo ici :
    https://blog.zakkemble.net/avrdudes...

    Répondre

    • Programmer vos Arduino avec un fichier hexadécimal 13 janvier 2021 11:53, par Christian

      Bonjour Laurent,
      Effectivement, AVRDUDESS est un choix avisé qui est à conseiller à ceux qui ne sont pas (ou plus) familiers avec le mode console d’un ordinateur : ici, il suffit de remplir les cases d’un menu graphique, donc cela peut être plus simple pour certains. Si tu en as une bonne expérience, fais-nous un petit article sur son utilisation, d’autant qu’il permet plus de choses que ce que je décris dans cet article.
      L’intérêt de la solution préconisée dans cet article est que ceux qui utilisent Arduino ont forcément installé l’IDE et donc ont tous les outils nécessaires sous la main, sans être obligés d’installer d’autres applications.
      Amicalement.

      Répondre

  • Programmer vos Arduino avec un fichier hexadécimal 17 août 2021 11:02, par msport

    La même démarche existe pour l’ESP32 qui nous intéresse maintenant pour LaBox :

    une fois installé ESPTOOL (qui installe à son tour Python) https://github.com/espressif/esptool
    Ne pas s’inquiéter des temps morts.

    l’ESP est sur son câble USB, il suffit de lancer en mode de commande de Windows (exécuter CMD) à titre d’exemple pour lire un ESP32 :
    esptool.py -p COM4 -b 460800 read_flash 0 0x400000 flash_080.bin

    et pour écrire sur un autre :
    esptool.py —port COM4 write_flash 0 flash_080.bin

    Quelques liens :
    https://ports.macports.org/port/esptool/ mais il y a plus coté Windows :

    https://cyberblogspot.com/how-to-in...

    https://samg.net.au/tutorials/insta...

    https://www.youtube.com/watch?v=2Gw...

    Répondre

  • Programmer vos Arduino avec un fichier hexadécimal 12 novembre 2021 11:33, par Luchet

    Bonjour
    j’ai utiliser avec succès votre tuto mais maintenant voici ma question Peut-on charger dans l’Arduino un fichier .hex compilé avec un autre programme ( par ex Atmel Studio 7.0 )
    Merci

    Répondre

    • Programmer vos Arduino avec un fichier hexadécimal 12 novembre 2021 14:03, par Christian

      Tout à fait et Atmel Studio 7 génère le fichier .hex ; il faut simplement savoir comment le récupérer.
      Ce qui compte, c’est la cible, c’est-à-dire que ce fichier .hex soit bien généré pour le microcontrôleur en question, celui qui équipe la carte utilisée.

      Répondre

  • Programmer vos Arduino avec un fichier hexadécimal 24 janvier 2022 19:28, par Michel

    Bonjour Christian,

    Avant de poser ma question je tiens à vous féliciter pour ce tuto très bien fait et très instructif : Bravo ! et surtout merci de partager vos connaissances.

    Dans le cadre de mon activité j’ai conçu une alimentation secourue sur la base d’un Arduino Nano qui entre autres gère la surveillance et la charge des batteries.
    Pour assurer l’identification et le suivi des versions logiciels je me dois de fournir le "checksum" du fichier .hex qui est téléchargé dans le µC de cette alimentation.
    Donc voici mes questions :

    Est-ce que à votre connaissance le générateur de fichier objet "avr-objcopy" ou le module de téléchargement "avrdude" calculent ce "checksum" ?

    Si oui est-il possible de l’afficher à un moment donné de la compilation ou du téléchargement ?

    Par avance merci pour votre réponse et encore merci de nous éclairer de vos lumières...

    Répondre

    • Programmer vos Arduino avec un fichier hexadécimal 25 janvier 2022 11:17, par Christian

      Merci pour vos félicitations.
      Hélas, mes "lumières" ne sont pas sans limites. Je dois me replonger dans la doc d’avrdude pour répondre à votre question, n’ayant jamais eu à me préoccuper de cela. Je reviendrai donc vers vous ultérieurement, mais votre question est prise en compte.

      Répondre

  • Programmer vos Arduino avec un fichier hexadécimal 24 janvier 2022 21:38, par msport

    Bonsoir,
    je suppose que vous pouvez calculer en ligne le check-sum de votre fichier .hex avec un outil tel que :

    Voir en ligne : Online Checksum Calculator

    Répondre

  • Programmer vos Arduino avec un fichier hexadécimal 23 novembre 2022 19:02, par Simon

    Bonjour,

    J’ai écrit une application windows qui communique avec un Arduino et ses capteurs. J’aimerai pouvoir proposer d’éventuelles mises à jour du script Arduino aux utilisateurs de façon la plus simple possible : depuis l’application windows avec un simple bouton "mettre à jour le capteur".

    Est-il possible de l’envisager sans passer par avrdude ? Y a-t-il de la doc qqpart pour ce genre de chose ?
    A défaut, est-il conforme à la licence de avrdude de le redistribuer pour que mon application lance avrdude avec les bons paramètres pour faire cette mise à jour ?

    Merci de vos avis !

    Répondre

    • Programmer vos Arduino avec un fichier hexadécimal 24 novembre 2022 09:51, par Christian

      Toute mise à jour du script (je suppose que vous voulez dire sketch) d’une carte Arduino nécessite de reprogrammer la carte. Ceci peut se faire avec l’IDE, ou un autre logiciel de programmation (PlatformIO, Studio 7, etc.) qui utilise généralement AVRdude. Vous pouvez toujours concevoir votre programmateur : il suffit de lire la doc du microcontrôleur de la carte Arduino pour apprendre à le programmer en ISP. Mais pourquoi réinventer la roue ?
      Je pense que vous pouvez utiliser AVRdude tant que vous restez dans un domaine non commercial ; c’est le propre de l’OpenSource où chaque logiciel peut être modifié et redistribué dans un esprit "Maker". Si vous voulez vendre votre application, c’est une autre histoire à voir avec l’équipe qui a conçu AVRdude. Je vous invite donc à leur poser cette question ; ils connaissent l’outil bien mieux que nous.
      Cordialement.

      Répondre

    • Programmer vos Arduino avec un fichier hexadécimal 24 novembre 2022 13:24, par Jean-Luc

      Bonjour, quelques infos supplémentaires (à vérifier ceci dit, je n’ai pas fait moi même)

      À ma connaissance, AVRDude discute avec le boot loader de l’Arduino en utilisant le protocole stk500. Vous trouverez la description ici : http://www.tuxgraphics.org/common/s...

      Répondre

Réagissez à « Programmer vos Arduino avec un fichier hexadécimal »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Atelier »

Les derniers articles

Les articles les plus lus