Como manejar puertos GPIO en Android

GPIO UART Ports Android Z6C Board
GPIO UART Ports Android Z6C Board

Esto es sólo una pequeña guía de iniciación general al manejo de puertos GPIO desde el sistema operativo Android. Sin duda el poder controlar el hardware que rodea a nuestro sistema operativo es algo magnífico y que interesa a muchos desarrolladores y aficionados a la electrónica. Hoy hablaremos un poco sobre esto, si has llegado aquí buscando información para iniciarte, lee atentamente. Si ya eres usuario avanzado quizás lo veas básico, de cualquier manera intentaré no hacerlo demasiado largo y bastante sencillo.

 

LOCALIZANDO LOS PUERTOS GPIO EN LA PLACA

Partimos de una placa base con sistema Android, en mi caso he elegido la del ZERO Devices Z6C Lite (Rockchip RK3188) que estará próximamente en el mercado si no hay cambio de planes, como que al final sólo salga su hermano mayor ZERO Devices Z6C Pro (Rockchip RK3288) aunque de ser así en próximos artículos se publicaría la información necesaria.

Por supuesto decir que estos productos están pensados para ser “plug&play” por parte del un mercado general y no como placas de desarrollo (development board), simplemente la estamos usando como ejemplo práctico sobre un producto comercial.

En primer lugar una foto de la placa en cuestión:

Motherboard ZERO Devices Z6C Lite
Motherboard ZERO Devices Z6C Lite

 

Ahora vamos a localizar puertos disponibles en la parte posterior. Nos fijamos en este lugar:

Placa base ZERO Devices Z6C Lite
Placa base ZERO Devices Z6C Lite

 

Y aun más cerca localizamos los puertos que nos interesan y están disponibles:

GPIO UART Ports Android Z6C Board
GPIO UART Ports Android Z6C Board

 

Aquí podemos ver el puerto GPIO222, GPIO223 e incluso los pines RX-TX del UART. Tened en cuenta que los conectores RX-TX-GND que aparecen más abajo remarcados en un rectángulo blanco son sólo para DEBUG y no los podremos utilizar para comunicarnos en nuestros proyectos. De todas formas ahora sólo hablaremos de los GPIO (Genaral Purpose Input Output) para esta placa con OS Android.

Bien, no nos meteremos en traer los puertos al mundo JAVA y así programar una APK para controlarlos ni entraremos en códigos nativos NDK en C# o C++ o creación de drivers para poder optimizar el timing. Este artículo sólo pretende enseñar la parte inicial básica para tener el control y generar un “Hola mundo” por ejemplo con un LED.

 

ACCEDIENDO A LOS GPIO DESDE ANDROID

Vamos a hacerlo todo desde el terminal y de forma sencilla. Encendemos el ZERO Devices Z6C y (tras las configuraciones básicas) vamos al Google Play.

Nos descargamos el Emulador Android Terminal Emulator

Una vez instalado lo abrimos y veremos la consola de comandos y tendremos algo así (los colores pueden variar):

Android Terminal Emulator
Android Terminal Emulator

 

El Z6C (al menos en su versión Android 4.2.2) nos dará acceso ROOT de fábrica, por tanto ya podemos ir a por el puerto que nos interese. En este caso será el GPIO222 y si no estubiera libre el GPIO223

Desde el terminal veremos:

$

Pediremos acceso ROOT (super-user) escribiendo:

su

Y ahora veremos que ha cambiado a:

#

Siguiente paso será ir a la raíz de los puertos GPIO. Se podría hacer en una sóla linea, pero así probablemente al principio te sea más sencillo y verás lo que estás haciendo:

cd sys/class/gpio

Por lo que veremos que nos hemos situado en ese directorio. Si lo deseamos podemos ver el contenido tecleando:

ls

Como vemos hay 4 grupos de GPIO. Ahora debemos decirle a nuestro sistema que deseamos usar un puerto en cuestión, esto se llama “exportar” el puerto. Además de los grupos de GPIO podemos ver “export” – “unexport”. Export obviamente sirve para reservar el puerto y unexport para dejarlo libre nuevamente. Pero primero necesitamos cambiar los permisos, como sólo es un test daré siempre permisos 777, dependiendo de lo que hagamos deberíamos pensar exactamente los permisos que podemos otorgar.

chmod 777 export

Así podremos exportar los puertos llamando a “export”. Vamos a pedir el puerto GPIO222

echo 222 > export

Y comprobamos lo que tenemos ahora en el directorio:

ls

Ahora vemos que hay un nuevo directorio llamado GPIO222. Accedemos a el:

cd GPIO222

Nuevamente miramos lo que hay dentro:

ls

Veremos que hay varias cosas, las más importantes para nosotros son: “direction” y “value”. Mientras que “direction” determina si el puerto es de entrada (IN) o salida (OUT), “value” servirá, en caso de ser una salida, para ponerlo en estado alto (HIGH – “1” lógico) o bajo (LOW – “0” lógico). En caso de que el puerto sea utilizado como entrada el valor de “value” servirá para saber si estamos recibiendo un HIGH (“1” lógico) o un LOW (“0” lógico). Ya que pretendemos hacer un simple “Hola mundo” encendiendo y apagando un LED, le daremos la dirección de “SALIDA”. Primero daremos permisos:

chmod 777 direction

chmod 777 value

Y ahora estableceremos el valor como salida:

echo “out” > direction

Podemos comprobar en todo momento el valor tanto de “direction” como de “value” por si no estamos seguros:

cat direction

Y nos devolverá, en este caso, “out”. Si deseamos que sea una entrada necesitamos un “in”:

echo “in” > direction

Eso sí, recordamos que pretendemos encender un LED, así que lo dejamos como salida nuevamente en “out”.

echo “out” > direction

Ahora lo más fácil es conectar el LED, podemos utilizar mil formas, yo para estas pruebas suelo utilizar los cables de un multímetro ya que permiten apoyarlo sobre el pin y conectarle el LED al final del cable (además estos terminales se conectan a la vez fácilmente al osciloscopio, aunque no os hace falta complicaros con tantas cosas ahora). Debemos saber que este GPIO es el polo positivo + y que por tanto la otra pata del LED la debemos conectar a GND, podemos utilizar tambien el otro cable del multímetro y el final conectarlo al armazón de un puerto USB por ejemplo.

 

ENCENDIENDO UN LED DESDE UN GPIO CON ANDROID

Bien, ahora encenderemos el LED si todo ha ido bien. Ya lo hemos configurado como salida, ahora debemos darle un valor alto (HIGH) que serán unos 3.6V si lo medimos. Tecleamos:

echo 1 > value

Si lo que queremos es apagar el LED le daremos valor bajo LOW, con lo que tendremos 0V:

echo 0 > value

En este punto ya estareis pensando que controlar todo esto desde el mundo JAVA sería perfecto. Se puede, aunque eso ya forma parte de una nueva historia.

Programando una sencilla sencilla aplicación para Android hasta mi hijo de 2 años puede encender y apagar el LED mientras come:

Kevin encendiendo un LED - GPIO Android
Kevin encendiendo un LED – GPIO Android

 

Espero os haya gustado y sobre todo os sirva.

Javier Rodicio

Loading Disqus Comments ...
Loading Facebook Comments ...