Arduino / ATmega : programmation ISP

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 :
atmega328_ISPpro_mini_ISP
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 🙂

20140204_145543

A propos Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

68 réflexions au sujet de « Arduino / ATmega : programmation ISP »

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.