🛠 Lire un bouton poussoir sur GPIO
Objectifs
Maîtriser les entrées GPIO du RP2350 : configuration en entrée, résistance de pull-up interne, anti-rebond logiciel, et réaction d'une sortie (LED GP25) à une action humaine. Vous découvrirez aussi l'erratum RP2350-E9 qui concerne les pull-down du Bank 0 sur les cartes A2 d'avant mi-2025.
Matériel
- 1 × Raspberry Pi Pico 2
- 1 × bouton poussoir
- Câbles jumper ; Pico SDK ≥ 2.0.0
- Broche utilisée : GP22 (numérique uniquement — brochage confirmé par la datasheet)
Code complet
/* bouton.c — appui sur GP22 -> LED GP25 s'allume */
#include "pico/stdlib.h"
#define BTN_PIN 22
#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);
uint pressed = 0;
while (true) {
uint now = !gpio_get(BTN_PIN); /* actif à l'état bas */
if (now != pressed) { /* anti-rebond simple */
sleep_ms(20);
pressed = !gpio_get(BTN_PIN);
gpio_put(LED_PIN, pressed);
}
sleep_ms(5);
}
}
Le bouton relie GP22 à GND ; aucune résistance externe n'est nécessaire grâce au pull-up interne.
Vérification attendue
LED éteinte au repos, allumée tant que le bouton est pressé, sans clignotement parasite lors de l'appui. Avec un terminal série (UART0 GP0/GP1) vous pouvez ajouter un printf pour compter les appuis stables.
Erreurs fréquentes
- Oublier
gpio_pull_up: l'entrée flotte et la LED change d'état aléatoirement. - Câbler le bouton entre GP22 et 3V3 sans résistance externe : court-circuit au repos si vous activez aussi un pull-down.
- Erratum RP2350-E9 (stepping A2, cartes achetées avant mi-2025) : les pull-down internes du Bank 0 peuvent fuiter (~120 µA) ; si un pull-down fiable est critique, ajoutez une résistance externe ≤ 8,2 kΩ. Corrigé en A3/A4 (annoncés le 29 juillet 2025).
- Ne pas faire d'anti-rebond : un seul appui est compté dix fois dans un compteur.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython