En el ejercicio anterior aprendimos a leer un botón conectado a la Raspberry Pi utilizando la técnica de polling, donde el programa consulta continuamente el estado de una entrada digital dentro del bucle principal.
Aunque este enfoque es sencillo y fácil de entender, no siempre es el más eficiente. En muchos sistemas embebidos es preferible utilizar interrupciones, un mecanismo que permite reaccionar inmediatamente cuando ocurre un evento en el hardware.
En este sexto ejercicio construiremos un sistema de semáforo con solicitud peatonal utilizando interrupciones GPIO. Cuando el botón sea presionado, el sistema ejecutará automáticamente una función especial llamada rutina de interrupción.
Este enfoque permite diseñar sistemas más:
- eficientes
- reactivos
- escalables
Las interrupciones son ampliamente utilizadas en el desarrollo de:
- microcontroladores
- sistemas embebidos en tiempo real
- dispositivos IoT
- robots autónomos
Objetivo del ejercicio
El objetivo de este ejercicio es implementar un semáforo vehicular con solicitud peatonal utilizando interrupciones GPIO en lugar de consultar constantemente el botón dentro del bucle principal.
Durante este ejercicio aprenderemos:
- Cómo configurar interrupciones en los pines GPIO de la Raspberry Pi.
- Cómo crear una rutina de servicio de interrupción (ISR).
- Cómo diseñar ISR eficientes siguiendo buenas prácticas.
- Cómo combinar eventos de hardware con una máquina de estados.
Este tipo de arquitectura es muy común en sistemas embebidos que deben responder rápidamente a eventos externos.
Polling vs interrupciones
En el ejercicio anterior el botón era leído continuamente dentro del bucle principal.
Este método se conoce como polling.
CPU → consulta el botón continuamente
En este ejercicio utilizamos interrupciones.
Botón → genera evento → CPU ejecuta una función
Esto significa que el procesador no necesita revisar constantemente el botón, sino que el hardware notifica automáticamente cuando ocurre el evento.
Funcionamiento del sistema
El sistema implementa el mismo comportamiento del ejercicio anterior, pero ahora la solicitud peatonal se detecta mediante una interrupción.
La secuencia del semáforo es:
VERDE ----(botón)----> AMARILLO → ROJO → VERDE
Cuando el botón se presiona durante el estado VERDE, la interrupción activa una solicitud peatonal que provoca la transición al estado AMARILLO.
Si el botón se presiona durante los estados AMARILLO o ROJO, la solicitud es ignorada.
Arquitectura del programa
El código está organizado en varias secciones que reflejan la estructura típica de muchos sistemas embebidos.
1. Configuración de los pines GPIO
El sistema utiliza cuatro pines:
| Elemento | GPIO |
|---|---|
| LED rojo | GPIO17 |
| LED amarillo | GPIO27 |
| LED verde | GPIO22 |
| Botón | GPIO23 |
El botón se configura como entrada con resistencia pull-up interna, lo que significa que:
- el pin normalmente está en nivel HIGH
- al presionar el botón pasa a LOW
2. Rutina de servicio de interrupción (ISR)
Cuando el botón se presiona, la Raspberry Pi ejecuta automáticamente la función:
ISR_boton()
Esta función se denomina Interrupt Service Routine (ISR).
La ISR tiene una tarea muy específica:
- detectar la solicitud peatonal
- registrar el evento
- permitir que el programa principal lo procese
3. Buenas prácticas en ISR
En sistemas embebidos es importante que las rutinas de interrupción sigan ciertas reglas:
- Deben ser muy cortas y rápidas.
- No deben incluir retardos o bucles largos.
- Solo deben generar eventos o modificar variables.
- Deben manejar adecuadamente el debounce del botón.
En este ejercicio la ISR simplemente activa la variable:
solicitud_peaton
El procesamiento real ocurre posteriormente en el bucle principal.
4. Asociación de la interrupción
La interrupción se configura mediante la función:
GPIO.add_event_detect()
Esta función indica que cuando el pin del botón detecte un flanco descendente (FALLING), se ejecutará la rutina de interrupción.
Esto ocurre cuando el botón conecta el pin a GND.
5. Máquina de estados del semáforo
El comportamiento del sistema sigue basándose en una máquina de estados simple.
La variable estado_actual puede tomar tres valores:
- VERDE
- AMARILLO
- ROJO
Durante el estado VERDE, el sistema verifica si se ha generado una solicitud peatonal.
Si ocurre, el semáforo cambia inmediatamente al estado AMARILLO.
Diagrama conceptual del hardware
El hardware utilizado es el mismo del ejercicio anterior.
Componentes
- Raspberry Pi
- LED rojo
- LED amarillo
- LED verde
- 3 resistencias (220 Ω o 330 Ω)
- botón pulsador
- protoboard
- cables jumper
Conexiones
GPIO17 ── Resistencia ── LED ROJO ── GND
GPIO27 ── Resistencia ── LED AMARILLO ── GND
GPIO22 ── Resistencia ── LED VERDE ── GND
GPIO23 ── Botón ── GND
La resistencia pull-up interna mantiene el pin en estado alto cuando el botón no está presionado.
Repositorio del ejercicio
Puedes encontrar el código completo en el repositorio:
Repositorio GitHub
En el repositorio encontrarás:
- código fuente en Python
- instrucciones de ejecución
- diagrama de conexión
- material educativo adicional
Prompt recomendado para generar el código con IA
Puedes utilizar el siguiente prompt para generar este ejercicio utilizando inteligencia artificial:
Actúa como un ingeniero experto en sistemas embebidos con Raspberry Pi.
Escribe un programa en Python para una Raspberry Pi 5 que implemente
un semáforo vehicular con un botón de peatón utilizando interrupciones GPIO.
El sistema debe usar los siguientes pines:
GPIO17 → LED rojo
GPIO27 → LED amarillo
GPIO22 → LED verde
GPIO23 → botón
Requisitos del programa:
1. Usar la librería RPi.GPIO con numeración BCM.
2. Implementar una máquina de estados con los estados:
VERDE → AMARILLO → ROJO.
3. Detectar la presión del botón mediante interrupciones GPIO.
4. Implementar una rutina de interrupción corta y eficiente.
5. Aplicar debounce por software.
6. Permitir la solicitud de peatón solo cuando el semáforo esté en VERDE.
7. Liberar los recursos GPIO al finalizar el programa.
El código debe estar bien comentado para fines educativos
en un curso de sistemas embebidos.
