🛠 Dominar las E/S en Banana Pi BPI-CM5
Objetivos
Este tutorial tiene como objetivo introducirte en la programación de entradas/salidas digitales (GPIO) en el Banana Pi BPI-CM5. A diferencia de los microcontroladores, el BPI-CM5 es un módulo SoC potente (Amlogic A311D2) que requiere un enfoque de software específico para acceder a periféricos físicos. Configuraremos un pin como salida para controlar un LED y leer el estado de un botón pulsador. Esta habilidad es fundamental para cualquier proyecto IoT o de domótica que utilice este módulo.
Material Necesario
- Módulo Banana Pi BPI-CM5 (con placa base compatible con CM4 o adaptador GPIO específico)
- Fuente de alimentación estable de 5V
- Tarjeta SD o almacenamiento eMMC con Linux (Ubuntu, Debian o Armbian)
- 1 LED rojo y una resistencia de 220 a 330 ohmios
- 1 Botón pulsador
- Cables de conexión (jumpers)
- Multímetro (opcional para verificación de voltaje)
Pasos
- Identificación de Pines: El BPI-CM5 utiliza conectores Board-to-Board compatibles con CM4. Consulta la documentación técnica de tu placa base para identificar el encabezado GPIO físico. Los pines GPIO generalmente están numerados del 1 al 40, pero los números lógicos (BCM) difieren de los números físicos. Para este tutorial, usaremos la biblioteca
RPi.GPIOolgpioadaptada a la arquitectura ARM64.
- Preparación del Entorno: Conéctate por SSH o pantalla. Actualiza el sistema e instala las bibliotecas necesarias. En Debian/Ubuntu:
sudo apt update
sudo apt install python3-rpi.gpio python3-pip
Si rpi.gpio no funciona nativamente en Amlogic, usa lgpio:
sudo apt install python3-lgpio
- Cableado de Hardware:
- Conecta el GPIO 17 (pin físico 11 en muchas placas CM4) al ánodo (pata larga) del LED a través de la resistencia.
- Conecta el cátodo del LED a GND (tierra).
- Conecta un lado del botón al GPIO 22 (pin físico 15) y el otro a GND. Activaremos una resistencia de pull-up por software.
- Programación: Crea un archivo
test_gpio.py:
import lgpio
import time
# Inicialización
handle = lgpio.gpiochip_open(0)
# Configurar GPIO 17 como salida
lgpio.gpio_claim_output(handle, 17)
# Configurar GPIO 22 como entrada con pull-up
lgpio.gpio_claim_input(handle, 22, lgpio.SET_PULL_UP)
try:
while True:
# Encender LED
lgpio.gpio_write(handle, 17, 1)
time.sleep(0.5)
# Apagar LED
lgpio.gpio_write(handle, 17, 0)
time.sleep(0.5)
# Leer estado del botón (0 si está presionado debido al pull-up)
estado = lgpio.gpio_read(handle, 22)
if estado == 0:
print("¡Botón presionado!")
except KeyboardInterrupt:
pass
finally:
lgpio.gpiochip_close(handle)
- Ejecución: Ejecuta el script con privilegios de root si es necesario:
sudo python3 test_gpio.py
Verificación
Deberías observar el LED parpadeando a intervalos regulares. Cuando presiones el botón, debería aparecer el mensaje "¡Botón presionado!" en la terminal. Si el LED no se enciende, verifica la polaridad (ánodo/cátodo) y el valor de la resistencia. Si el botón siempre se considera presionado, verifica el cableado a tierra.
Para Ir Más Allá
Explora las interfaces avanzadas del BPI-CM5. Usa el bus I2C para conectar un sensor de temperatura (como el DS18B20 o un BME680) o el bus SPI para una pantalla OLED. El módulo también cuenta con dos interfaces de cámara MIPI-CSI; intenta capturar una imagen mediante OpenCV para explotar el ISP de 16 MP integrado, ofreciendo capacidades muy superiores a un simple GPIO.