Ejercicio No. 4 – Semáforo con interfaz gráfica (Tkinter)

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:

  1. Cómo representar múltiples LEDs virtuales utilizando Tkinter.
  2. Cómo sincronizar hardware GPIO con una interfaz gráfica.
  3. Cómo crear animaciones temporizadas mediante el método after().
  4. 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:

LEDGPIO
RojoGPIO17
AmarilloGPIO27
VerdeGPIO22

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:

  1. activa el LED correspondiente
  2. actualiza el LED virtual
  3. cambia el estado del sistema
  4. 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:

EstadoDuración
Verde5 segundos
Amarillo2 segundos
Rojo5 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.

Deja un comentario

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

Scroll al inicio