En este ejercicio el sistema de semáforo evoluciona hacia una arquitectura más cercana a los sistemas de control reales utilizados en ciudades inteligentes y sistemas de automatización urbana. A diferencia de los ejercicios anteriores, el semáforo ahora puede operar en diferentes modos de funcionamiento, los cuales pueden ser seleccionados directamente desde la interfaz gráfica.
Esta ampliación introduce un concepto muy importante en el diseño de sistemas embebidos: los modos de operación del sistema. Muchos dispositivos electrónicos no operan siempre bajo la misma lógica; en cambio, pueden cambiar su comportamiento dependiendo del contexto o de la intervención del usuario.
En este caso el sistema implementa dos modos:
Modo NORMAL
Este modo corresponde al funcionamiento tradicional del semáforo vehicular. El sistema sigue la secuencia clásica:
VERDE → AMARILLO → ROJO → VERDE
Durante el estado verde, el sistema puede recibir una solicitud de peatón mediante el botón conectado al GPIO. Cuando esta solicitud ocurre, el sistema prepara la transición hacia el estado amarillo, iniciando el ciclo de detención del tráfico.
Este comportamiento reproduce de forma simplificada el funcionamiento de muchos semáforos reales que incorporan botones peatonales.
Modo INTERMITENTE
En este modo el sistema abandona la lógica de semáforo completo y entra en un estado de precaución, donde únicamente el LED amarillo parpadea de manera periódica.
La secuencia es:
AMARILLO ON ↔ AMARILLO OFF
Este tipo de señalización es muy común en intersecciones durante horarios nocturnos o cuando el sistema de control principal se encuentra fuera de servicio. Implementar este modo permite comprender cómo los sistemas embebidos pueden reconfigurar completamente su comportamiento sin modificar el hardware, únicamente mediante software.
Arquitectura del sistema
El programa está organizado siguiendo una estructura modular típica del desarrollo de sistemas embebidos educativos.
Configuración de hardware
El sistema utiliza tres salidas digitales para controlar los LEDs del semáforo:
- LED rojo
- LED amarillo
- LED verde
El botón de peatón se conecta como entrada digital con resistencia pull-up interna, lo que garantiza una lectura estable del pin incluso cuando el botón no está presionado.
La Raspberry Pi utiliza la numeración BCM de GPIO, lo cual es habitual cuando se trabaja con bibliotecas como RPi.GPIO.
Máquina de estados con múltiples modos
El comportamiento del sistema se basa en una máquina de estados jerárquica.
Primero se evalúa el modo de operación del sistema:
- NORMAL
- INTERMITENTE
Dentro del modo normal, el sistema ejecuta la máquina de estados del semáforo:
- estado VERDE
- estado AMARILLO
- estado ROJO
Cada estado controla:
- El encendido de los LEDs
- La actualización de la interfaz gráfica
- Las condiciones de transición al siguiente estado
En el modo intermitente la lógica cambia completamente. El sistema ya no sigue el ciclo completo del semáforo y únicamente conmuta el LED amarillo cada cierto tiempo.
Este diseño muestra cómo una máquina de estados puede adaptarse a diferentes modos sin duplicar la estructura del programa.
Interrupciones del botón
El botón de peatón sigue gestionándose mediante una interrupción GPIO. Cuando se detecta una transición en el pin, se ejecuta la rutina:
ISR_boton()
Esta rutina:
- detecta la pulsación del botón
- elimina rebotes mecánicos
- registra la solicitud de peatón
Es importante notar que la solicitud de peatón solo es válida en modo NORMAL, lo cual evita comportamientos inesperados cuando el sistema está en modo intermitente.
Este tipo de restricciones es muy común en sistemas embebidos reales, donde ciertas funciones solo están habilitadas en determinados estados del sistema.
Eliminación de rebotes
Como en ejercicios anteriores, el botón implementa un mecanismo de debounce por software. El sistema ignora cualquier evento que ocurra dentro de una ventana temporal demasiado corta después de la última pulsación detectada.
Este detalle evita múltiples activaciones causadas por el comportamiento físico del contacto mecánico del botón.
Interfaz gráfica con Tkinter
La interfaz gráfica continúa utilizando la biblioteca Tkinter, pero ahora incluye nuevos elementos que permiten interactuar con el sistema:
- representación visual del semáforo
- indicador del botón de peatón
- mensajes de estado del sistema
- botones para seleccionar el modo de operación
Los botones Modo Normal y Modo Intermitente permiten modificar el comportamiento del sistema en tiempo real.
Este tipo de interfaz se utiliza frecuentemente en el desarrollo de prototipos, ya que permite observar y controlar el sistema mientras se ejecuta, lo que facilita la depuración y la comprensión del software.
Conceptos de sistemas embebidos que se aprenden en este ejercicio
Este ejercicio introduce varios conceptos avanzados que aparecen frecuentemente en sistemas reales:
Sistemas con múltiples modos de operación
Muchos dispositivos electrónicos cambian su comportamiento dependiendo del modo activo.
Máquinas de estados jerárquicas
Un sistema puede contener diferentes máquinas de estados dependiendo del modo de funcionamiento.
Separación entre lógica de control y visualización
El sistema controla hardware físico mientras actualiza simultáneamente una interfaz gráfica.
Interacción hombre-máquina (HMI)
Los botones de la interfaz permiten al usuario modificar el comportamiento del sistema.
Arquitectura modular en software embebido
Las funciones que controlan los modos del sistema están separadas del núcleo de la lógica de control.
Estos conceptos son fundamentales en aplicaciones como:
- sistemas de control de tráfico
- automatización industrial
- robótica móvil
- dispositivos IoT con múltiples configuraciones
Repositorio del programa
El código completo de este ejercicio se encuentra disponible en el siguiente repositorio:
Repositorio en GitHub
En el repositorio encontrarás:
- código fuente completo del sistema
- comentarios detallados en cada sección
- estructura del proyecto
- instrucciones para ejecutar el programa en Raspberry Pi
Prompt recomendado para generar el código
Una forma muy efectiva de aprender desarrollo de sistemas embebidos actualmente es utilizar modelos de lenguaje como asistentes de programación. El siguiente prompt permite generar un programa equivalente y explorar variaciones del sistema.
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 programa debe implementar dos modos de funcionamiento:
Modo NORMAL
El semáforo debe seguir la secuencia:
VERDE → AMARILLO → ROJO → VERDE
Modo INTERMITENTE
El LED amarillo debe parpadear cada 0.5 segundos.
Requisitos del sistema:
- usar la librería RPi.GPIO
- implementar interrupciones para el botón
- implementar eliminación de rebotes por software
- utilizar una máquina de estados para el semáforo
- crear una interfaz gráfica con Tkinter
- mostrar el estado del semáforo en la interfaz
- mostrar un indicador cuando el botón es presionado
- permitir cambiar entre modo NORMAL e INTERMITENTE
mediante botones en la interfaz gráfica
- actualizar el sistema periódicamente usando ventana.after()
El código debe estar bien estructurado, comentado
y diseñado como un ejemplo educativo de sistemas embebidos.
