GPIO en beaglebone

¿Qué tal? Ya veranito y hasta que baje el Sol y se pueda salir a la calle a hacer cualquier cosa te voy a comentar cómo utilizar los pines GPIO de beaglebone. Lo primero es decirte que en beaglebone tienes hasta 66 (8 de los cuales admiten PWM como vimos en el post de manejo de servos) pines digitales de entrada/salida! Digo “hasta” porque en función del modo en el que esté configurado un pin tiene una función u otra. También dispones de 8 conversores de analógico a digital (para leer señales analógicas) pero eso ya lo veremos otro día. Mediante los pines de entrada salida podemos conectar nuestro beaglebone con otros chips o circuitos. Pero eso sí, hay que tener siempre en mente que los pines del beaglebone son de 3,3V y mientras que actualmente, la mayoría trabaja a 5V (arduino por ejemplo) y hay que adaptar las señales (las que recibe beaglebone para evitar quemar pines).

Comienzo detallando qué es eso de los modos de un pin. En este contexto,  indica la función del pin. Dependiendo del modo, un pin puede estar funcionando como puerto serie (uart), como pin de entrada/salida, como pin PWM… Lo que tendremos que hacer cuando queramos utilizar un pin como GPIO es configurarlo en ese modo. En nuestro caso debemos ponerlos en el modo 7. En la siguiente imagen podemos ver una tabla con los diferentes modos disponibles para unos cuantos pines

 

Esta imagen está sacada de la documentación oficial de beaglebone. Muestra información sobre los modos 4, 5, 6 y 7 de los pines del banco 8. Vemos como por ejemplo, el pin 19 funciona como pin PWM en modo 4 y como GPIO en modo 7. Ninguno de los mostrados tienen ninguna función asociada al modo 5. Bien, creo que esto queda más o menos claro, cada vez que queramos usar un ping como GPIO tenemos que ponerlo en modo 7.

Todo este tema de los modos es relativo al procesador del beaglebone pero todo lo demás es extensible a cualquier máquina ejecutando un kernel de linux. Cada procesador es un mundo, pero Linux nos lo facilita enormemente.

Como en otras ocasiones, accederemos al kernel mediante el sistema de ficheros utilizando debugfs. En angstrom se carga de serie pero en Debian es necesario hacerlo a mano (o añadiendo la entrada en el fstab). Una vez montado debugfs mount -t debugfs none /sys/kernel/debug procedemos a poner los pines en modo 7. Algunos pines ya vienen configurados de serie en modo 7 (como por ejemplo P8_3) pero no pasa nada si está en un modo y tratamos de activarlo a ese modo otra vez.

Poner a un pin de un modo es muy sencillo:
echo 7 > /sys/kernel/debug/omap_mux/gpmc_ad7
El nombre gpmc_ad7 lo he sacado también de la documentación, fíjate en la siguiente imagen

Como puedes adivinar, de esa manera he puesto el pin P8_4 en modo 7. Ves que el nombre coincide con el su nombre del modo 0. Puede parecer un poco lioso pero una vez hayas configurado un par de ellos verás que no tiene nada. De todas formas, la biblioteca que comento después hace todo esto automáticamente.

Todavía nos queda un úlitmo paso para poder usar nuestro pin. Atención a esta parte. Como ves en la primera tabla, en la columna de modo 7 pone gpioX[Y] donde X e Y son números. El número Y corresponde con el número de pin GPIO y el número X indica el “índice” del pin. A efectos prácticos, esto quiere decir que el número del pin que hay que decir al kernel que hay que activar es 32 * X + Y. El número 32 es constante. Por ejemplo, para activar el pin P8_3 debemos decirle al kernel que active el pin 32 * 1 + 6 = 38. La biblioteca que incluyo en BeagleBone-Tools hace esto automáticamente pero nunca está de más saber el por qué de las cosas.

Dicho esto, procedemos a activar el pin P8_4 de la siguiente manera:

echo 39 > /sys/class/gpio/export

El número 39 lo sacamos como acabo de comentar. En el directorio /sys/class/gpio/ vemos todos los pines que tenemos activados además de los ficheros export y unexport que sirven para activar y desactivar respectivamente. Una vez activado el pin se crea el directorio gpio39. Ahora ya sí tenemos el pin listo. Dentro del directorio gpio39 vemos unos cuantos ficheros. Los más interesantes son: active_low, direction y value.

active_low sirve para que, cuando el pin lo configuremos como de entrada, muestre 1 cuando al pin cuando le lleguen 0V ó cuando le lleguen  3.3V. Dicho de otra manera, que el pin sea activo en baja o en alta. Admite valores 1 y 0
direction nos permite especificar si el pin será de lectura o escritura. Admite valores “in” y “out”
value el valor del pin, tanto para leer como para escribir. Admite valores 1 y 0 (recuerda que son pines digitales). Este valor depende también de active_low. Por ejemplo, si active_low es 1, cuando escribamos 0 en value saldrán 3,3V por el pin.

