Ejercicio No. 6 – Semáforo con botón usando interrupciones

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:

  1. Cómo configurar interrupciones en los pines GPIO de la Raspberry Pi.
  2. Cómo crear una rutina de servicio de interrupción (ISR).
  3. Cómo diseñar ISR eficientes siguiendo buenas prácticas.
  4. 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:

ElementoGPIO
LED rojoGPIO17
LED amarilloGPIO27
LED verdeGPIO22
BotónGPIO23

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:

  1. Deben ser muy cortas y rápidas.
  2. No deben incluir retardos o bucles largos.
  3. Solo deben generar eventos o modificar variables.
  4. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio