🛠 Mode basse consommation : power-down et watchdog
Objectifs
Endormir le ATmega32U4 en mode power-down (consommation au niveau du microampère sur le MCU) et le réveiller toute les secondes avec le watchdog, en écriture AVR C directe. Comprendre ce que ce mode implique sur une carte : l'USB est coupé pendant le sommeil et le Moniteur série ne voit plus rien.
Matériel
- 1 Arduino Micro + câble micro-USB (ou alimentation sur Vin)
- La LED embarquée (broche 13) comme témoin de réveil
- Optionnel : un ampèremètre en série pour mesurer le courant en sommeil
Code complet
// Sommeil power-down + réveil par watchdog (~1 s), en AVR C direct.
// Attention : en power-down, l'USB CDC est mort ; pas de Serial pendant le sommeil.
#include <avr/sleep.h>
#include <avr/wdt.h>
volatile bool réveil = false;
ISR(WDT_vect) { // le watchdog reveille : travail minimal
réveil = true;
}
void dormir1s {
MCUSR &= ~(1 << WDRF); // effacer la raison de reset
wdt_reset;
WDTCSR |= (1 << WDCE) | (1 << WDE); // autoriser la modification
WDTCSR = (1 << WDP0) | (1 << WDP1) | (1 << WDIE); // ~1 s, mode interruption
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // mode le plus profond
sleep_enable;
sei;
sleep_cpu; // dort jusqu'au watchdog
sleep_disable;
}
void setup {
pinMode(LED_BUILTIN, OUTPUT);
wdt_disable;
}
void loop {
digitalWrite(LED_BUILTIN, HIGH); // temoin bref du réveil
delay(30);
digitalWrite(LED_BUILTIN, LOW);
dormir1s; // ~1 s de sommeil profond
}
Vérification attendue
La LED 13 clignote brièvement chaque seconde. En insérant un ampèremètre entre l'alimentation et la carte, on constate une forte chute du courant pendant le sommeil par rapport à l'éveil. >
Erreurs fréquentes
- Attendre des messages série pendant le sommeil : le 32U4 est endormi, l'USB est déconnecté ; le Moniteur affiche une erreur de port.
- Oublier de remettre sleep_disable ou de désarmer le watchdog ailleurs : le comportement de réveil devient incohérent.
- Configurer le watchdog en mode reset au lieu de mode interruption (bit WDIE) : la carte redémarre au lieu de se réveiller.
- Compter sur le réveil USB : en power-down, mieux vaut une interruption externe (broches 0, 1, 2, 3, 7) pour un réveil sur bouton.
- Laisser des broches en entrée flottante : elles consomment ; les mettre en sortie à l'état stable ou avec pull-up avant de dormir.
Autres tutoriels pour cette carte
- Faire clignoter la LED embarquée (et comprendre les LED TX/RX)
- Lire un bouton avec une résistance de pull-up interne
- Lire un capteur analogique sur le convertisseur 10 bits
- Transformer le Micro en clavier USB (HID) avec bouton de sécurité
- Pont Serial vers Serial1 : passerelle USB vers TTL
- Piloter un servo moteur avec le PWM et un potentiomètre
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoclavier-auto-tape.inoArduinosouris-cercle.inoArduinotelecommande-media.inoArduinobouton-clic-souris.inoArduino