Remettre en fonction un Arduino R3 devenu invisible depuis l'IDE

Motivations

Lors de l'apprentissage de l'utilisation d'un microcontrolleur Arduino R3 il peut arriver que l'Arduino ne soit plus détecté par l'ordinateur hôte. Cet article propose une méthode pour remettre le microcontrôleur dans un état opérationnel. De nombreux tutoriaux existent pour d'autres modèles mais peu de choses opérationnelles pour le R3. suite à une fausse manipulation ou à un incident de quelle nature que ce soit


Sommaire

  1. Je ne vois plus mon Arduino R3 depuis l'interface... Pas de panique

  2. Recharger le microcode

    1. Logiciels nécessaires
    2. Procédure de copie
  3. Test du caractère opérationnel de l'arduino


Téléchargements

  1. Dernière version du programme de communication directe
  2. Microcode de la puce atmega16u2

1. Je ne vois plus mon Arduino R3 depuis l'interface... Pas de panique

Il arrive parfois qu'après une fausse manipulation ou un incident difficile à tracer que l'Arduino ne soit plus visible dans l'interface de développement. Dans un certai nombre de cas il suffit de débrancher rebrancher larduino, éteindre rallumer l'interface mais parfois les solutions simples n'aboutissent pas et on peut craindre d'avoir "fait une brique" de son arduino... Pas de panique ce n'est pas sûr du tout et à moins d'avoir envoyé une surcharge de courant dans l'Arduino ou fait un court-circuit il reste (peut-être) un peu d'espoir!

Cet article traite de l'Aruino R3, pour les autres modèles on trouvera sur le net des tutoriaux détaillés sur la procédure à suivre. Pour reconnaître l'arduino R3 voir dans la figure ci-dessous les encadrés rouge : * le nom de l'appareil situé dessous est un indice décisif * la position du bouton reset est aussi un indice... bien moins fiable.

Arduino R3 identification et Leds de test

Un bon indicateur d'une situation grave mais pas désespérée est que la LED jaune au dessus du carré jaune dessiné sur l'arduino alors que les deux Leds dans le carré jaune sont éteintes. Si on appuie sur le bouton reset, cette même LED clignote puis reste allumée mais les 2 autres ne s'éclairent pas...

Dans cette situation ce qui se passe en fait est que le microcontrolleur ATMEGA16U2 qui assure la communication entre le microcontrolleur principal ATMEGA328P et le bus USB ne fonctionne plus, il ne dispose plus du microcode nécessaire à son fonctionnement normal. La solution est donc de recharger son microcode.

2 Recharger le microcode

L'opération est assez simple à effectuer même si la procédure requiert un coup de main non trivial. Nous allons examiner les logiciels nécessaires puis expliquer la procédure. Il est nécessaire d'utiliser un ordinateur companion (qui peut-être sans problème une raspberry Pi avec l'image IFÉ-ENS de Lyon si vous n'avez pas d'autre linux sous la main)

2.1 Logiciels nécessaires

L'outil de copie du microcode

Pour copier le microcode il est nécessaire de disposer du logiciel dfu-programmer qui existe dans la plupart des distributions linux mais il est souhaitable de disposer de la dernière version car ce logiciel intervenant au plus bas niveau de communication il est impératif qu'il corresponde d'une part aux propriétés du noyau linux installé, d'autr part aux propriétés de la puce de l'arduino. Afin d"éviter les désagréments d'erreurs aléatoires ou non recensées nous proposons d'utiliser la version disponible en ligne sur la forge github.

Pour cela cloner la source puis la compiler, il peut être nécessaire d'ajouter la bibliothèque de développement USB si elle n'est pas présente:

sudo apt-get install libusb-1.0-0-dev 
mkdir ArduinoRescue
cd ArduinoRescue
git clone https://github.com/dfu-programmer/dfu-programmer.git
cd dfu-programmer
./bootstrap.sh 
source dfu_programmer
./configure 
make  
sudo make install
hash
cd ..

Le logiciel dfu-programmer est maintenant installé et opération sur notre ordinateur compagnon. Il nous faut maintenant obtenir le microcode du microcontrolleur

Le microcode

Cmme pour le logiciel dfu-programmer il est souhaitable de disposer de la dernière version du microcode du microcontrolleur ATMEGA16U2. Il est disponible en ligne sur la forge github. Nous allons le télécharger :

wget https://raw.githubusercontent.com/arduino/Arduino/master/hardware/arduino/avr/firmwares/atmegaxxu2/Genuino-COMBINED-dfu-usbserial-atmega16u2-Uno-R3.hex

Il est crucial de bien cherger le fichier brut et non la page web car la copie se fait bit à bit sans tester ce qui est transféré (pas de garde-fou).

2.2 Procédure de copie

La procédure se déroule en deux étapes d'aport mise de l'arduino en mode dfu et ensuite effacement puis écriture du microcode sur l'ATMEGA16U2.

Passage de l'arduino en mode dfu

Derrière cette simple injonction se cache une manipulation qui demande un certain tour de main ou alors un peu de chance... Ne pas se décourager si on n'y parvient pas du premier coup!

La version officielle simple est de relier avec un conducteur les deux broches immédiatement à droite du bouton reset (du carré rouge sur la figure ci-dessus). Sauf qu'il semble qu'il faille "un certain" timing pour que l'Arduino veuille bien changer d'état. Après plusieurs tentatives j'y suis parvenu, après avoir branché l'Arduino via l'USB, en reliant les deux broches pendant une seconde environ après avoir cliqué sur le bouton reset...J'ai lu des blogs où le changement s'est effectué seulement en reliant les deux braches pendant une seconde après le branchement de l'USB. je n'ai pas trouvé de règle précise... Dès que l'Arduino change d'état les LED de l'encart jaune clignotent ou s'allument et la diode TX reste allumée. Dès lors l'Arduino est prêt pour recevoir son microcode.

Chargement du microcode

Si tout s'est bien passé cette dernière étape ne pose aucun problème, on efface d'abord le contenu de la mémoire du microcontrolleur puis on la charge avec le fichier téléchargé plus haut. Cette opération est réalisée par les commandes suivantes :

sudo dfu-programmer atmega16u2 erase
sudo dfu-programmer atmega16u2 flash ./Genuino-COMBINED-dfu-usbserial-atmega16u2-Uno-R3.hex  --suppress-bootloader-mem
Checking memory from 0x0 to 0x2FFF...  Empty.
0%                            100%  Programming 0x3000 bytes...
[................................]  Success
0%                            100%  Reading 0x3000 bytes...
[................................]  Success
Validating...  Success
0x3000 bytes written into 0x3000 bytes memory (100.00%).

La trace ci-dessus montre un cahrgement réussi. Quand le chargeent échoue on reçoit un message d'erreur assez explicite et la plupart du temps c'est le microcontrolleur qui n'est pas en mode dfu.

3 Test du caractère opérationnel de l'arduino

Une fois l'opération ci dessus terminée débrancher l'arduino puis le rebrancher lancer l'IDE et observer le retour du port COM prodige (/dev/ttyACM0)... L'arduino doit fonctionner de façon nominale , pour le tester sans branchement complexe choisir le menu Fichier/Exemple/Basics et activer le programme Blink La LED L clignote et toute intervention sur le code et rechargement modifie le clignotement. Ne pas oublier de recharger le code car l'arduino est un microcontrolleur qui ne permet par d'interragir directement avec lui comme cela est fait avec la Raspberry Pi ou les Edison.


Webographie

  1. Site Arduino avec les détails et les pointeurs vers les autres modèles

Commentaires