🛠 Bouton-poussoir et console série
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
- 1 × Arduino Mega ADK
- 1 × botón pulsador
- Cableado: una pata del botón al pin 2, la otra pata a GND. Ninguna resistencia externa: se activa el pull-up interno (INPUT_PULLUP), por lo que una pulsación lee LOW.
- Se elige el pin 2 porque soporta una interrupción externa (útil para lo siguiente); evite absolutamente el pin 7 (RST del MAX3421E).
- Cable USB tipo B al ordenador.
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
- 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).
- INPUT en lugar de INPUT_PULLUP sin resistencia externa: entrada flotante, mensajes parásitos en todos los sentidos.
- Contador compartido con la interrupción no declarado volatile: el compilador optimiza y el bucle principal nunca ve cambiar el valor.
- 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.
- 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
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino