El Frambuesa Pi 5 acaba de ser lanzado y nos presentó un Pi más potente, pero también cambió algunas cosas y la más notable fue el GPIO.
Todavía tenemos el mismo GPIO de 40 pines, pero ahora funciona un poco diferente ya que está conectado al nuevo chip Southbridge RP1. ¿Por qué esto importa? Bueno, todo se reduce a cómo escribimos el código que interactúa con GPIO. En el pasado, muchos proyectos favorecían a RPi.GPIO. Este fue un proyecto comunitario de Ben Croston y sirvió bien a varias generaciones de Raspberry Pi. Con Raspberry Pi 5, no podemos usar RPi.GPIO debido a cómo se asignan en memoria los pines GPIO. Esto nos obliga a utilizar una alternativa, y libgpiod es el foco de este procedimiento.
Libgpiod, específicamente python3-gpiod es un módulo Python puro para interactuar con GPIO. Es similar a RPI.GPIO en el sentido de que tenemos que configurar explícitamente los pines GPIO antes de usarlos. Vemos a gpiod más bien como un módulo intermedio para Python y GPIO. Si eres nuevo en esto, usa GPIO cero que también funciona con Raspberry Pi 5. GPIO Zero fue creado por Ben Nuttall y Dave Jones y simplifica enormemente el GPIO.
Vamos a crear dos proyectos muy simples usando gpiod. La primera es una salida, un LED. El segundo es una entrada, un botón que activará el encendido y apagado del LED.
Para estos proyectos necesitarás
Proyecto 1: Salida, hacer parpadear un LED
El primer objetivo al aprender cualquier lenguaje/marco es crear un programa «Hola mundo». En hardware, piratería informática y electrónica, este es un LED parpadeante.
El circuito es extremadamente simple. Tenemos la pata larga (ánodo) de un LED conectada al GPIO 17 mediante un cable de puente. El tramo corto (cátodo) está conectado a GND mediante una resistencia y otro cable de puente. La resistencia puede tener cualquier valor entre 100 y 330 ohmios (naranja-naranja-marrón-oro). Echa un vistazo a nuestro guía de referencia de resistencias para más información.
1. Abra Thonny e importe dos módulos de código. El primer módulo es gpiod, utilizado para controlar y leer el GPIO. En segundo lugar está el tiempo, que se utiliza para agregar una pausa en el código.
import gpiod
import time
2. Cree una variable llamada LED_PIN y almacene el valor 17 dentro de ella. Esta variable contiene la referencia del pin Broadcom para un pin GPIO en todos los modelos de Raspberry Pi. Las referencias de pines de Broadcom son el estándar utilizado en toda la documentación de Raspberry Pi. Utiliza la ruptura del SoC al GPIO. Puede que a nosotros no nos parezca lógico, pero para los ingenieros que crean las placas, los pines están separados correctamente.
LED_PIN = 17
3. Dígale al código dónde encontrar el GPIO. Originalmente, la Raspberry Pi tenía un único dispositivo gpiomem, que estaba mapeado en la memoria y podíamos usarlo con módulos Python como RPi.GPIO. Con Raspberry Pi 5 y el chip RP1 ahora tenemos dispositivos divididos dinámicamente y nuestro GPIO está en gpiomem4.
chip = gpiod.Chip('gpiochip4')
4. Cree una variable llamada led_line y almacene una referencia al pin GPIO del LED. El módulo gpiod utiliza líneas para referirse a los pines GPIO.
led_line = chip.get_line(LED_PIN)
5. Configure el LED como salida. Queremos que la corriente fluya hacia el LED.
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
6. Envuelva el cuerpo principal del código en un bucle try y while True.Try es parte de un controlador de excepciones que intentará ejecutar nuestro código, puede manejar excepciones y ejecutar una sección de código cuando salimos.
try:
while True:
7. Encienda el LED y luego espere un segundo. Esto obligará al LED a permanecer encendido durante un segundo.
led_line.set_value(1)
time.sleep(1)
8. Apague el LED y luego espere un segundo. El modo de suspensión obliga al LED a permanecer apagado durante un segundo.
led_line.set_value(0)
time.sleep(1) # Sleep for one second
9. Agregue una sección de código para limpiar el GPIO cuando el código salga. Con GPIO Zero, no tenemos que hacer esto, pero gpiod (y el antiguo RPi.GPIO) tenemos que limpiar antes de salir.
finally:
led_line.release()
10. Guarde el código como flashy.py y haga clic en Ejecutar para comenzar. El LED del GPIO 17 parpadeará cada segundo. Presione CTRL + C o haga clic en Detener para finalizar.
Proyecto 1: Listado de códigos completo
import gpiod
import time
LED_PIN = 17
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
try:
while True:
led_line.set_value(1)
time.sleep(1)
led_line.set_value(0)
time.sleep(1)
finally:
led_line.release()
Proyecto 2: Entrada, reaccionar a la entrada del usuario
Después de «Hola mundo», el siguiente objetivo es crear una entrada. En este ejemplo creamos un botón, un lado está conectado al pin GPIO del botón y el otro a 3V3. El estado predeterminado del pin GPIO del botón es sin alimentación (0, Falso, Bajo), pero cuando presionamos el botón conectamos el pin 3V3 al pin GPIO del botón y cambiamos su estado a encendido (1, Verdadero, Alto). Nuestro código buscará este cambio de estado y reaccionará en consecuencia. Todo lo que necesitamos es el botón y dos cables de puente.
1. Abra Thonny e importe dos módulos de código. El primer módulo es gpiod, utilizado para controlar y leer el GPIO. En segundo lugar está el tiempo, que se utiliza para agregar una pausa en el código.
import gpiod
import time
2. Cree una variable llamada LED_PIN y almacene el valor 17 dentro de ella. Esta variable contiene la referencia del pin Broadcom para un pin GPIO en todos los modelos de Raspberry Pi. Las referencias de pines de Broadcom son el estándar utilizado en toda la documentación de Raspberry Pi. Utiliza la ruptura del SoC al GPIO. Puede que a nosotros no nos parezca lógico, pero para los ingenieros que crean las placas, los pines están separados correctamente.
LED_PIN = 17
3. Cree una variable llamada BUTTON_PIN y almacene el valor 27 dentro de ella. GPIO 27 está justo al lado de GPIO 17.
BUTTON_PIN = 27
4. Dígale al código dónde encontrar el GPIO. Originalmente, la Raspberry Pi tenía un único dispositivo gpiomem, que estaba mapeado en la memoria y podíamos usarlo con módulos Python como RPi.GPIO. Con Raspberry Pi 5 y el chip RP1 ahora tenemos dispositivos divididos dinámicamente y nuestro GPIO está en gpiomem4.
chip = gpiod.Chip('gpiochip4')
5. Cree una variable llamada led_line y almacene una referencia al pin GPIO del LED. El módulo gpiod utiliza líneas para referirse a los pines GPIO.
led_line = chip.get_line(LED_PIN)
6. Cree una variable llamada button_line y almacene una referencia al pin GPIO del botón.
button_line = chip.get_line(BUTTON_PIN)
7. Configure el LED como salida. Queremos que la corriente fluya hacia el LED.
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
8. Establezca el botón como entrada. Queremos que la corriente fluya hacia el LED.
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
9. Envuelva el cuerpo principal del código en un bucle try y while True.Try es parte de un controlador de excepciones que intentará ejecutar nuestro código, puede manejar excepciones y ejecutar una sección de código cuando salimos.
try:
while True:
10. Obtenga el estado actual del pin GPIO del botón y guárdelo en una variable llamada button_state.
button_state = button_line.get_value()
11. Utilice un condicional if para comprobar si se ha pulsado el botón. Si es así, enciende el LED. El estado predeterminado del pin GPIO del botón es bajo (0, Falso). Pero cuando pulsamos el botón conectamos el pin 3V de la Raspberry Pi 5 al pin GPIO del Botón. Esto eleva el pin del botón (1, Verdadero). Este cambio de estado es el desencadenante de nuestro código.
if button_state == 1: # Button is pressed
led_line.set_value(1) # Turn the LED on
12. Utilice una condición más para apagar el LED cuando no se presiona el botón.
else:
led_line.set_value(0) # Turn the LED off
13. Agregue una sección de código para limpiar el GPIO cuando el código salga. Con GPIO Zero no tenemos que hacer esto, pero gpiod (y el antiguo RPi.GPIO) tenemos que limpiar antes de salir.
finally:
led_line.release()
button_line.release()
14. Guarde el código como button-press.py y haga clic en Ejecutar para comenzar. Presione el botón para encender el LED y suéltelo para apagarlo. Presione CTRL + C o haga clic en Detener para finalizar.
Proyecto 2: Listado de códigos completo
import gpiod
LED_PIN = 17
BUTTON_PIN = 27
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
button_line = chip.get_line(BUTTON_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
button_line.request(consumer="Button", type=gpiod.LINE_REQ_DIR_IN)
try:
while True:
button_state = button_line.get_value()
if button_state == 1:
led_line.set_value(1)
else:
led_line.set_value(0)
finally:
led_line.release()
button_line.release()