
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:

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

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

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):

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:

Espero os haya gustado y sobre todo os sirva.
Javier Rodicio
2 Trackbacks & Pingbacks
Comments are closed.