🛠 Convertir la Duemilanove en programmateur AVR (ArduinoISP) pour graver des puces nues
Objectifs
La Duemilanove possède un connecteur ICSP 2×3 et l'ATmega168/328 parle le même langage que n'importe quel AVR : avec l'exemple ArduinoISP du core, la carte devient programmateur AVR-ISP série. Vous allez graver un bootloader sur une ATmega328P nue pour la transformer en clone d'Uno/Duemilanove autonome — le grand classique de la production de cartes maison, documenté par le tutoriel officiel « Programmer ».
Matériel
- 1 Arduino Duemilanove (le programmateur)
- 1 ATmega328P (ou 168) nue + support/DIP socket sur plaque d'essai
- 1 quartz 16 MHz + 2 céramiques 22 pF (ou utiliser l'oscillateur interne 8 MHz, en adaptant les fusibles)
- 1 résistance 10 kΩ sur RESET, alim 5 V de la Duemilanove (la cible consomme peu au repos ; attention au polyfuse 500 mA de la carte)
- 6 fils + câble USB ; éventuellement une LED sur la broche 13 pour suivre l'activité
Code complet
1) Charger l'exemple : Fichier > Exemples > 11.ArduinoISP > ArduinoISP
(sur les vieux IDE : Examples > ArduinoISP). Televerser sur la
Duemilanove avec le bon processeur (328 : 57600 / 168 : 19200).
2) Cables cible (Duemilanove -> ATmega nu, boitier DIP-28) :
MOSI = broche 11 -> broche 17 (PC4)
MISO = broche 12 -> broche 18 (PC5)
SCK = broche 13 -> broche 19 (PC6)
RESET= broche 10 -> broche 1 (avec pull-up 10k vers VCC)
VCC = 5V -> broches 7 et 21 ; GND -> broches 8 et 22
3) IDE : Outils > Programmateur > "Arduino as ISP" (le vieux nom
"Arduino as ISP (ATmega328)" selon les versions).
4) Graver les fusibles puis le bootloader :
Outils > Graver les fusibles (optionnel, cf. valeurs ci-dessous)
Outils > Graver la sequenceur de démarrage (bootloader "Arduino on a Breadboard")
puis televerser un Blink en choisissant "Arduino Duemilanove or
Diecimila / ATmega328" comme carte et "Arduino as ISP" si besoin.
Valeurs de fusibles officielles (ArduinoCore-avr boards.txt) :
ATmega328 : low=0xFF high=0xDA extended=0xFD (lock bits 0x0F)
ATmega168 : low=0xFF high=0xDD extended=0xF8
Ligne de commande equivalente :
avrdude -c arduino -p m328p -P COM7 -b 19200 -U lfuse:r:-:h -U hfuse:r:-:h
Vérification attendue
« Graver les fusibles » se termine sans erreur « not responding » ; la lecture des fusibles renvoie low=0xFF, high=0xDA, extended=0xFD pour une 328. Après gravure du bootloader, un Blink téléversé (carte Duemilanove/ATmega328) fait clignoter la LED de la cible alimentée de façon autonome — la puce nue est devenue une carte à part entière.
Erreurs fréquentes
- Oublier de changer Outils > Programmateur : l'IDE reste sur « Programmer par défaut » et parle au bootloader de la Duemilanove au lieu de l'ISP — message « Expected signature ».
- Mauvais numéro de broche pour le RESET cible : dans ArduinoISP, c'est la broche 10 de l'Arduino programmateur qui pilote le RESET de la cible (et elle sert aussi de SS pour éviter le mode esclave SPI).
- Quartz absent sans le dire aux fusibles : avec les fusibles « full crystal » et pas de quartz, la puce ne démarre pas ; pour l'oscillateur interne 8 MHz, fusibles dédiés (low=0xE2 sur 328) — sinon garder le quartz 16 MHz.
- Alimenter la cible par une autre source en même temps que le 5 V du programmateur : conflit d'alimentations classique qui rend la programmation aléatoire.
- Inverser MISO/MOSI : signature illisible (0x00 ou 0xFFFFFF) ; vérifier les broches 17/18 du DIP-28.
- Graver des fusibles qui coupent la broche RESET ou le SPI : la puce devient inaccessible par ISP — ne pas toucher aux fusibles de sécurité sans filet.
- Confondre les débits : le programmateur ArduinoISP tourne à 19200 bauds côté avrdude (
-b 19200) même si le bootloader de la Duemilanove, lui, est à 57600 pour une 328.
Autres tutoriels pour cette carte
- Faire clignoter la LED 13 d'une Duemilanove (et choisir le bon ATmega)
- Bouton poussoir et moniteur série sur la Duemilanove (avec ses 0,5 s de silence)
- Potentiomètre et variation LED : l'ADC 10 bits et le PWM 8 bits version AVR
- Ajouter un deuxième port série avec SoftwareSerial (GPS sur broches 10/11)
- Régler la référence de mesure avec AREF et analogReference
- Persister une calibration dans l'EEPROM de l'ATmega (512 octets ou 1 Ko)
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduinoservo-balayage.inoArduinobuzzer-melodie.inoArduino