🛠 Lire un bouton poussoir et gérer le rebond
Objetivos
Aprender a leer una entrada digital en la Pico: configurar un GPIO como entrada con pull-up interno, detectar la pulsación de un botón y controlar el LED integrado. También descubrirás el rebote mecánico (bounce) y su eliminación por software mediante temporización, indispensable para no contar diez pulsaciones por una sola.
Material
- 1 × Raspberry Pi Pico
- 1 × botón pulsador
- Cables de protoboard (no se necesita resistencia externa: el pull-up es interno)
- Conexión: una pata del botón a GP2, la otra a GND; el LED integrado está en GP25
Código completo
// bouton.c — GP2 en entrée pull-up, LED GP25, anti-rebond 50 ms
#include "pico/stdlib.h"
#define BTN_PIN 2
#define LED_PIN 25
int main(void) {
gpio_init(BTN_PIN);
gpio_set_dir(BTN_PIN, GPIO_IN);
gpio_pull_up(BTN_PIN); // pull-up interne : repos = 1
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
uint32_t last_change = 0;
while (true) {
bool pressed = !gpio_get(BTN_PIN); // actif à l'état bas
if (pressed) {
if (time_us_64 - last_change > 50000) {
gpio_put(LED_PIN, !gpio_get(LED_PIN)); // toggle
last_change = time_us_64;
}
}
sleep_ms(1);
}
}
Verificación esperada
En reposo, el LED mantiene su estado. Cada pulsación firme del botón cambia el estado del LED una sola vez, sin parpadeos ni doble detección. Al desconectar la pata GND del botón, la entrada se mantiene en 1 gracias al pull-up: el LED deja de moverse, lo que demuestra la función del pull-up interno.
Errores frecuentes
- Olvidar
gpio_pull_up: la entrada queda flotante y el LED parpadea aleatoriamente. - Lógica invertida: con pull-up, la pulsación da 0, no 1.
- Sin antirrebote: una pulsación se cuenta varias veces (el contacto vibra ~1 ms).
- Botón conectado a 3V3 sin resistencia: aquí usamos GND + pull-up interno, que es el método seguro y que ahorra componentes.
- Confundir el número de pin físico con el número GPIO: en el Pico, siempre se programa GPx, no la posición en el conector.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython