Lección Teach
STM32 Mbed CodeIDE (3/8): botones, pull-ups y antirrebote
El alumnado lee botones activos en bajo con DigitalIn y PullUp de Mbed, prueba el antirrebote y conecta la evidencia del botón con la salida LED real.
¿Primera vez que activas Teach? Puedes realizar una sesión de clase sin costo. El alumnado entra con un código de clase.
¿Primera vez en LabsLand? Crea tu cuenta de docente
Resultados de aprendizaje
Leer un pulsador con
DigitalInde Mbed.Verificar si el botón se comporta como activo en bajo en la vista actual del laboratorio.
Usar una comprobación simple de antirrebote confirmando después de una espera antes de aceptar una pulsación.
Vista previa de la actividad del estudiante
Contenido de la actividad
Solo vista previa. En una sesión de clase, los estudiantes pueden completar respuestas y entregar su trabajo al docente.
Leer antes de reaccionar
10 min
Las entradas convierten un patrón fijo de luces en un controlador que responde a una persona, interruptor o sensor. Primero comprobarás qué lee el botón cuando está suelto y pulsado, y después añadirás una comprobación antirrebote sencilla para que el programa reaccione a una pulsación real en vez de a un contacto ruidoso.
La guía de CodeIDE enumera PC_5, PC_6 y PC_10 entre los pines de botón/sensor disponibles en el laboratorio STM32 WB55RG. Esta lección usa primero PC_5 y te enseña a verificar el valor pulsado antes de construir lógica alrededor de él.
Muchos circuitos de botón con pull-up son activos en bajo: el nivel eléctrico pulsado es menor que el nivel suelto. Aun así, debes medir el cableado del laboratorio antes de introducir cualquiera de los valores en la lógica.
DigitalIn button(PC_5, PullUp);
int raw = button.read();
DigitalIn es el objeto de entrada de Mbed para leer un pin. PullUp pide a Mbed que use la resistencia pull-up interna del microcontrolador, de modo que el pin tenga un valor definido cuando el botón está suelto. button.read() devuelve el valor 0/1 actual en el momento en que tu código lo llama.
La interfaz del laboratorio remoto tiene controles de botón redondos. En esta lección, usa B1 para PC_5.
Una comprobación antirrebote sencilla usa dos lecturas
¿Qué valor debe convertirse después en pressed_value en el programa de secuencia?
Medir el valor del botón
20 min
Planifica tres compilaciones y unos 25 minutos de laboratorio activo: prueba, secuencia y un cambio de retardo de secuencia. Si hay cola, prepara los dos campos de observación y lee los TODO 1-2 antes de iniciar la sesión.
Abre el laboratorio STM32 Mbed CodeIDE.
Abre
main.cpp.Reemplaza el archivo con el programa de prueba siguiente.
Guarda, compila la versión 1 y carga.
Observa el panel de consola cerca de la parte inferior de la vista del laboratorio. El laboratorio gestiona la conexión serie; usa las líneas impresas, no una terminal separada.
Deja el botón suelto y copia una línea
button_raw.Mantén pulsado
B1hasta que aparezcan una o dos líneas nuevas de consola, y copia la líneabutton_rawcambiada.Registra las lecturas con el botón suelto y pulsado antes de cambiar el código.
Solo después de completar el paso 8, pulsa Marcar práctica como completada.
#include "mbed.h"
DigitalIn button(PC_5, PullUp);
int main() {
printf("Button probe start\n");
while (true) {
int raw = button.read();
printf("button_raw=%d\n", raw);
ThisThread::sleep_for(500ms);
}
}
Registra por separado las lecturas de suelto y pulsado. Copia el número exacto button_raw desde la consola.
Las líneas copiadas deben usar los valores observados, no valores proporcionados por la lección:
button_raw=<valor suelto observado>
button_raw=<valor pulsado observado>Con el botón suelto, escribe una línea con este formato:
Control probado: B1 | button_raw=...
Sustituye los puntos por el valor exacto copiado de la consola.
Con B1 pulsado, escribe una línea con este formato:
Control: B1 | button_raw=... | tiempo mantenido: ... s | ¿cambió?: sí/no
Usa el valor exacto de consola y el tiempo que mantuviste pulsado el botón antes
de decidir si la lectura había cambiado.
Escribe el resultado así: suelto=<valor observado>, pulsado=<valor observado>. Después indica si el valor pulsado es menor que el valor suelto y, por tanto, activo en bajo en esta sesión.
Iniciar una secuencia con una pulsación
22 min
Ahora usa B1 para iniciar una secuencia de tres LED. Introducirás el valor pulsado medido en tu propia prueba en vez de copiar un valor supuesto.
Los botones mecánicos pueden rebotar: durante una pulsación, la señal eléctrica puede cambiar rápidamente entre 0 y 1 durante unos milisegundos. El antirrebote consiste en esperar brevemente y comprobar otra vez para que una pulsación física no se trate como varias pulsaciones.
Tres protecciones cumplen funciones distintas:
- Confirmación antirrebote: espera 50 ms, vuelve a medir y acepta solo si la segunda muestra sigue siendo igual al valor pulsado observado.
- Bloqueo de secuencia: run_sequence() es bloqueante, por lo que no se muestrea la entrada mientras se ejecuta la secuencia. Evita otro inicio durante la secuencia; no es antirrebote.
- Rearme al soltar: después de la secuencia, espera hasta que la entrada sea distinta del valor pulsado antes de aceptar otra pulsación. Evita que una pulsación mantenida reinicie inmediatamente; tampoco es antirrebote.
El código contiene exactamente dos marcadores que impiden compilar. El TODO 1 usa tu valor pulsado observado. El TODO 2 debe ser una condición real de rechazo de la segunda muestra. Sustituye ambos y busca TODO antes de compilar.
Reemplaza
main.cppcon el programa siguiente y completa los TODO 1-2 usando tu evidencia de prueba.Busca
TODO. Cuando no quede ninguno, guarda, compila la versión 2 y carga.Pulsa y suelta
B1, y observa la secuencia completa.Pulsa el botón varias veces mientras la secuencia está ejecutándose. Las pulsaciones extra durante la secuencia se ignoran. Para iniciar otra secuencia, espera a que termine, suelta el botón y pulsa otra vez.
Cambia un retardo visible de
run_sequence()de500msa1000ms. No cambies el retardo antirrebote de50msni el retardo de liberación/sondeo de20ms. Guarda, compila la versión 3, carga y compara.Solo después de completar el paso 5, pulsa Marcar práctica como completada.
#include "mbed.h"
DigitalIn button(PC_5, PullUp);
DigitalOut led1(PB_13, 1);
DigitalOut led2(PB_14, 1);
DigitalOut led3(PB_15, 1);
void led_on(DigitalOut &led) {
led = 0;
}
void led_off(DigitalOut &led) {
led = 1;
}
void all_off() {
led_off(led1);
led_off(led2);
led_off(led3);
}
void run_sequence() {
led_on(led1);
ThisThread::sleep_for(500ms);
led_on(led2);
ThisThread::sleep_for(500ms);
led_on(led3);
ThisThread::sleep_for(2000ms);
all_off();
}
int main() {
// 1: sustituye por el valor pulsado exacto observado en la prueba.
const int pressed_value = TODO_PRESSED_VALUE;
all_off();
printf("Button sequence start\n");
while (true) {
bool pressed = (button.read() == pressed_value);
if (pressed) {
ThisThread::sleep_for(50ms);
// 2: rechaza si la segunda muestra ya no está pulsada.
if (TODO_CONFIRM_CONDITION) {
continue;
}
printf("press detected: running sequence\n");
run_sequence();
printf("sequence complete; release button\n");
while (button.read() == pressed_value) {
ThisThread::sleep_for(20ms);
}
printf("ready for next press\n");
}
ThisThread::sleep_for(20ms);
}
}
Registra tres comprobaciones breves. Mantén separadas la predicción y la evidencia.
Prueba de pulsación normal:
- número de inicios previsto: uno;
- orden de LED observado;
- líneas serie que demuestran inicio y final.
Pulsación repetida mientras la secuencia está ejecutándose:
- número de inicios previsto antes de ready for next press;
- número observado de líneas press detected antes de ready for next press.
Versión con retardo cambiado:
- retardo de secuencia cambiado, con milisegundos;
- diferencia visible prevista;
- diferencia visible observada después de la versión 3.
¿Qué afirmación separa correctamente el antirrebote del bloqueo de secuencia?
Enviar tu código
8 min
Adjunta tu main.cpp final guardado
Pulsa Comprobar archivos guardados y confirma que main.cpp contiene tu valor pulsado observado, la condición de segunda muestra, el cambio de secuencia a 1000ms probado y ningún TODO. Después adjunta y envía.
Convierte esta vista previa en una sesión de clase real
Activa LabsLand Teach para usar esta lección con tus estudiantes. La primera vez que actives Teach, podrás realizar una sesión de clase sin costo.
¿Primera vez en LabsLand? Crea tu cuenta de docente