Flasher un bootloader sur l’Arduino UNO : Plusieurs techniques
(Mis à jour le 12/07/2023)
Il existe de nombreux posts sur le forum Arduino concernant le flashage du bootloader sur les cartes Arduino (UNO, MEGA, NANO) et ses clones. Voici un article récapitulatif pour que vous ayez une vue d’ensemble 😊. J’en profiterai également pour expliquer la procédure pour la carte uPesy One, une carte Arduino Made In France .
Le bootloader
Pourquoi il y a un bootloader sur les cartes Arduino ?
Un bootloader est indispensable pour pouvoir programmer facilement la carte Arduino UNO depuis l’ordinateur via USB.
Note
Toutes les cartes Arduino sont généralement vendues avec le bootloader déjà présent.
Un bootloader est un tout petit programme qui à pour objectif de charger un programme dans la mémoire flash du microcontrôleur depuis une ligne série (UART
) et de le lancer automatiquement. Il est indispensable sur les ATMega328, contenus dans les cartes Arduino, pour téléverser un programme depuis l’USB. En effet, ce microcontrôleur peut nativement se programmer uniquement via un programmeur externe ICSP
. C’est un protocole bas niveau propriétaire, un peu similaire au JTAG
pour les connaisseurs. Il est utilisé par les professionnels avec les autres outils fournis par le fabricant des Atmega (Atmel) pour la programmation et le débogage.
Pour du prototypage facile et rapide, le bootloader Arduino est très pratique !
Fonctionnement du bootloader Arduino
Lorsque vous cliquez sur le bouton “Téleverser” depuis l’Arduino IDE, le logiciel et le bootloader vont communiquer ensemble, pour échanger le nouveau programme. En arrière-plan, le logiciel utiliser un outil en ligne de commande : avrdude
qui communique avec le bootloader de l’Arduino via le protocole STK500
.
Si vous avez activé dans les paramètres de l’Arduino IDE, l’affichage des résultats détaillés pendant le téléversement, vous pouvez apercevoir les lignes de commandes qui sont exécutées ainsi que les messages de communication échangés avec le bootloader.
Si vous voulez comprendre encore plus en profondeur son fonctionnement, vous pouvez consulter ces articles :
Pourquoi reflasher le bootloader sur l’Arduino UNO ?
Dans certains cas, vous serez obligé de flasher ou reflasher le bootloader, si vous n’arrivez pas à téléverser un sketch Arduino sur votre carte.
Savoir si le bootloader est déjà présent sur une carte Arduino
Un moyen simple de savoir si le bootloader est présent sur la carte consiste à regarder le comportement de la LED L
, reliée à la broche 13
de l’Arduino UNO. Lorsque vous branchez la carte à l’ordinateur, ou que vous appuyez sur le bouton RESET
, le bootloader fait clignoter rapidement cette LED 3 fois de suite. Si ce n’est pas le cas, alors vous pouvez être sûr qu’il n’y a pas de bootloader !
En l’absence d’un bootloader fonctionnel, vous aurez l’erreur suivante lors d’un téléversement : avrdude: stk500_recv(): programmer is not responding
et avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xd9
. Ces erreurs veulent dire que le bootloader de la carte ne répond pas, ce qui fait sens s’il n’est pas présent sur la carte :
Reflashage du bootloader : Les cas les plus fréquents
La première situation évidente est lorsque le bootloader n’a jamais été enregistré sur l’Atmega328, par exemple quand on achète directement la puce. Heureusement il est en général déjà présent sur les Arduino et ses clones.
L’autre cas est lorsque vous avez bidouillé certains paramètres de l’Arduino IDE lié au téléversement qui peuvent effacer le bootloader.
Reprogrammer le bootloader d’une carte Arduino
Il y a plusieurs méthodes pour reflasher le bootloader. Quelle que soit la méthode utilisée, il faudra une carte supplémentaire (un programmateur) pour flasher le bootloader de la carte cible. Je vais vous montrer la méthode classique qui utilise une carte Arduino UNO comme programmateur (donc pas besoin d’avoir un programmateur externe à se procurer). Il y aura donc 2 cartes Arduino d’utilisées dans cette manip : une carte source PROGRAMMER
, qui jouera le rôle d’un programmateur et la carte cible TARGET
qui va recevoir le bootloader.
Voici un résumé des étapes à effectuer :
Téléverser un programme sur la carte Arduino source (
PROGRAMMER
), qui permettra d’émuler un programmeurICSP
. Cette carte Arduino doit avoir un bootloader pour que cette méthode fonctionne.Paramétrer l’Arduino IDE pour qu’il utilise la carte
PROGRAMMER
comme programmateur, pour téléverser les futurs sketchs.Relier des fils entre les 2 cartes sur certaines broches
-
Téléverser le bootloader sur la carte cible
TARGET
via la cartePROGRAMMER
Note
La carte
PROGRAMMER
joue le rôle d’intermédiaire entre l’USB et le protocole ICSP Débrancher les fils
Reparamétrer l’Arduino IDE pour qu’il réutilise le mode de téléversement par défaut : via le bootloader
Vérifier que l’on peut bien programmer la carte
TARGET
normalement.
Maintenant que la manip a été décrite dans sa globalité, voici les étapes détaillées pas à pas à réaliser.
Téléverser le programme ArduinoISP
sur la carte PROGRAMMER
On transforme la carte Arduino en programmateur ICSP
en téléversant le sketch ArduinoISP
.
Note
Dans l’exemple, la carte PROGRAMMER
est sur le COM8
.
Le programme ArduinoISP
se trouve parmi les exemples.
Il suffit de téléversement ce programme sur la carte Arduino PROGRAMMER
pour la transformer en programmateur.
Note
Il suffira d’uploader un nouveau sketch pour enlever cette fonctionnalité sur cette carte.
Configurer l’Arduino IDE pour utiliser le programmateur Arduino as ISP
Maintenant que le sketch ArduinoISP
est téléversé, on indique au logiciel Arduino IDE d’utiliser ce programmateur pour les téléversements futurs : la carte PROGRAMMER
fait l’intermédiaire entre l’USB et le protocole ICSP
. On change le type de programmateur en allant dans le menu Outils → Progarmmateur → Arduino as ISP :
Le branchement entre les 2 cartes
On peut ensuite brancher les fils pour communiquer avec les 2 cartes Arduino via le protocole ICSP.
Note
On pourrait aussi relier les fils sur le connecteur ICSP localisé à droite.
Seule la carte PROGRAMMER
est reliée par USB par l’ordinateur. La carte TARGET
est alimentée via les fils +5V
et GND
.
Téléverser bootloader sur la carte TARGET
Une fois que vous êtes sûr du branchement, on va pouvoir charger le bootloader sur la carte Arduino TARGET
. En français, Arduino IDE utilise le terme “Séquence d’initialisation” pour désigner le bootloader.
Avertissement
Si votre carte cible n’est pas une carte Arduino UNO, mais une carte Arduino Nano, vous devez ajuster le type de carte avant de charger le bootloader.
Normalement si tout s’est bien passé, le bootloader a été chargé sur la carte Arduino cible TARGET
. En cas d’erreur, vérifier bien votre branchement. Si vous rencontrez l’erreur avrdude: Device signature = 0x1e9516 (probably m328pb)
et avrdude: Expected signature for ATmega328P is 1E 95 0F
, c’est que votre carte Arduino TARGET
est basée sur l’Atmega328PB, le successeur de l’Atmega328P. L’arduino IDE exécute une commande automatique que l’on ne peut pas personnaliser directement pour l’Atmega328PB. J’explique la méthode un peu plus loin pour flasher le bootloader sur l’Atmega328PB .
Remettre les paramètres correctement et débrancher les fils
Le plus difficile est derrière nous ! Maintenant vous pouvez tester la carte Arduino UNO cible en la reliant par USB à l’ordinateur.
Avertissement
Pensez bien à débrancher les fils entre les 2 cartes, notamment la broche RESET
, sinon cela ne fonctionnera pas.
Avant de téléverser un nouveau programme, on doit remettre les paramètres d’origine pour le programmateur, soit AVRISP MkII
. On en profite aussi pour choisir le bon port COM, ici COM3
.
Tester la carte
Vous pouvez maintenant téléverser n’importe quel programme sur votre carte Arduino directement depuis l’USB !
Bootloader Arduino : Les cas particuliers
Les cartes Arduino Nano
Il y a 2 bootloaders différents qui peuvent être utilisés sur les cartes Arduino Nano (et ses clones) en fonction de leur ancienneté :
atmega
(old bootloader)optiboot
(new bootloader)
Ils ne sont pas compatibles : l’Arduino IDE configuré pour utiliser le nouveau bootloader ne pourra pas téléverser un programme sur une carte Arduino Nano flashée avec l’ancien bootloader. Il faut donc faire attention à l’étape du flashage du bootloader de sélectionner le type de bootloader voulu :
ATmega328P si l’on désire charger le nouveau bootloader
ATmega328P (Old Bootloader) si l’on désire charger l’ancien
Note
Je vous recommande de mettre le même bootloader partout pour harmoniser vos cartes Nano et ainsi d’éviter de changer en permanence le type de bootloader utilisé dans les paramètres lors de vos différents projets.
Flasher le bootloader pour la carte uPesy One (ATMEGA328PB)
Pour flasher le bootloader de cartes basées sur l’Atmega328PB, il faudra directement exécuter une ligne de commande, tant que cela n’est pas supporté nativement dans l’Arduino IDE. En fait, on adapte légèrement la commande exécutée automatiquement par le logiciel.
Note
En procédant de la sorte, l’Arduino IDE aura l’impression de programmer un ATMEGA328P. Consultez plutôt ce tutoriel pour programmer directement l’Atmega328PB et obtenir les fonctionnalités additionnelles de la version PB
.
Voici la procédure pour Windows et Linux:
Avoir la console dans le dossier optiboot
:
cd C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot
Ensuite, on utilise avrdude
directement en précisant certains paramètres :
"C:\Program Files (x86)"\Arduino\hardware\tools\avr\bin\avrdude -C"C:\Program Files (x86)"\Arduino\hardware\tools\avr\etc\avrdude.conf -v -patmega328p -cstk500v1 -PCOM8 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDE:m -Ulfuse:w:0xFF:m -F -U flash:w:optiboot_atmega328.hex
Note
Pensez bien à ajuster la valeur du port COM ainsi que votre nom d’utilisateur dans la commande précédente.
Voici l’ensemble de la manipulation :
En cas d’erreur pour exécuter la commande, il se peut que les outils de l’Arduino IDE soient situés dans le dossier AppData\Local\Arduino15
au lieu de C:\Program Files (x86)
. Dans ce cas, vous pouvez utiliser cette commande à la place :
C:\Users\Alexis\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\bin\avrdude -CC:\Users\Alexis\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\etc\avrdude.conf -v -patmega328p -cstk500v1 -PCOM8 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDA:m -Ulfuse:w:0xFF:m -F -Uflash:w:optiboot_atmega328.hex
Avoir la console dans le dossier optiboot
:
cd ~/.arduino15/packages/arduino/hardware/avr/1.8.6/bootloaders/optiboot
Ensuite, on utilise avrdude
directement en précisant certains paramètres :
/root/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude -C/root/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf -v -patmega328p -cstk500v1 -P/dev/ttyUSB1 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDE:m -Ulfuse:w:0xFF:m -F -Uflash:w:optiboot_atmega328.hex
Note
Pensez bien à ajuster la valeur du port /dev/ttyUSBx
et la version de l’Arduino IDE dans la commande précédente.