En los ejercicios anteriores aprendimos dos conceptos fundamentales del desarrollo de sistemas embebidos con Raspberry Pi:
- cómo controlar hardware físico mediante GPIO
- cómo crear interfaces gráficas simples utilizando Tkinter
En este cuarto ejercicio combinaremos ambos enfoques para construir un sistema más completo: un semáforo controlado por la Raspberry Pi que además puede visualizarse en una interfaz gráfica.
El sistema controlará simultáneamente:
- tres LEDs físicos conectados a los pines GPIO
- tres LEDs virtuales representados dentro de una ventana gráfica
Cada LED virtual refleja el estado del LED real, permitiendo observar en pantalla el comportamiento del sistema embebido.
Este tipo de arquitectura es muy utilizada en aplicaciones reales, por ejemplo:
- paneles de supervisión industrial
- interfaces de monitoreo de robots
- sistemas de diagnóstico de hardware
- software de control para dispositivos electrónicos
El objetivo es demostrar cómo un sistema embebido puede integrarse con una interfaz visual que represente su estado interno.
Objetivo del ejercicio
Este ejercicio extiende el sistema de semáforo desarrollado previamente, agregando una capa de visualización mediante una interfaz gráfica en Python.
Durante este ejercicio aprenderemos:
- Cómo representar múltiples LEDs virtuales utilizando Tkinter.
- Cómo sincronizar hardware GPIO con una interfaz gráfica.
- Cómo crear animaciones temporizadas mediante el método
after(). - Cómo implementar una secuencia visual basada en estados.
Este tipo de diseño es común en sistemas que requieren monitoreo en tiempo real del hardware.
Secuencia de funcionamiento del semáforo
El sistema sigue la secuencia clásica de señalización vehicular:
VERDE → AMARILLO → ROJO → VERDE
Cada estado controla simultáneamente:
- el LED físico conectado al GPIO
- el LED virtual mostrado en pantalla
Esto permite mantener sincronizados el mundo físico y la representación gráfica del sistema.
Arquitectura del programa
El programa está estructurado en varias secciones claramente diferenciadas para facilitar su comprensión.
1. Importación de librerías
El sistema utiliza dos librerías principales.
RPi.GPIO
Permite controlar los pines GPIO de la Raspberry Pi.
Tkinter
Permite crear la interfaz gráfica que mostrará el estado del semáforo.
2. Configuración de los pines GPIO
El sistema utiliza tres pines del procesador Broadcom:
| LED | GPIO |
|---|---|
| Rojo | GPIO17 |
| Amarillo | GPIO27 |
| Verde | GPIO22 |
Cada pin se configura como salida digital para controlar los LEDs físicos.
3. Máquina de estados del semáforo
El comportamiento del sistema se implementa mediante una variable de estado llamada:
estado_actual
Esta variable puede tomar tres valores:
- VERDE
- AMARILLO
- ROJO
Cada vez que la función actualizar_semaforo() se ejecuta, el sistema:
- activa el LED correspondiente
- actualiza el LED virtual
- cambia el estado del sistema
- programa la siguiente actualización
Este enfoque corresponde a una máquina de estados simple, una técnica muy utilizada en sistemas embebidos.
4. Representación gráfica del semáforo
La interfaz gráfica se construye utilizando un objeto Canvas de Tkinter.
En este Canvas se dibujan tres círculos, que representan los LEDs virtuales del semáforo:
- círculo superior → rojo
- círculo central → amarillo
- círculo inferior → verde
Cuando una luz del semáforo está activa, el círculo correspondiente cambia de color.
Cuando está apagada, se muestra en color gris.
Este tipo de visualización es muy común en interfaces de supervisión industrial.
5. Temporización del sistema
Para controlar la duración de cada estado se utilizan temporizadores programados con el método:
after()
Los tiempos utilizados son:
| Estado | Duración |
|---|---|
| Verde | 5 segundos |
| Amarillo | 2 segundos |
| Rojo | 5 segundos |
El uso de after() permite ejecutar animaciones y actualizaciones periódicas sin bloquear la interfaz gráfica.
Diagrama conceptual del hardware
El hardware utilizado es el mismo del ejercicio anterior.
Componentes
- Raspberry Pi
- LED rojo
- LED amarillo
- LED verde
- 3 resistencias de 220 Ω o 330 Ω
- protoboard
- cables jumper
Conexión
GPIO17 ── Resistencia ── LED ROJO ── GND
GPIO27 ── Resistencia ── LED AMARILLO ── GND
GPIO22 ── Resistencia ── LED VERDE ── GND
La diferencia en este ejercicio es que el estado del sistema también se visualiza en la interfaz gráfica del programa.
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
- recursos educativos adicionales
Prompt recomendado para generar el código con IA
Puedes utilizar el siguiente prompt para generar este programa con ayuda de 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 tres LEDs conectados a los GPIO:
GPIO17 → rojo
GPIO27 → amarillo
GPIO22 → verde
El programa debe incluir una interfaz gráfica utilizando Tkinter que
muestre tres LEDs virtuales.
Requisitos:
1. Usar la librería RPi.GPIO.
2. Usar numeración BCM.
3. Representar los LEDs virtuales con objetos Canvas.
4. Sincronizar el estado del hardware con los LEDs virtuales.
5. Implementar la secuencia:
VERDE → AMARILLO → ROJO
6. Usar temporizadores con el método after().
7. Liberar los recursos GPIO al finalizar el programa.
El código debe estar bien comentado para uso educativo en cursos de
sistemas embebidos.
Lo que aprenderás en el siguiente ejercicio
En el Ejercicio 5 el sistema incorporará interacción física con el usuario.
El semáforo integrará:
- un botón conectado a un GPIO
- detección de eventos de entrada digital
- modificación dinámica del comportamiento del sistema
Esto permitirá avanzar hacia el diseño de sistemas embebidos reactivos, capaces de responder a eventos provenientes del mundo físico.