Una vez que ya no necesitemos el pin es recomendable desactivarlo: echo 39 > /sys/class/gpio/unexport

Pues ya sabemos todo lo necesario. !Ahora vamos a probarlo! Vamos a encender y apagar un led.
Lo primero es configurar el pin como out: echo out > direction
Ahora conectamos el LED. La pata larga va conectada el pin y la pata corta a tierra (el pin 1 por ejemplo). Te debería quedar de esta manera

 

Lo siguiente ya es encender el LED, y para esto hacemos: echo 1 > value

 

Después de todo este rollo has conseguido encender un LED, enhorabuena! Ahora ya puedes utilizar tu imaginación para hacer cualquier cosa, recordando que la tensión de los pines de beaglebone es 3,3V. Así que ni se te ocurra conectar directamente algo a 5V al pin!

Biblioteca BeagleBone-Tools

Todo esto es muy bonito pero nada práctico. Por este motivo he desarrollado una biblioteca en python para hacerlo muy fácil de utilizar. Como en casos anteriores, he tratado de usar la misma nomenclatura que en arduino. Esto es:

pinMode(pin, modo): Poner un pin en modo “in” o en “out”
digitalWrite(pin, valor): Escribir un valor en el pin

Clonamos el repositorio: git clone https://github.com/maxpowel/BeagleBone-Tools.git
Entramos en el directorio BeagleBone-Tools/gpio

Abrimos el archivo example.py y vemos que con 3 líneas de código hacemos todo lo que hemos hecho antes. Estas líneas son:
import gpio  # Cargar la librería

gpio.pinMode(“P8_3”,gpio.OUTPUT) # Poner el pin P8_3 en modo out
gpio.digitalWrite(“P8_3”,gpio.HIGH) # Encender el LED

Para apagar el LED tan fácil como gpio.digitalWrite(“P8_3”,gpio.LOW

Y por último, para desactivar el pin: gpio.freePin(“P8_3”)

Y ya está! Espero que te haya sido útil!

You may also like...

7 Responses

  1. Ale dice:

    Buenas, como siempre un gran tutorial y una gran aportacion con la libreria.
    Queria hacerte una pregunta que no esta relacionada con el tema pero me parece que lei que le habias metido mano al tema.
    Se trata de los dispositivos udev, resulta que e creado una serie de reglas para que me detecte un dispositivo la BeagleBone y lanze una aplicacion cuando lo detecte, el problema que me surge es que al iniciar el sistema intenta arrancar el programa un gran numero de veces, lo que hace que tarde un poco mas en arrancar y no se porque.a ver si me puedes hechar una mano con el tema.
    Gracias
    P.D. Si puedes escalar las imagenes mejor, porque son demasiado grandes y se comen hasta la columnas del blog
    Un saludo!

  2. Maxpowel dice:

    Buenas, segun tengo entendido udev lanza un evendo cuando conectas y otro cuando desconectas.

    Yo lo que hago que al conectar el dispositivo, se ejecute un comando lanzando el programa y guardando el pid en un fichero.
    Luego hacer que ejecute un comando cuando se desconecte, haciendo que ese comando lea el pid y cerrando la aplicación.

    A ver si miro lo de las fotos que con este wordpress es un poco lioso (o yo un torpe :P)

  3. Ale dice:

    Gracias, yo lanzo directamente el programa, sino te importa me podrias pasar el codigo para que le eche un vistazo a ver si logro que funcione bien.
    Un saludo!

  4. Ale dice:

    Buenas de nuevo, he intentado siguir lo de upnp, pero no se a que comando te refieres y sigo igual. lo que tengo puesto en mi regla cuando se descubre el disposivo es : ACTION==”ADD”,PROGRAM==”/prueba/Main”
    Saludos!

  5. Cristian dice:

    Hola muy buen tutorial,

    Me gustaría saber como puedo hacer esto mismo pero poder gestionarlo desde internet. Me explico poder apagar y encender el led desde internet.

    No se si tienes algún proyecto parecido que me puedas mostrar o que me pueda orientar.

    quedo atento a tus comentarios.

    Saludos

  6. Cristian dice:

    Hola muy buena explicación.
    Me gustaría saber si esto lo puedo llevar a una pagina web php para poder encender el led desde allá.

    Saludos

  7. Cristian dice:

    Hola como hacer que los gpio se inicien automáticamente con el sistema de beaglebone ?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *