Skip to content

uPesy now ships to the entire European Union

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

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.

avrdude cli
avrdude cli arduino uno success

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 :

erreur bootloader arduino uno téléversement

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 programmeur ICSP . 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 carte PROGRAMMER

    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 .

paramètre téleversement arduino uno par défaut

Voici les paramètres par défaut du téléversement (qu’il ne faut pas changer à cette étape)

Note

Dans l’exemple, la carte PROGRAMMER est sur le COM8 .

Le programme ArduinoISP se trouve parmi les exemples.

arduino iscp sketch

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.

arduino isp code content

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 :

change arduino ide programmator

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.

branchement icsp bootloader arduino uno

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.

flasher bootloader arduino ide

Il suffit de cliquer sur ‘Graver la séquence d’initialisation’ pour charger le bootloader sur la carte Arduino cible

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 .

erreur upload bootloader 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 .

remettre paramètre téléversement par défaut

Tester la carte

Vous pouvez maintenant téléverser n’importe quel programme sur votre carte Arduino directement depuis l’USB !

test bootloader

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.

bootloader defaut cli

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:

bootloader windows cmd

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 :

bootloader windows cmd

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.