🛠 Bouton-poussoir et console série

Arduino Mega ADK (Rev3) · debutant · Schéma : IMG-mega-adk-debutant-2-mega-adk-bouton-console.svg — Mega ADK, bouton-poussoir entre la broche 2 et GND (pull-up interne), console série sur l'ordinateur

Objetivos

Leer un botón pulsador y registrar cada pulsación en la consola serie. Se descubren las entradas digitales, las resistencias de pull-up internas (20–50 kΩ), las interrupciones externas (pines 2, 3, 18, 19, 20, 21 en el ATmega2560) y la consola habilitada por el ATmega8U2, el chip USB-serie de la placa — un 8U2, a diferencia del Mega 2560 Rev3 que utiliza un 16U2. Un antirrebote (debounce) simple por ventana temporal completa el ejercicio.

Material

Código completo

// 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);
}

Verificación esperada

Cada pulsación imprime « Pulsación n.º 1 », « Pulsación n.º 2 », etc. Una pulsación firme solo imprime una línea; los rebotes mecánicos son filtrados por la ventana de 50 ms. Espere ~1 s después de abrir el monitor serie (auto-reset DTR) antes de juzgar que la consola está muda.

Errores frecuentes

  1. Botón cableado pin → 5 V sin resistencia externa: en INPUT_PULLUP se necesita el botón hacia GND, de lo contrario el estado nunca cambia (o simplemente está invertido).
  2. INPUT en lugar de INPUT_PULLUP sin resistencia externa: entrada flotante, mensajes parásitos en todos los sentidos.
  3. Contador compartido con la interrupción no declarado volatile: el compilador optimiza y el bucle principal nunca ve cambiar el valor.
  4. Olvido de la sección crítica (noInterrupts/interrupts) alrededor de la lectura de un unsigned long: este AVR de 8 bits lee enteros de 32 bits byte a byte, una interrupción en medio puede corromper el valor.
  5. Consola muda: verificar el cable USB (algunos son solo de carga) y la selección « Arduino Mega ADK » en el IDE.

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales