Ejercicio No. 9 — Semáforo con display de cuenta regresiva (Raspberry Pi)

En este último ejercicio de la serie el sistema de semáforo alcanza un nivel de complejidad más cercano a los sistemas de control utilizados en infraestructuras reales de tráfico urbano. Además de los modos de funcionamiento y la interacción con el botón de peatón, el sistema ahora incorpora un display digital de cuenta regresiva que indica el tiempo restante de cada estado del semáforo.

Este tipo de señalización es muy común en muchas ciudades del mundo, ya que permite a conductores y peatones anticipar los cambios del sistema, mejorando la seguridad y la fluidez del tráfico.

Desde el punto de vista del diseño de sistemas embebidos, este ejercicio introduce un concepto muy importante: la visualización temporal del estado del sistema, es decir, mostrar información derivada del reloj interno del programa.

El semáforo continúa funcionando con la lógica implementada en el ejercicio anterior, incluyendo:

  • control de LEDs mediante GPIO
  • interrupciones por botón de peatón
  • eliminación de rebotes
  • máquina de estados
  • interfaz gráfica
  • modos de funcionamiento

La novedad es que ahora el sistema calcula en tiempo real cuánto tiempo queda antes de cambiar de estado.


Arquitectura del sistema

El programa mantiene la misma arquitectura de los ejercicios anteriores, pero incorpora un módulo adicional encargado de calcular y mostrar el tiempo restante del estado actual.

La estructura general del sistema incluye los siguientes componentes.


Control del hardware mediante GPIO

Los LEDs del semáforo continúan controlándose a través de los pines GPIO de la Raspberry Pi.

Cada salida digital representa un estado del sistema:

  • LED verde
  • LED amarillo
  • LED rojo

El botón peatonal está conectado a una entrada digital configurada con resistencia pull-up interna, lo que garantiza un comportamiento estable cuando el botón no está presionado.

El sistema detecta la pulsación mediante interrupciones GPIO, lo que permite reaccionar inmediatamente ante una solicitud de peatón sin bloquear la ejecución del programa.


Máquina de estados del semáforo

El comportamiento del sistema sigue implementándose mediante una máquina de estados finitos (FSM).

En modo normal el semáforo sigue la secuencia clásica:

VERDE → AMARILLO → ROJO → VERDE

Cada estado controla:

  1. los LEDs físicos del semáforo
  2. la representación gráfica del sistema
  3. el cálculo del tiempo restante del estado

Las transiciones entre estados se producen cuando se cumple el tiempo asignado a cada fase o cuando ocurre una solicitud de peatón.

Este tipo de diseño es fundamental en sistemas embebidos porque permite mantener el programa organizado, predecible y fácil de ampliar.


Cálculo del tiempo restante

El nuevo componente del sistema es el display de cuenta regresiva.

Para implementarlo, el programa registra el instante en que comienza cada estado mediante la variable:

inicio_estado

En cada iteración del sistema se calcula:

tiempo_transcurrido = tiempo_actual - inicio_estado

A partir de este valor se obtiene el tiempo restante del estado:

restante = tiempo_estado - tiempo_transcurrido

Este valor se muestra en pantalla mediante un elemento de texto dentro del canvas de Tkinter.

Este mecanismo reproduce el funcionamiento de muchos sistemas de control digital donde se requiere visualizar el tiempo de ejecución de un proceso.


Display dinámico de cuenta regresiva

El display digital aparece a la derecha del semáforo y muestra el número de segundos restantes antes de la transición al siguiente estado.

Además, el color del display cambia según el estado activo:

  • Verde durante la fase verde
  • Naranja durante la fase amarilla
  • Rojo durante la fase roja

Este tipo de visualización facilita la interpretación del sistema y mejora la experiencia del usuario.

Cuando el sistema entra en modo intermitente, el display deja de mostrar un número y aparece el símbolo:

-

Esto indica que el sistema no está siguiendo el ciclo normal del semáforo.


Interfaz gráfica con Tkinter

La interfaz gráfica mantiene la misma estructura del ejercicio anterior, pero ahora incorpora el display de cuenta regresiva dentro del canvas.

Los elementos principales de la interfaz son:

  • representación gráfica del semáforo
  • indicador del botón peatonal
  • display digital de tiempo restante
  • mensaje de estado del sistema
  • botones para cambiar el modo de funcionamiento

El sistema se actualiza periódicamente mediante el método:

ventana.after()

Este mecanismo permite crear una aplicación interactiva sin bloquear el flujo del programa, algo fundamental cuando se combinan interfaces gráficas con control de hardware.


Conceptos de sistemas embebidos que se aprenden en este ejercicio

Este ejercicio integra muchos de los conceptos fundamentales trabajados a lo largo de la serie:

Máquinas de estados finitos
Modelo esencial para el diseño de sistemas reactivos.

Interrupciones y eventos externos
El botón peatonal genera eventos asincrónicos.

Eliminación de rebotes en entradas digitales
Problema común en interfaces electrónicas.

Sistemas con múltiples modos de operación
El sistema puede funcionar en modo normal o intermitente.

Visualización del estado interno del sistema
El display muestra información derivada del reloj interno del programa.

Interfaz hombre-máquina (HMI)
La aplicación gráfica permite monitorear y controlar el sistema en tiempo real.

En conjunto, estos elementos representan un pequeño sistema embebido completo, muy similar en estructura a muchos dispositivos reales utilizados en:

  • control de tráfico urbano
  • sistemas de automatización
  • robótica móvil
  • dispositivos IoT interactivos

Repositorio del programa

El código completo del ejercicio se encuentra disponible en el siguiente repositorio:

Repositorio en GitHub

El repositorio incluye:

  • código fuente completo del sistema
  • comentarios detallados en cada sección
  • instrucciones de conexión del hardware
  • estructura del proyecto para Raspberry Pi

Prompt recomendado para generar el código

El siguiente prompt permite recrear el ejercicio utilizando herramientas de inteligencia artificial orientadas a programación. También puede utilizarse como punto de partida para experimentar con nuevas funcionalidades.

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 con tres LEDs conectados a los GPIO 17, 27 y 22
y un botón de peatón conectado al GPIO 23.

El sistema debe incluir dos modos de funcionamiento:

Modo NORMAL
El semáforo sigue la secuencia:
VERDE → AMARILLO → ROJO → VERDE

Modo INTERMITENTE
El LED amarillo parpadea cada 0.5 segundos.

El sistema debe incluir un display de cuenta regresiva que muestre
el tiempo restante de cada estado del semáforo.

Requisitos del sistema:

- usar la librería RPi.GPIO
- implementar interrupciones para el botón
- implementar debounce por software
- usar una máquina de estados para el semáforo
- crear una interfaz gráfica con Tkinter
- mostrar gráficamente los LEDs del semáforo
- mostrar un display de cuenta regresiva
- cambiar el color del display según el estado del semáforo
- permitir cambiar entre modo NORMAL e INTERMITENTE
- actualizar el sistema usando ventana.after()

El código debe estar completamente comentado y estructurado
como un ejemplo educativo para estudiantes 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