Aujourd’hui on va voir comment programmer une puce ATmel qui ne dispose pas de connexion USB intégrée, en utilisant un Arduino qui lui, a un USB. Cette méthode fonctionne (à ma connaissance) avec tous les micro-processeurs de la famille ATmega/ATtiny qui disposent du SPI, ainsi que les différents Arduinos.
Pourquoi faire ?
Dans ma conception des choses, un Arduino est un élément de prototypage, exactement au même titre qu’une breadboard. Il sert à simplifier le développement. Une fois cette étape effectuée, on bascule la partie électronique de l’Arduino qui nous intéresse sur un circuit dédié, et l’Arduino peut resservir au prototype suivant. Et ainsi de suite. J’y vois plusieurs avantages :
– C’est économique : la puce ATmega328 qui compose la plupart des Arduinos coute une fraction de l’Arduino,
– c’est relativement facile et rapide une fois compris la méthode,
– ça permet d’apprendre énormément sur l’électronique en général.
On va voir en détail comment programmer un ATmega328P-PU (sur son oscillateur interne pour réduire le nombre de composants) et un Arduino Pro Mini 3.3v 8MHz. Cette méthode est reproductible avec n’importe quel chip Atmel qui dispose du SPI (ATtiny84 par exemple).
Composants nécessaires :
– un Arduino (Uno dans notre exemple)
– une puce ATmega / ATiny / un Arduino Pro Mini
– une breadboard
– du câble de prototypage
- Etape 1 : Préparer la partie logicielle
Pour la partie logicielle, vous aurez besoin :
– de l’IDE Arduino (1.0.5 fonctionne très bien)
– du bootloader correspondant au chip que vous voulez programmer (pas nécessaire pour un Arduino pro mini, ou un ATmega déja bootloadé)
– d’un sketch arduino un peu spécial pour utiliser l’Arduino comme un programmeur.
Le bootloader
Qu’est-ce que le bootloader ?
Le bootloader est un genre de BIOS pour microcontrôleur. Il gère les paramètres bas-niveau de la puce, comme sa fréquence, son voltage, etc. Chaque microcontrôleur a sa propre version du bootloader : le bootloader d’un ATmega8 ne sera pas compatible avec un ATmega328, par exemple.
Donc, quand vous voudrez programmer une puce, commencez par vous assurer d’avoir le bootloader requis, et l’ajuster selon vos besoins.
Cette fois, les bootloaders que nous allons utiliser font partie de l’Arduino IDE. Nous avons juste à ajouter une nouvelle entrée à la liste existante, pour notre ATmega328P-PU 3.3v 8MHz. D’autres types de puces peuvent nécessiter quelques étapes supplémentaires, mais nous verrons cela dans un prochain article.
Ouvrez le fichier boards.txt situé dans le dossier %ARDUINO PROGRAM%\hardware\arduino\ avec un éditeur texte, et rajoutez cette entrée au début ou à la fin du fichier :
############################################################## atmega328_8.name=ATmega328 (3.3v, 8MHz) atmega328_8.upload.protocol=arduino atmega328_8.upload.maximum_size=32256 atmega328_8.upload.speed=38400 atmega328_8.bootloader.low_fuses=0xE2 atmega328_8.bootloader.high_fuses=0xde atmega328_8.bootloader.extended_fuses=0x05 atmega328_8.bootloader.path=optiboot atmega328_8.bootloader.file=optiboot_atmega328.hex atmega328_8.bootloader.unlock_bits=0x3F atmega328_8.bootloader.lock_bits=0x0F atmega328_8.build.mcu=atmega328p atmega328_8.build.f_cpu=8000000L atmega328_8.build.core=arduino atmega328_8.build.variant=standard
Après le redémarrage de l’IDE Arduino, vous devriez voir votre nouvelle « board » dans la liste : ATmega328 (3.3v, 8MHz)
L’Arduino Pro Mini est quant à lui déjà dans la liste : Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
Le sketch Arduino
Notre Arduino a besoin d’un sketch spécial pour être capable d’agir comme un programmeur. Cependant, le sketch ArduinoISP livré avec l’Arduino IDE semble ne pas fonctionner. Il en existe un autre, meilleur, et qui fonctionne : mega-isp
Téléchargez ce sketch, et uploadez le dans votre Arduino de la manière habituelle.
La partie logicielle est maintenant prête.
- Etape 2 : les cablages
Il n’y a vraiment rien de compliqué ici, on se contente de relier l’Arduino au microcontrôleur cible via la connexion SPI :
Programmeur Arduino | ATmega328P | Arduino Pro Mini |
10 | PC6 (RESET) | RESET |
11 (MOSI) | PB3 (MOSI) | 11 (MOSI) |
12 (MISO) | PB4 (MISO) | 12 (MISO) |
13 (SCK) | PB5 (SCK) | 13 (SCK) |
Ce qui devrait vous donner ce résultat :
Vous devriez choisir le bon voltage d’entrée pour votre puce : 3-5V pour un ATmega328P-PU, 3-12V pour l’Arduino Pro Mini 3.3v). La masse (GND) doit être commune.
Dans le sketch ArduinoISP, vous pouvez remarquer que quelques composants peuvent être ajoutés au circuit pour faire du débogage, mais ils ne sont pas nécessaires.
Votre branchement est prêt, passons à la dernière partie.
- Etape 3 : Programmer le microcontrôleur
Maintenant que le logiciel et le matériel sont prêts, branchez votre Arduino programmeur dans l’ordinateur, et lancez l’IDE Arduino. Vous devriez voir votre Arduino apparaitre dans la liste des ports COM comme d’habitude. Si ce n’est pas le cas, débranchez l’Arduino, quittez toutes les fenêtre IDE ouvertes, rebranchez l’Arduino, et redémarrez l’IDE.
Vous devez maintenant choisir le bon microcontrôleur et le bon programmeur dans le menu outils. Donc, si vous voulez programmer un ATmega328, choisissez notre nouveau ATmega328 (3.3v, 8MHz), et si vous voulez programmer un Arduino Pro Mini, choisissez Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 (ou la version 5v si vous utilisez un Pro Mini 5v, bien sûr…)
Ensuite, dans le menu programmateur, choisissez Arduino as ISP.
Maintenant, vous pouvez uploader le bootloader : cliquez simplement sur le bouton « graver la séquence d’initialisation » dans le menu Outils. Après quelques secondes d’activité sur l’Arduino, l’IDE devrait vous afficher un joli :
avrdude: verifying ... avrdude: 1 bytes of lock verified avrdude: Send: Q [51] [20] avrdude: Recv: . [14] avrdude: Recv: . [10] avrdude done. Thank you.
C’est terminé pour le bootloader.
Maintenant, vous pouvez uploader votre sketch de la manière habituelle, en utilisant le bouton « Téléverser avec un programmateur » présent dans le menu Fichiers. Si vous tentez d’utiliser le bouton « téléverser » habituel, vous obtiendriez une erreur de type « not in sync: resp=0×00«
Si tout s’est bien passé, vous devriez obtenir :
avrdude: verifying ... avrdude: 1108 bytes of flash verified avrdude: Send: Q [51] [20] avrdude: Recv: . [14] avrdude: Recv: . [10] avrdude done. Thank you.
Félicitations, c’est terminé, et vous êtes maintenant capable de construire vos propres clones d’Arduino sur des perfboard, des breadboards, et créer vos propres circuits…
Pour ma part, j’ai même créé un shield arduino sur un bout de perfboard. Plus besoin de passer par l’étape câblage à chaque nouvelle programmation 🙂
68 réflexions au sujet de « Arduino / ATmega : programmation ISP »