LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

dimanche 17 janvier 2021

20 visiteurs en ce moment

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=Lwpxrq9v1Yw

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.

2 Messages

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 « Programmation »

Comment gérer le temps dans un programme ?

La programmation, qu’est ce que c’est

Types, constantes et variables

Installation de l’IDE Arduino

Répéter des instructions : les boucles

Les interruptions (1)

Instructions conditionnelles : le if … else

Instructions conditionnelles : le switch … case

Comment concevoir rationnellement votre système

Comment gérer l’aléatoire ?

Calculer avec l’Arduino (1)

Calculer avec l’Arduino (2)

La compilation d’un projet Arduino

Les structures

Systèmes de numération

Les fonctions

Trois façons de déclarer des constantes

Transcription d’un programme simple en programmation objet

Ces tableaux qui peuvent nous simplifier le développement Arduino

Les chaînes de caractères

Trucs, astuces et choses à ne pas faire !

Processing pour nos trains

Arduino : toute première fois !

Démarrer en Processing (1)

TCOs en Processing

TCOs en Processing (2)

Comment réussir son projet Arduino

Passage à niveau géré par Arduino (1)

Passage à niveau géré par Arduino (2)

Passage à niveau géré par Arduino (3)

Passage à niveau géré par Arduino (4)

Passage à niveau géré par Arduino (5)

Du sketch à l’exécutable

Programmer vos Arduino avec un fichier hexadécimal

Le monde des objets (1)

Le monde des objets (2)

Le monde des objets (3)

Le monde des objets (4)

Les pointeurs (1)

Les pointeurs (2)

Les Timers (I)

Les Timers (II)

Les Timers (III)

Les Timers (IV)

Les Timers (V)

Bien utiliser l’IDE d’Arduino (1)

Bien utiliser l’IDE d’Arduino (2)

Piloter son Arduino avec son navigateur web et Node.js (1)

Piloter son Arduino avec son navigateur web et Node.js (2)

Piloter son Arduino avec son navigateur web et Node.js (3)

Piloter son Arduino avec son navigateur web et Node.js (4)

Les derniers articles

Programmer vos Arduino avec un fichier hexadécimal


Christian

Du sketch à l’exécutable


Christian

Passage à niveau géré par Arduino (5)


Christian

Passage à niveau géré par Arduino (4)


Christian

Passage à niveau géré par Arduino (3)


Christian

Passage à niveau géré par Arduino (2)


Christian

Passage à niveau géré par Arduino (1)


Christian

La compilation d’un projet Arduino


Thierry

TCOs en Processing (2)


Pierre59

Comment concevoir rationnellement votre système


Jean-Luc

Les articles les plus lus

Les interruptions (1)

Les Timers (I)

Instructions conditionnelles : le if … else

Ces tableaux qui peuvent nous simplifier le développement Arduino

Comment gérer le temps dans un programme ?

Les chaînes de caractères

Instructions conditionnelles : le switch … case

Répéter des instructions : les boucles

Bien utiliser l’IDE d’Arduino (1)

Les Timers (II)