Ejercicio No. 7 — Semáforo con interfaz gráfica y botón (Raspberry Pi)

En este ejercicio el sistema de semáforo evoluciona desde una implementación puramente electrónica hacia un sistema embebido interactivo con interfaz gráfica. La Raspberry Pi no solo controla los LEDs físicos mediante GPIO, sino que también muestra en pantalla el estado del sistema en tiempo real utilizando una aplicación desarrollada con Tkinter.

Este tipo de integración es muy común en el desarrollo de prototipos de sistemas embebidos, donde el diseñador necesita observar el comportamiento interno del sistema mientras interactúa con el hardware. En este ejercicio el semáforo físico y el semáforo virtual funcionan simultáneamente, lo que permite comprender con claridad cómo el software gobierna el hardware.

El programa conserva la lógica desarrollada en los ejercicios anteriores: el sistema opera mediante una máquina de estados, donde cada estado representa una fase del semáforo.

El flujo del sistema es el siguiente:

VERDE → AMARILLO → ROJO → VERDE

Sin embargo, ahora el sistema puede responder a una solicitud de peatón, generada mediante un botón conectado a un pin GPIO. Cuando el botón es presionado mientras el semáforo está en verde, el sistema registra la solicitud y prepara la transición hacia el estado amarillo.


Arquitectura del programa

El programa está organizado siguiendo una estructura típica de sistemas embebidos modernos:

1. Configuración del hardware

Se definen los pines de los LEDs y del botón utilizando la numeración BCM de Raspberry Pi. Cada LED representa un estado del semáforo:

  • LED rojo
  • LED amarillo
  • LED verde

El botón está configurado como entrada digital con resistencia pull-up interna, una práctica común para evitar estados flotantes en entradas digitales.


2. Máquina de estados

El comportamiento del semáforo está gobernado por una máquina de estados finitos (FSM) implementada en la función actualizar_sistema().

Cada estado tiene tres responsabilidades:

  1. Activar los LEDs correspondientes
  2. Actualizar la interfaz gráfica
  3. Verificar si debe ocurrir una transición de estado

Las transiciones pueden ocurrir por dos razones:

  • Tiempo cumplido del estado actual
  • Solicitud de peatón generada por el botón

Este enfoque refleja una práctica fundamental en diseño de sistemas embebidos: separar claramente los estados del sistema y sus transiciones.


3. Interrupciones por botón

El botón se gestiona mediante un sistema de interrupciones GPIO.

Cuando ocurre una transición de nivel en el pin del botón, se ejecuta una rutina de servicio de interrupción:

ISR_boton()

Esta rutina:

  • Detecta la pulsación
  • Elimina rebotes mecánicos (debounce)
  • Registra la solicitud del peatón

El uso de interrupciones es fundamental en sistemas embebidos porque permite reaccionar a eventos externos sin bloquear el programa principal.


4. Eliminación de rebotes

Los botones mecánicos generan múltiples pulsos eléctricos al presionarse. Para evitar que el sistema interprete múltiples pulsaciones, se implementa una técnica de debounce por software, utilizando una variable de tiempo que ignora eventos demasiado cercanos entre sí.

Este es un aspecto esencial cuando se diseñan interfaces físicas en sistemas digitales.


5. Interfaz gráfica con Tkinter

La interfaz gráfica representa visualmente el semáforo mediante:

  • tres círculos que simulan los LEDs
  • un indicador que muestra la pulsación del botón
  • un mensaje de estado del sistema

Cada vez que cambia el estado del sistema, el programa actualiza los elementos gráficos usando el objeto Canvas.

Esto crea una sincronización entre:

  • hardware físico (GPIO)
  • visualización en pantalla

La actualización periódica del sistema se realiza mediante el método:

ventana.after()

que programa la ejecución repetida de la función actualizar_sistema().


Conceptos de sistemas embebidos que se aprenden en este ejercicio

Este ejercicio introduce varios conceptos clave del diseño de sistemas embebidos modernos:

Integración hardware-software
La Raspberry Pi controla hardware físico mientras ejecuta una aplicación gráfica.

Máquinas de estados finitos (FSM)
Modelo fundamental para diseñar sistemas reactivos.

Interrupciones
Permiten responder a eventos externos sin bloquear el flujo del programa.

Debounce de entradas digitales
Problema real en interfaces electrónicas.

Interfaces hombre-máquina (HMI)
Visualización del estado del sistema para depuración y monitoreo.

Estos conceptos aparecen frecuentemente en sistemas reales como:

  • sistemas de control industrial
  • robótica móvil
  • dispositivos IoT
  • sistemas de automatización urbana

Repositorio del programa

El código completo de este ejercicio puede consultarse en el siguiente repositorio:

Repositorio en GitHub

En el repositorio encontrarás:

  • código fuente completo del programa
  • comentarios detallados en cada sección
  • instrucciones de conexión del hardware

Prompt recomendado para generar el código

Una forma muy poderosa de aprender diseño de sistemas embebidos hoy en día es utilizar IA generativa como asistente de programación. El siguiente prompt permite recrear el ejercicio y comprender cada parte del sistema.

Puedes utilizarlo en herramientas como ChatGPT o cualquier modelo especializado en programación.

Actúa como un ingeniero experto en sistemas embebidos con Raspberry Pi.

Escribe un programa en Python para Raspberry Pi 5 que implemente un
sistema de semáforo utilizando tres LEDs conectados a los pines GPIO
17, 27 y 22.

El sistema debe implementar una máquina de estados con los estados:
VERDE, AMARILLO y ROJO.

El semáforo debe funcionar con temporizadores:
verde = 5 segundos
amarillo = 2 segundos
rojo = 5 segundos

Debe existir un botón conectado al GPIO 23 que genere una solicitud
de peatón mediante una interrupción GPIO.

Requisitos del programa:

- usar la librería RPi.GPIO
- implementar debounce por software
- usar una máquina de estados
- crear una interfaz gráfica usando Tkinter
- la interfaz debe mostrar un semáforo con tres luces
- mostrar un indicador visual cuando el botón es presionado
- mostrar mensajes del estado del sistema
- actualizar el sistema periódicamente usando ventana.after()

El código debe estar completamente comentado y estructurado
como un proyecto educativo de sistemas embebidos.

Este tipo de interacción con modelos de lenguaje permite explorar rápidamente variantes del sistema, por ejemplo:

  • agregar sensores
  • crear modos de funcionamiento
  • implementar comunicación IoT

Si quieres, también puedo ayudarte a crear la serie completa de entradas para los 9 ejercicios, de forma que tu web tenga una progresión pedagógica muy clara:

1️⃣ GPIO básico
2️⃣ Control de LEDs
3️⃣ Semáforo simple
4️⃣ Temporización
5️⃣ Botón
6️⃣ Interrupciones
7️⃣ Interfaz gráfica
8️⃣ Modos de operación
9️⃣ Sistema inteligente / IoT

Deja un comentario

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

Scroll al inicio