Ceci est une ancienne révision du document !
Arduino : utiliser les fichiers .hex
Programmer un arduino se fait en plusieurs étapes : d'abord écrire le code, puis le compiler, c'est à dire le transformer en commandes adaptées au circuit, enfin le téléverser dans le microcontrôleur.
Le fichier compilé est du “code machine” au format hexadécimal (.hex), il n'est plus lisible pour nous autres mammifères, mais parfaitement adapté pour un circuit électronique. On ne peut pas retrouver le code d'origine depuis le fichier .hex (dans le meilleur des cas on peut le décompiler pour récupérer un programme en assembleur)
Pourquoi utiliser un fichier .hex ?
Quelques raisons d'utiliser le fichier .hex :
- le programme a été récupéré depuis un arduino, on n'en a donc pas le code source,
- pour programmer rapidement plusieurs arduino identiques avec le même programme,
- le programme n'a été diffusé que sous forme de .hex pour une quelconque raison…
- c'est la seule forme du programme qu'on peut récupérer depuis un arduino
Comment téléverser un fichier .hex ?
Il faut retrouver le chemin d'avrdude, le logiciel qui envoie le code machine dans le microcontrôleur
- dans les préférences, activer “Afficher les résultats détaillés pendant le téléversement”
- compiler et téléverser un programme
- noter la commande complète avrdude
Exemple :
/home/emoc/arduino-1.8.5/hardware/tools/avr/bin/avrdude -C/home/emoc/arduino-1.8.5/hardware/tools/avr/etc/avrdude.conf -v -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D -Uflash:w:/tmp/arduino_build_550567/LodeRunner.ino.hex:i
Dans ce cas précis, il s'agit d'un code compilé pour arduboy (ATmega32U4)
On peut découper cette ligne pour l'expliquer :
/home/emoc/arduino-1.8.5/hardware/tools/avr/bin/avrdude | chemin vers le logiciel avrdude | |
-C | /home/emoc/arduino-1.8.5/hardware/tools/avr/etc/avrdude.conf | chemin vers le fichier de configuration |
-v | exécution de la commande “bavarde” (verbose) | |
-p | atmega32u4 | modèle du microcontrôleur à programmer |
-c | avr109 | programmeur associé, ici : Atmel AppNote AVR109 Boot Loader |
-P | /dev/ttyACM0 | port USB série |
-b | 57600 | vitesse de transfert (baudrate) |
-D | désactiver l'effacement automatique de la mémoire flash | |
-U | flash:w:/tmp/arduino_build_550567/LodeRunner.ino.hex:i | voir ci-dessous |
Pour la dernière option (-U) la commande signifie : utiliser la mémoire flash (flash), pour écrire (w), un fichier .hex, encodé en hexadécimal intel (i)
Avec cette commande il est donc possible de flasher n'importe quel fichier hex compilé pour le même microcontrôleur, sans passer par l'IDE arduino
Créer un fichier .hex
Dans le cas ou l'on peut accéder au code source, il est possible de créer le fichier .hex pour le conserver depuis le menu “Croquis/exporter les binaires compilées”, le fichier .hex sera alors enregistré dans le dossier du sketch
Récupérer un fichier hex
On peut télécharger le code machine intégré dans un arduino programmé en utilisant avrdude, exemple ci-dessous pour récupérer le code machine d'un arduino nano
/home/emoc/arduino-1.8.5/hardware/tools/avr/bin/avrdude -C/home/emoc/arduino-1.8.5/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyUSB0 -b57600 -D -Uflash:r:/home/emoc/test/backup.ino.hex:i
La différence principale étant le r dans la dernière option (r pour read!)