En los ejercicios anteriores aprendimos a controlar hardware desde Python utilizando los pines GPIO de la Raspberry Pi. Primero encendimos un LED y posteriormente construimos un sistema de semáforo basado en estados.
En este tercer ejercicio introducimos un concepto muy importante en muchos sistemas embebidos modernos:
la interacción entre hardware físico y una interfaz gráfica de usuario.
Muchos dispositivos electrónicos actuales integran algún tipo de interfaz visual que permite monitorear o controlar el sistema. Algunos ejemplos incluyen:
- paneles de control industriales
- interfaces de monitoreo IoT
- software de diagnóstico de hardware
- sistemas de supervisión en robótica
En este ejercicio construiremos una interfaz gráfica simple utilizando Tkinter, que permitirá visualizar el estado de un LED físico conectado a la Raspberry Pi.
El sistema controlará simultáneamente:
- un LED real conectado al GPIO
- un LED virtual representado en una ventana gráfica
De esta manera el usuario puede observar en pantalla el estado del hardware en tiempo real.
Objetivo del ejercicio
El objetivo de este programa es sincronizar el control de hardware GPIO con una interfaz gráfica desarrollada en Python.
Durante este ejercicio aprenderemos:
- Cómo crear una interfaz gráfica simple con Tkinter.
- Cómo representar elementos visuales mediante el objeto Canvas.
- Cómo sincronizar el estado de un dispositivo físico con una representación gráfica.
- Cómo programar tareas periódicas utilizando el método
after().
Este tipo de arquitectura es muy utilizada en aplicaciones de:
- monitoreo de sensores
- control industrial
- interfaces de laboratorio
- sistemas de adquisición de datos
Funcionamiento del sistema
El sistema controla un LED conectado al GPIO17 y al mismo tiempo muestra un LED virtual dentro de una ventana gráfica.
El comportamiento es el siguiente:
| Estado del LED físico | LED virtual |
|---|---|
| Encendido | círculo rojo |
| Apagado | círculo gris |
El programa alterna automáticamente el estado del LED cada segundo, actualizando simultáneamente el hardware y la interfaz gráfica.
Esto crea una sincronización directa entre el sistema embebido y su representación visual.
Arquitectura del programa
El código está dividido en varias secciones que separan claramente las responsabilidades del sistema.
1. Importación de librerías
El programa utiliza dos librerías principales.
RPi.GPIO
Permite controlar los pines GPIO de la Raspberry Pi.
Tkinter
Es la librería estándar de Python para crear interfaces gráficas.
Tkinter permite construir ventanas, botones, gráficos y otros elementos visuales sin necesidad de instalar software adicional.
2. Configuración del hardware GPIO
El sistema utiliza el pin:
GPIO17
Este pin se configura como salida digital, ya que será utilizado para controlar el LED físico.
3. Variables del sistema
El programa utiliza una variable llamada:
estado_led
Esta variable almacena el estado actual del LED:
True→ LED encendidoFalse→ LED apagado
Esto permite sincronizar el hardware con la interfaz gráfica.
4. Creación del LED virtual
La interfaz gráfica utiliza un Canvas, que es un espacio de dibujo dentro de la ventana.
En este Canvas se crea un círculo, que representará el LED virtual.
Cuando el LED está apagado el círculo se muestra en color:
gris
Cuando el LED está encendido cambia a color:
rojo
Este tipo de representación visual es muy común en interfaces de monitoreo de sistemas electrónicos.
5. Sincronización entre hardware y GUI
La función principal del sistema es:
actualizar_led()
Esta función realiza tres tareas:
- Cambia el estado lógico del LED físico.
- Actualiza el color del LED virtual.
- Programa la siguiente ejecución de la función.
Para esto se utiliza el método:
after()
Este método es fundamental en aplicaciones gráficas porque permite ejecutar tareas periódicas sin bloquear la interfaz.
6. Bucle principal de la aplicación
Las aplicaciones gráficas utilizan un mecanismo llamado event loop.
En Tkinter este bucle se inicia con:
mainloop()
Este bucle mantiene la ventana activa y permite procesar eventos como:
- actualizaciones gráficas
- interacción del usuario
- temporizadores
Diagrama conceptual del sistema
El hardware necesario es el mismo del primer ejercicio.
Componentes
- Raspberry Pi
- LED
- resistencia de 220 Ω o 330 Ω
- protoboard
- cables jumper
Conexión
GPIO17 ── Resistencia ── LED ── GND
La diferencia en este ejercicio es que el estado del LED también se refleja en la interfaz gráfica del sistema.
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 inteligencia artificial como herramienta de aprendizaje para generar el programa y luego analizar su funcionamiento.
Prompt sugerido:
Actúa como un ingeniero experto en sistemas embebidos con Raspberry Pi.
Escribe un programa en Python para una Raspberry Pi 5 que controle
un LED conectado al GPIO17 y que al mismo tiempo muestre una
interfaz gráfica utilizando Tkinter.
El programa debe:
1. Usar la librería RPi.GPIO.
2. Crear una ventana gráfica con Tkinter.
3. Dibujar un LED virtual usando un Canvas.
4. Cambiar el color del LED virtual a rojo cuando el LED físico esté encendido.
5. Cambiar el color a gris cuando esté apagado.
6. Alternar el estado del LED cada segundo.
7. Utilizar el método after() para actualizar el sistema.
8. Liberar los recursos GPIO al finalizar el programa.
El código debe estar bien comentado para ser utilizado en un curso
educativo de sistemas embebidos.
Lo que aprenderás en el siguiente ejercicio
En el Ejercicio 4 incorporaremos interacción directa del usuario con el hardware.
El sistema incluirá:
- un botón físico conectado a un GPIO
- lectura de entradas digitales
- control del LED mediante eventos externos
Esto permitirá construir sistemas embebidos reactivos, capaces de responder a señales provenientes del mundo físico.
