🛠 Lire un bouton poussoir et gérer le rebond
Objectifs
Apprendre à lire une entrée numérique sur la Pico : configurer une GPIO en entrée avec pull-up interne, détecter l'appui sur un bouton et commander la LED embarquée. Tu découvriras aussi le rebond mécanique (bounce) et sa suppression logicielle par temporisation, indispensable pour ne pas compter dix appuis pour un seul.
Matériel
- 1 × Raspberry Pi Pico
- 1 × bouton poussoir
- Câbles de breadboard (aucune résistance externe nécessaire : le pull-up est interne)
- Brochage : une patte du bouton sur GP2, l'autre sur GND ; la LED embarquée est sur GP25
Code complet
// 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);
}
}
Vérification attendue
Au repos, la LED garde son état. Chaque appui franc sur le bouton bascule la LED une seule fois, sans scintillement ni double détection. En débranchant la patte GND du bouton, l'entrée reste tirée à 1 par le pull-up : la LED ne bouge plus, ce qui prouve le rôle du pull-up interne.
Erreurs fréquentes
- Oubli de
gpio_pull_up: l'entrée flotte, la LED clignote aléatoirement. - Logique inversée : avec pull-up, l'appui donne 0, pas 1.
- Pas d'anti-rebond : un appui est compté plusieurs fois (le contact vibre ~1 ms).
- Bouton câblé vers 3V3 sans résistance : ici on utilise GND + pull-up interne, c'est la méthode sûre et économe en composants.
- Confondre numéro de broche physique et numéro GPIO : sur le Pico, on code toujours GPx, pas le rang du connecteur.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython