🛠 Bouton-poussoir et console série
Objectifs
Lire un bouton-poussoir et rendre compte de chaque appui sur la console série. On découvre les entrées numériques, les résistances de pull-up internes (20–50 kΩ), les interruptions externes (broches 2, 3, 18, 19, 20, 21 sur l'ATmega2560) et la console rendue possible par l'ATmega8U2, la puce USB-série de la carte — une 8U2, contrairement au Mega 2560 Rev3 qui utilise une 16U2. Un anti-rebond (debounce) simple par fenêtre temporelle complète l'exercice.
Matériel
- 1 × Arduino Mega ADK
- 1 × bouton-poussoir
- Câblage : une patte du bouton sur la broche 2, l'autre patte sur GND. Aucune résistance externe : on active le pull-up interne (INPUT_PULLUP), un appui lit donc LOW.
- La broche 2 est choisie car elle supporte une interruption externe (utile pour la suite) ; évitez absolument la broche 7 (RST du MAX3421E).
- Câble USB type B vers l'ordinateur.
Code complet
// mega-adk-bouton-console.ino — Board: "Arduino Mega ADK"
const byte BOUTON = 2;
volatile unsigned long nbAppuis = 0;
unsigned long dernierMs = 0;
void onAppui {
unsigned long now = millis;
if (now - dernierMs > 50) { // anti-rebond 50 ms
dernierMs = now;
nbAppuis++;
}
}
void setup {
Serial.begin(9600);
pinMode(BOUTON, INPUT_PULLUP); // pull-up interne 20-50 kΩ
attachInterrupt(digitalPinToInterrupt(BOUTON), onAppui, FALLING);
Serial.println(F("Prêt : appuyez sur le bouton broche 2"));
}
void loop {
static unsigned long lastReported = 0;
noInterrupts;
unsigned long n = nbAppuis; // lecture atomique du compteur 32 bits
interrupts;
if (n != lastReported) {
lastReported = n;
Serial.print(F("Appui n°"));
Serial.println(n);
}
delay(5);
}
Vérification attendue
Chaque appui imprime « Appui n°1 », « Appui n°2 », etc. Un appui franc n'imprime qu'une seule ligne ; les rebonds mécaniques sont filtrés par la fenêtre de 50 ms. Attendez ~1 s après l'ouverture du moniteur série (auto-reset DTR) avant de juger que la console est muette.
Erreurs fréquentes
- Bouton câblé broche → 5 V sans résistance externe : en INPUT_PULLUP il faut bouton vers GND, sinon l'état ne change jamais (ou est simplement inversé).
- INPUT au lieu de INPUT_PULLUP sans résistance externe : entrée flottante, messages parasites en tous sens.
- Compteur partagé avec l'interruption non déclaré volatile : le compilateur optimise et la boucle principale ne voit jamais la valeur changer.
- Oubli de la section critique (noInterrupts/interrupts) autour de la lecture d'un unsigned long : ce AVR 8 bits lit les entiers 32 bits octet par octet, une interruption au milieu peut corrompre la valeur.
- Console muette : vérifier le câble USB (certains sont charge-only) et le choix « Arduino Mega ADK » dans l'IDE.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino