Android, ADK, Arduino y otras hierbas
Este semestre tuve la fortuna de asistir a unas clases de Robótica, presididas por el profesor John Nicolls, en donde a parte de otras cosas he podido, al fin, jugar un poco con Arduino, algo que había querido hacer siempre pero para lo cual no se había presentado oportunidad.
Aún mejor, tuve la oportunidad de trabajar con una plataforma relativamente nueva llamada ADK (Accessory Development Kit), presentada en el Google I/O 2011 (en Mayo), la cual permite controlar dispositivos externos de hardware mediante un terminal Android. Así pues con esta quimera: Android y Arduino, me divertí bastante durante un par de semanas y en este artículo pretendo documentar un poco lo aprendido. No se trata de un tutorial paso a paso; más bien un punto de partida para los que quieran profundizar en el tema.
Antes que nada, aclaremos algunos conceptos:
- Arduino: es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares [wikipedia]
- Shield: es un complemento para tarjetas Arduino que extienden sus capacidades ofreciendo nuevos servicios, por ejemplo: puertos de red, tarjetas bluetooth, etc.
- ADK Board es una tarjeta Arduino modificada que está preparada para trabajar usando el Open Accessory Protocol. Es básicamente una tarjeta Arduino Mega con un shield USB embebido. Sin embargo, es posible utilizar el ADK con una tarjeta Arduino normal (por ejemplo, la board UNO) y un shield USB.
- El paquete ADK incluye básicamente: el firmware para las tarjetas Arduino, las especificaciones del hardware (recordemos que es Open Hardware) y un programa de ejemplo (un proyecto de Android y el sketch de Arduino), etc.
Pre-requisitos
Por supuesto, debemos contar con un terminal Android. Lo ideal es que sea un tablet corriendo Android Honeycomb. Según este artículo escrito por Dan Noguerol, las siguientes tablets soportan ADK: Motorola XOOM, Acer Iconia A100, ASUS Eee Pad Transfomer TF101 y Samsung Galaxy Tab 10.1. En mi caso, tengo una Acer Iconia A100, que es lo más barato que pude conseguir en Amazon
El soporte oficial para el ADK se encuentra desde la versión Honeycomb de Android, en donde se pueden utilizar las clases del paquete android.hardware.usb. Sin embargo, el equipo de Android proporciona un paquete de compatibilidad, que permite utilizar dichas clases en dispositivos corriendo Android 2.3.4 (Gingerbread) o superior, lo cual quiere decir que no solo funciona en tablets sino también en dispositivos móviles.
Configuración del ADK
No voy a entrar en detalles acerca de cómo configurar el IDE de Arduino y de Android, puesto que eso ya está muy bien detallado en la documentación oficial: Installing the Arduino software and necessary libraries. De hecho, me parece que Alex de BricoGeek lo explica de una manera muy directa y fácil de seguir en su artículo: El ADK de Google en Arduino UNO, que además incluye el esquema de hardware que hay que montar:
Puesto que los de Google y BricoGeek ya documentaron la parte de la configuración, solo voy a aportar un poco de información acerca de un problema que, al parecer, es bastante común al momento de preparar nuestro Android para usar el ADK (asumo de antemano que ya tienen un dispositivo corriendo Gingerbread). Esto puede aparecer al momento de instalar la aplicación:
W/PackageManager( 162): Package couldn’t be installed in /data/app/your.package.YourApp.apk
Este es un mensaje que aparece cuando el dispositivo no tiene instaladas las librerías necesarias para usar el ADK (o no están configuradas correctamente).
Lo primero que debemos constatar en este caso es que el archivo com.android.future.usb.accessory.jar se encuentre en el directorio /system/framework/ del dispositivo. Este es la librería que contiene las clases del ADK. Además, debe existir el archivo android.hardware.usb.accessory.xml en el directorio /etc/permissions/ con el siguiente contenido:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- This is the standard feature indicating that the device supports USB accessories. -->
<permissions>
<feature name="android.hardware.usb.accessory" />
<library name="com.android.future.usb.accessory"
file="/system/framework/com.android.future.usb.accessory.jar" />
</permissions>
La solución la leí de hpsaturn, un entusiasta Colombiano de Android y el software libre, que al parecer tuvo este problema hace tiempo.
Más allá del Hola Mundo
El ejemplo incluído en el ADK utiliza prácticamente todos los aspectos de la API (sensores de luz, servo motores, análogos, etc), y luce así:
Sin embargo, creo que es un poco complejo, lo cual hace que difícil de entender para las personas que hasta ahora están comenzando. Como alternativa, me gustaría compartir con ustedes un ejemplo mucho más sencillo en donde básicamente se utiliza el ADK para controlar un brazo Scara desde una tablet. El resultado es el siguiente (ignorar el introito del video; no estaba en mis cabales ese día):
Este ejemplo me parece un poco más práctico y fácil de montar. Lo único que se necesita, obviando el brazo, son 3 servo motores. El código se puede descargar desde este repositorio Git (en el README está el sketch de Arduino).
La idea es bastante simple; desde el tablet se hacen los cálculos de la cinemática inversa (es decir, calcular el ángulo que deben tener los servos a partir del punto en el cual queremos que el brazo ponga la mano). Posteriormente, se envía al Arduino los ángulos calculados y este a su vez actualiza la posición de los servos.
Lo importante aquí, y para concluir esta entrada, es reflexionar un poco sobre la manera tan fácil y rápida con la que se pueden desarrollar aplicaciones de robótica usando las librerías mencionadas. No hace falta ser un gurú de la electrónica ni mucho menos de la programación… la parte difícil ya está hecha, solo queda la parte más divertida: dejar que nuestra imaginación guíe los proyectos.
21 Comentarios | deja el tuyo






