En el siguiente tutorial veremos cómo conectar pulsadores en la tarjeta Pico 2 W.
Como ejemplo de aplicación controlaremos el encendido de dos ledes mediante dos pulsadores, uno activo a nivel alto y otro activo a nivel bajo.
Como decíamos más arriba, vamos a conectar dos pulsadores y dos ledes a la tarjeta Pico 2 W. Cada pulsador controla un led y para encender dicho led hay que presionar el pulsador. Sin embargo, mientras la entrada GP6 es activa a nivel alto (señal SW1), la entrada GP9 es activa a nivel bajo (señal ~SW2).
Aunque los pines GPIO de la Pico 2 W tienen una resistencia interna configurable como pull-up o pull-down, en el caso de señales activas a nivel alto no funcionan correctamente y se hace necesario conectar una resistencia externa de pull-down.
El siguiente código implementa el funcionamiento descrito anteriormente. Esto es, los ledes D1 y D2 están apagados por defecto y para encenderlos hay que pulsar SW1 y SW2.
La diferencia está en que la entrada GP6 es activa a nivel alto, debe haber 3,3V en el pin 9, mientras que la entrada GP9 es activa a nivel bajo, es decir D2 se enciende cuando hay un 0 en el pin 12.
// Dos pulsadores, SW1 activo a nivel alto y SW2 activo a nivel bajo.
// Los ledes se encienden al pulsar SW1 o SW2, pero las entradas son acivas a nivel
// alto y bajo respectivamente.
#include <stdio.h>
#include "pico/stdlib.h"
#define SW1_PIN 6 // SW1 conectado al GPIO 6 (PIN nº 9)
#define SW2_PIN 9 // SW2 conectado al GPIO 9 (PIN nº 12)
#define LED1_PIN 27 // LED1 conectado al GPIO 27 (PIN nº 32)
#define LED2_PIN 22 // LED2 conectado al GPIO 22 (PIN nº 29)
int main() {
stdio_init_all(); // Inicializa UART/USB serie
// Inicializa el pin del LED1 como salida
gpio_init(LED1_PIN);
gpio_set_dir(LED1_PIN, GPIO_OUT);
// Inicializa el pin del LED2 como salida
gpio_init(LED2_PIN);
gpio_set_dir(LED2_PIN, GPIO_OUT);
// Inicializa el pin de SW1 como entrada
gpio_init(SW1_PIN);
gpio_set_dir(SW1_PIN, GPIO_IN);
gpio_pull_down(SW1_PIN); // Activamos resistencia pull-down interna
// Inicializa el pin de SW2 como entrada
gpio_init(SW2_PIN);
gpio_set_dir(SW2_PIN, GPIO_IN);
gpio_pull_up(SW2_PIN); // Activamos resistencia pull-up interna
//printf("Pulsador en GPIO%d, LED en GPIO%d\n", SW1_PIN, LED1_PIN);
while (true) {
bool SW1_state = gpio_get(SW1_PIN); // Lee el estado de SW1
if (SW1_state == 1) {
gpio_put(LED1_PIN, 1); // Pulsador presionado → LED1 encendido
printf("Pulsador %d: ON\n", SW1_PIN);
} else {
gpio_put(LED1_PIN, 0); // En reposo → LED1 apagado
printf("Pulsador %d: OFF\n", SW1_PIN);
}
bool SW2_state = gpio_get(SW2_PIN); // Lee el estado de SW2
if (SW2_state == 0) {
gpio_put(LED2_PIN, 1); // Pulsador presionado → LED2 encendido
printf("Pulsador %d: ON\n", SW2_PIN);
} else {
gpio_put(LED2_PIN, 0); // En reposo → LED2 apagado
printf("Pulsador %d: OFF\n", SW2_PIN);
}
sleep_ms(100); // Pequeña espera (antirrebote básico)
}
return 0;
}
Mismo funcionamiento que el ejemplo anterior, pero se ha añadido un led heartbeat, para verificar que el software está corriendo en la tarjeta.
Esto es una práctica común cuando se programan microcontroladores , así de un vistazo, podemos ver si la tarjeta está viva.
El led de heartbeat puede ser cualquiera que conectemos en los pines GPIO, pero aprovechando que la Pico 2 W tiene un led integrado en placa, vamos a usar ese.
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include "hardware/gpio.h"
#include "hardware/timer.h"
// Dos pulsadores, SW1 activo a nivel alto y SW2 activo a nivel bajo.
// Los ledes se encienden al pulsar SW1 o SW2, pero las entradas son acivas a nivel
// alto y bajo respectivamente.
// se configura LED wifi como watchdog
//#define LED_WATCHDOG_PIN 0 // LED0 conectado en GPIO 0 (PIN nº 1)
#define SW1_PIN 6 // SW1 conectado al GPIO 6 (PIN nº 9)
#define SW2_PIN 9 // SW2 conectado al GPIO 9 (PIN nº 12)
#define LED1_PIN 27 // LED1 conectado al GPIO 27 (PIN nº 32)
#define LED2_PIN 22 // LED2 conectado al GPIO 22 (PIN nº 29)
/*
// Callback del watchdog LED0
bool toggle_watchdog_led(struct repeating_timer *t) {
static bool led_state = false;
gpio_put(LED_WATCHDOG_PIN, led_state);
led_state = !led_state;
return true; // Mantener el temporizador activo
}
*/
// Callback del watchdog LED (LED onboard Pico 2W)
bool toggle_watchdog_led(struct repeating_timer *t) {
static bool led_state = false;
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_state);
led_state = !led_state;
return true; // Mantener el temporizador activo
}
int main() {
stdio_init_all(); // Inicializa UART/USB serie
// Inicializa el chip CYW43 (necesario para usar el LED integrado en placa)
if (cyw43_arch_init()) {
printf("Error: no se pudo inicializar CYW43\n");
return -1;
}
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 0); // LED apagado inicialmente
// Inicializa el LED0
//gpio_init(LED_WATCHDOG_PIN);
//gpio_set_dir(LED_WATCHDOG_PIN, GPIO_OUT);
// Inicializa el pin del LED1 como salida
gpio_init(LED1_PIN);
gpio_set_dir(LED1_PIN, GPIO_OUT);
// Inicializa el pin del LED2 como salida
gpio_init(LED2_PIN);
gpio_set_dir(LED2_PIN, GPIO_OUT);
// Inicializa el pin de SW1 como entrada
gpio_init(SW1_PIN);
gpio_set_dir(SW1_PIN, GPIO_IN);
gpio_pull_down(SW1_PIN); // Activamos resistencia pull-down interna
// Inicializa el pin de SW2 como entrada
gpio_init(SW2_PIN);
gpio_set_dir(SW2_PIN, GPIO_IN);
gpio_pull_up(SW2_PIN); // Activamos resistencia pull-up interna
// Crear un temporizador que parpadee el LED cada 500 ms
struct repeating_timer timer;
add_repeating_timer_ms(500, toggle_watchdog_led, NULL, &timer);
while (true) {
bool SW1_state = gpio_get(SW1_PIN); // Lee el estado de SW1
if (SW1_state == 1) {
gpio_put(LED1_PIN, 1); // Pulsador presionado → LED1 encendido
printf("Pulsador %d: ON\n", SW1_PIN);
} else {
gpio_put(LED1_PIN, 0); // En reposo → LED1 apagado
printf("Pulsador %d: OFF\n", SW1_PIN);
}
bool SW2_state = gpio_get(SW2_PIN); // Lee el estado de SW2
if (SW2_state == 0) {
gpio_put(LED2_PIN, 1); // Pulsador presionado → LED2 encendido
printf("Pulsador %d: ON\n", SW2_PIN);
} else {
gpio_put(LED2_PIN, 0); // En reposo → LED2 apagado
printf("Pulsador %d: OFF\n", SW2_PIN);
}
tight_loop_contents(); // Mantiene eficiencia energética
sleep_ms(100); // Pequeña espera (antirrebote básico)
}
cyw43_arch_deinit();
return 0;
}
Para usar como heartbeat un led conectado en los pines GPIO, desmarcar los comentarios correspondientes y comentar la parte del código relativa al led integrado en placa.
Eso es todo por el momento.
¡Hasta la próxima!