[Troubleshooting] Problèmes de téléversement avec une Uno

Les cartes Arduino, les platines

[Troubleshooting] Problèmes de téléversement avec une Uno

Message non lude Laetitia » Lun 25 Avr 2016 15:49

Parmi les bugs récurrents avec les Arduino/Genuino Uno : les problèmes de téléversement. Ce guide vous indique les origines de ces bugs et comment les résoudre.

Suivez la première étape, à la fin de celle-ci testez s'il est à nouveau possible de charger vos sketchs. Le cas échéant, passez à l'étape suivante et répétez.

Note : Ce guide a été réalisé pour des cartes ayant déjà fonctionné, et a été testé sur un Arduino Uno R3 et un Genuino Uno R3, avec l'IDE Arduino 1.6.8 sous Windows 7. Les manipulations peuvent différer pour d'autres configurations matérielles et/ou logicielles.


    - Origine #1 : l'ATmega328P -


Explication : il se peut que l'ATmega328P soit "coincé" dans un sketch qui lui empêche d'écouter ce qui arrive sur la liaison série, soit parce que ses RX/TX sont mal configurés, soit parce qu'ils sont sollicités sans cesse.

Solution : il est possible de forcer l'ATmega328P à recevoir un nouveau sketch, il suffit de le réinitialiser juste au moment du téléversement. Pour ce faire, appuyez sur le bouton RESET de votre Arduino/Genuino Uno, puis cliquez sur Upload dans l'IDE. Relâchez le bouton RESET lorsque vous voyez dans le bas de la fenêtre le statut passer de Compilation du croquis à Téléversement.


Autre explication : il est grillé !

Autre solution : vous pouvez remplacer l'ATmega328P par un neuf, soit déjà muni de son bootloader, soit sorti d'usine mais il faudra penser à graver le bootloader.


    - Origine #2 : l'IDE Arduino -


Explication : depuis quelques temps l'ajout de nouvelles cartes programmables dans l'IDE se fait via le Gestionnaire de cartes accessible depuis le menu Outils > Type de carte > Gestionnaire de cartes. Sur les dernières versions de l'IDE et des packages il y a eu quelques bugs, entraînant l'indisponibilité de librairies pourtant bien installées, des problèmes de compilation, d'upload, etc.

Solution : il faut repasser sur une ancienne version du package de cartes, qui ne soit pas buguée. Pour ce faire, allez dans le Gestionnaire de cartes comme indiqué plus haut, puis cliquez sur Arduino AVR Boards by Arduino : vous trouverez le numéro de version de votre package à côté de son nom, et vous pourrez repasser sur une version antérieure en la sélectionnant dans le menu déroulant.

version_package.png
version_package.png (39.37 Kio) Vu 1000 fois

Testée dans nos locaux, la version 1.6.9 semble être la dernière "stable" en date de ce tutoriel. Si ce downgrade ne suffit pas à résoudre le problème, on peut également envisager de repasser sur une version antérieure de l'IDE Arduino, auquel cas nous vous recommandons la version 1.6.5 (voir ce post expliquant les incompatibilités entre versions d'IDE et versions des packages).


    - Origine #3 : l'ATmega16U2 -


Explication : l'ATmega16U2 fait office de convertisseur USB-série pour l'Arduino, c'est donc par lui que transite le sketch à destination de l'ATmega328P. Il est possible qu'il flanche, entre autres à cause d'une alimentation trop basse qui cause une corruption de la mémoire (voir Application Notes p.19 et p.236)

Solution : reprogrammer le fautif. Il vous faut pour cela un outil permettant de réinjecter le firmware d'origine (bootloader + convertisseur USB-série) dans l'ATmega16U2.


      Solution 1 : DFU programming

"DFU" = Device Firmware Update, mode d'exploitation de périphérique USB permettant de mettre à jour le micrologiciel (firmware) de celui-ci.

  • Téléchargez l'outil FLIP d'Atmel et installez-le.
  • Branchez votre Arduino à votre ordinateur avec un câble USB (comme d'habitude quand vous voulez le programmer)
  • Redémarrez l'ATmega16U2 en reliant brièvement les pins RESET et GND du connecteur ICSP associé, avec un jumper ou un câble F/F s'il est soudé, sinon avec un câble M/M ou un morceau de fil :

    rst_16u2.png
    rst_16u2.png (228 Kio) Vu 997 fois

    Dans l'IDE Arduino, regardez la liste des ports série disponibles. Celui de votre carte ne doit plus y figurer.
  • Ouvrez le Gestionnaire de Périphériques dans votre Panneau de Configuration, vous devriez avoir un Périphérique inconnu dans la liste qui s'affiche, faites un clic droit et sélectionnez Mettre à jour le pilote :

    maj_driver_dfu.png
    maj_driver_dfu.png (16.89 Kio) Vu 997 fois

  • Cliquez sur Rechercher un pilote sur mon ordinateur et cherchez l'emplacement dans le dossier d'installation de FLIP :

    emplacement_driver.png
    emplacement_driver.png (5.13 Kio) Vu 997 fois

    Ignorez l'avertissement de sécurité s'il y en a un. Vous devriez maintenant avoir ATmega16U2 dans la liste de vos périphériques, dans la catégorie Atmel USB Devices.
  • Ouvrez FLIP, cliquez sur l'icône en haut à gauche Select a Target Device et sélectionnez ATmega16U2 :

    select_target_device.png
    select_target_device.png (61.44 Kio) Vu 997 fois
  • Récupérez la dernière version du firmware de l'ATmega16U2 sur Github ou allez la récupérer dans votre dossier d'installation Arduino (pas votre répertoire \librairies), il faut faire un peu de spéléo pour la trouver, attention à bien choisir la version correspondant à votre carte ! Un mauvais firmware peut provoquer un dysfonctionnement de votre carte, voire une panne.

    Chemin d'accès : ...\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial puis choisir, suivant la carte utilisée : Arduino-usbserial-atmega16u2-Uno-Rev3 ou Genuino-usbserial-atmega16u2-Uno-R3
  • Cliquez ensuite sur l'icône Select a Communication Medium et sélectionnez USB.

    select_communication_medium.png
    select_communication_medium.png (5.04 Kio) Vu 997 fois

    Dans la fenêtre suivante USB Port Connection, cliquez sur Open. Le logiciel FLIP peut désormais dialoguer avec l'ATmega16U2 !
  • Dans le menu File, sélectionnez Load HEX File puis indiquez le chemin de celui que vous venez de récupérer :

    load_hex_file.png
    load_hex_file.png (14.15 Kio) Vu 997 fois

  • Après avoir vérifié la version de votre firmware, cochez les cases Erase, Program et Verify dans le panneau Operations Flow puis cliquez sur Run.

    ready.png
    ready.png (27.25 Kio) Vu 997 fois

    Si tout s'est bien passé, les ronds à côté des étapes effectuées doivent être verts après exécution, vous pouvez également lire Verify PASS dans le bandeau en bas de la fenêtre.
Débranchez puis rebranchez votre Arduino, le port COM soit à nouveau s'énumérer en tant qu'Arduino/Genuino Uno.

Sources arduino.cc et virtuabotix.com



Note : il est fortement conseillé de parcourir le manuel de l'AVR Dragon ainsi que celui d'Atmel Studio avant de s'en servir. Cette manipulation peut rendre inutilisable votre Arduino si vous ne la faites pas correctement.

Reliez le connecteur ICSP de l'AVR Dragon à celui de l'ATmega16U2 : il s'agit de celui en haut à gauche de l'Arduino, parfois il n'est pas soudé.

cablage.jpg
cablage.jpg (91.23 Kio) Vu 1000 fois

Note : attention à l'orientation du câble ! Le câble rouge correspond à la pin 1 de l'ICSP, indiquée sur l'Arduino par un point blanc sur le PCB. Pas de marquage en revanche sur l'AVR Dragon, il s'agit de la pin en bas à gauche du connecteur.

détrompeur.jpg
détrompeur.jpg (111.28 Kio) Vu 1000 fois

En rouge, l'ATmega16U2 ; en vert, la pin 1 de l'ICSP et son détrompeur.

Ouvrez Atmel Studio puis le programmateur en allant dans Tools > Device Programming, et suivez la procédure suivante :

  • Une fois la fenêtre ouverte, rentrez la configuration suivante puis cliquez sur Apply

    • Tool : AVR Dragon
    • Device : ATmega16U2
    • Interface : ISP
  • Paramétrez la vitesse de l'horloge SPI : elle doit être de 250 kHz ou moins, puis cliquez sur Set.

    ISP_clock.png
    ISP_clock.png (4.31 Kio) Vu 998 fois

  • Avant toute chose, cliquez sur Read en dessous de Device signature, vous devez obtenir 0x1E9489.
    Note : Si la réponse n'est pas conforme, il est probable que l'ATmega16U2 soit grillé !

    device_signature.png
    device_signature.png (2.49 Kio) Vu 998 fois

  • Dans l'onglet Fuses, vérifiez tout d'abord que les valeurs de vos fusibles sont correctes. Si elles sont différentes de celles ci-dessous, modifiez-les pour qu'elles soient conformes, cochez la case Verify after programming puis cliquez sur Program.

    fuses.png
    fuses.png (2.54 Kio) Vu 998 fois

  • Dans l'onglet Memories, sélectionnez le fichier à programmer dans la Flash du microcontrôleur. Celui-ci est trouvable sur Github, ou se situe dans le dossier d'installation du programme Arduino (pas votre répertoire \librairies), il faut faire un peu de spéléo pour le trouver, attention à bien choisir la version correspondant à votre carte !

    Chemin d'accès : ...\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial puis choisir, suivant la carte utilisée : Arduino-usbserial-atmega16u2-Uno-Rev3 ou Genuino-usbserial-atmega16u2-Uno-R3

    hex.png
    hex.png (6.64 Kio) Vu 998 fois

    Cochez les cases Erase device before programming et Verify Flash after programming puis cliquez sur Program.

    - Origine #4 : le matériel -


Explication : si vous avez suivi ce guide jusqu'ici, que le port COM correspondant à votre Arduino est bien énuméré, que vous arrivez à reprogrammer l'ATmega16U2 mais que vos sketchs ne passent toujours pas... c'est vraisemblablement dû à un problème entre les deux microcontrôleurs !

Solution : pas de solution miracle, puisqu'il faut traquer l'origine du bug à la main. Si vous avez un multimètre ou mieux, un oscilloscope, à l'aide du schéma et du typon de la carte vous pouvez remonter le long des pistes permettant à l'ATmega16U2 de communiquer avec l'ATmega328P, voir à quel endroit le signal se "perd", et tenter de remplacer le composant défectueux. Souvent il s'agit du réseau de résistances situé entre les RX/TX de l'ATmega16U2 et respectivement, les TX/RX de l'ATmega328P.
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Yahoo [Bot] et 1 invité

cron