Excelente tu post, funciona muy bien, y es más
didáctico aprender con este ejemplo,
Saludos.
Gracias por la información que usted publica en este blog, pero mi mensaje es para saber el estado del servicio RSS, a mi me sale un mensaje de error indicando que el servicio de suscripcion mediante feeds no esta disponible. ¿Quisiera saber si es temporal y tendrá solución pronto?, y discúlpeme si habrá recibido algún mensaje similar vía twitter o facebook, es que yo no uso esos servicios.
Gracias por su tiempo en compartir sus conocimientos, disculpe las molestias y éxitos.
Att: Gaturro
Muahahaha esto es la caña. Acabo de pillarme un pack básico de Arduino. Poco a poco voy a ir comprandome piezas para hacerme mi avión teledirigido. Un saludooo!
Excelente!
Muy motivante.
Hola, muy práctico el blog. El ejemplo es claro y desde el ejemplo se pueden crear otros diseños. Sin embargo me surge una duda. Veo que se puede controlar cualquier tipo de periféricos, pero tienes que tener físicamente un dispositivo android enganchado mediante USB….. y desde ahí pilotarlo… pero ¿qué posibilidadeshay para gobernarlo remotamente?… ¿Se le podrían pasar los estado por ejemplo por 3G, o utilizar un servidor web para recoger los estados y modificarlos???.
Muchas gracias
Bueno, si quieres controlar algo remotamente a corta distancia, te recomendaría el shield de bluetooth de Arduino. Si ya quieres algo más grande, puedes comprar shields para receptories wireless (yo creo que son de 2.4 Gz) o incluso shields GPS.
Ya es cuestión de imaginación, porque esos componenetes ya están hechos.
Un saludo.
Hola Cristian:
En primer lugar enhorabuena por el artículo y por tu web en general, siempre me ha sido muy útil.
Mi duda es la siguiente: ¿en qué lenguaje se programa Arduino para ser manejada con un dispositivo Android? ¿Con Processing o con Android desde Eclipse? He buscado mucho por Internet pero no lo tengo claro.
Un saludo y muchas gracias.
Se programa en los dos. Lo que es específico de Arduino, lo programas en Processing. Lo que tenga que ver con el celular, lo programas en Java (no tiene que ser eclipse + adt, puede ser por ejemplo IntelliJ (un IDE de verdad)).
Lo que hicieron los de Google fue básicamente una interfaz mediante la cual se pueden comunicar el programa de arduino y el programa de Android.
Un saludo.
Hola:
Muchas gracias por tu respuesta y por tu rapidez. Ahora ya lo tengo claro. Tampoco sabía lo de IntelliJ, me informaré sobre este IDE.
Un saludo y enhorabuena por tu web.
Hola, muchas gracias por el tutorial, me podr[ias explicar un poco mas en detalle que fue exactamente lo que hicieron los de google para comunicar arduino con android, un protocolo (open accesory si no estoy mal) o unos driver, etc?, En fin, seria de gran ayuda si nos explicas bien. Por cierto he visto en el primer video que usan un joystick generico, pero en otros videos he visto que usan una placa tipo shield con este joystick y con el logo de google o de android, no recuerdo bien cual de los dos, en fin, en este video usan el mismo ejemplo y la misma app que usaron con la otra shield?, es este el proyecto demo que viene con el ADK?, muchas gracias
no conocía el ide de intelliJ, parece interesante. Solo que veo que hay versiones de paga y una gratuita, cual es en si la diferencia??
saludos desde México
http://www.jetbrains.com/idea/features/editions_comparison_matrix.html
Saludos!
Android, ADK, Arduino y otras hierbas http://t.co/1fTUDNJs Recomendado para los que inician en este tema… #fb
Android, ADK, Arduino y otras hierbas … http://t.co/njbDugwT
“@papachan: Android, ADK, Arduino y otras hierbas … http://t.co/T38xk8mZ” #Imperdible #Android #Arduino #ADK
Funcionara en un sony ericcson experia?
No creo que funcione directamente. Tal vez si le instalas una ROM que venga preparada para esto, puede funcionar.
Saludos.
Gracias a usted que comparte a los otros
Hola cristian, gracias por el post. Quiero preguntar algo que esta fuera del tema, pero bueno. yo estoy empezando a documentarme en android y a desarrollar aplicaciones de android en eclipse. como podría probar esas aplicaciones en un emulador de android, en este caso con youwave. ya que el emulado que tiene eclipse demora una eternidad cargando. Gracias por tu colaboración.
Hola Adolfo.
Lo único que te recomiendo es que compres un celular. Hay muchos que son económicos pero que van de maravilla para comenzar a desarrollar.
Un saludo.