🛠 Mode power-down et réveil par watchdog (AVR C nu)
Objectifs
Optimiser la consommation de l'ATmega32u4 en AVR C nu : basculer le cœur en mode power-down (sommeil profond, horloges matérielles arrêtées) et le réveiller périodiquement par le watchdog timer configuré en mode interruption (~2,1 s). C'est la base de tout projet sur batterie. Attention spécifique Leonardo : le transceiver USB connecté à un hôte consomme en permanence ; pour mesurer un vrai courant de sommeil, débranchez le câble USB ou coupez la ligne VBUS.
Matériel
- 1 Arduino Leonardo (flashable par ICSP ou outils avr109 ; ici le code est autonome)
- Alimentation batterie 3,7-5 V ou alimentation de laboratoire avec ampèremètre
- Programmateur ICSP ou bootloader Caterina pour le dépôt du binaire
Code complet
/* Sommeil power-down + réveil watchdog ~2,1 s — ATmega32u4
* Build : avr-gcc -mmcu=atmega32u4 -Os sleep.c -o sleep.elf
* Flash : avrdude par ICSP, ou outils avr109 via Caterina. */
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
ISR(WDT_vect) {
PINB = (1 << PINB7); // bascule la LED D13 a chaque réveil
}
int main(void) {
DDRB |= (1 << DDB7); // PB7 (D13) en sortie
MCUSR &= ~(1 << WDRF); // efface la cause de reset
WDTCSR |= (1 << WDCE) | (1 << WDE); // sequence de modification
WDTCSR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1) | (1 << WDP0); // ~2,1 s, mode interruption
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sommeil le plus profond
sleep_enable;
sei;
while (1) {
sleep_cpu; // le coeur s'arrete ; le watchdog le reveille
sleep_disable; // sécurité : on ne dort qu'un cycle a la fois
sleep_enable;
}
}
Vérification attendue
La LED clignote environ toutes les 2,1 s (la bascule a lieu dans l'ISR du watchdog, puis le cœur repart dormir). Insérez un ampèremètre en série avec l'alimentation, USB débranché : le courant moyen chute drastiquement par rapport au fonctionnement normal, l'essentiel du temps étant passé en power-down. La fiche officielle ne donne pas de courant typique (à vérifier dans la datasheet Microchip de l'ATmega32u4 pour chiffrer précisément).
Erreurs fréquentes
- Mesurer le sommeil câble USB branché : le transceiver USB reste alimenté et « réveille » la mesure ; le courant de sommeil n'est observable qu'USB déconnecté (ou VBUS coupé).
- Oublier la séquence WDCE/WDE : les bits de période du watchdog ne se modifient que par la séquence autorisée en 4 cycles d'instructions ; sinon la configuration est ignorée.
- WDRF non effacé dans MCUSR : le watchdog en mode réinitialisation peut provoquer des resets en boucle au lieu d'interruptions.
- Réveiller par interruption USB ou UART parasite : en power-down, certaines lignes actives empêchent le sommeil ; débranchez capteurs et modules pendant la mesure.
- Oublier
sleep_disableaprès le réveil : sans cette sécurité, unsleep_cpuinopiné peut endormir le cœur avant la fin du traitement.
Autres tutoriels pour cette carte
- Faire clignoter la LED intégrée (broche 13)
- Bouton et console série : Serial (USB) vs Serial1 (broches 0/1)
- Lire un capteur analogique : potentiomètre et ADC 10 bits
- Clavier USB : taper du texte avec la bibliothèque Keyboard
- Souris USB : déplacer le curseur avec la bibliothèque Mouse
- Asservir un servo moteur avec un potentiomètre (PWM)
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoclavier-auto-tape.inoArduinosouris-cercle.inoArduinotelecommande-media.inoArduinobouton-clic-souris.inoArduino