Comunicar una app de Android con un arduino utilizando la api de Bluetooth (2/2).

En el artículo anterior presentamos un sketch para emitir información desde un arduino leonardo utilizando un transceiver Bluetooth de bajo coste, el HC-06.

A continuación presentamos el código fuente de la app de android que recibirá esa información a través del bluetooth y la presentará en la pantalla.

Los materiales que necesitas para este ejercicio son un arduino Leonardo, y un transceiver bt, el HC-06. Posiblemente puedas hacer lo mismo con cualquier Arduino que tengas a mano.

[AMAZONPRODUCTS asin=»B008V5PZC4″]

[AMAZONPRODUCTS asin=»B00H07UJL6″]

[AMAZONPRODUCTS asin=»B013GB27HS»]

 

 

Nuestra app de android consta de tres clases:

  • Inicio Activity: la clase principal de nuestra aplicación, que crea la interfaz gráfica y crea la tarea asíncrona que recibe la información del dispositivo bluetooth.
  • MiAsyncTask: una implementación de la clase AsyncTask del framework de android, para facilitar la ejecución de tareas en segundo plano y poder transmitir información a la actividad para pintarla en nuestra interfaz gráfica.
  • Temperatura.java: Un pojo para poder transmitir la información desde nuestra tarea asíncrona a la actividad principal.

A continuación, el código fuente de la app.

InicioActivity.java

 

MiAsyncTask.java

 

Temperatura.java

El layout de la actividad principal:

Y finalmente, el manifiesto de la app;

18 comentarios en “Comunicar una app de Android con un arduino utilizando la api de Bluetooth (2/2).”

  1. Saludos Roque, tengo entre manos un proyecto para controlar un parking. La parte relevante es un pic(no podemos usar arduino) que enviara un numero por bluetooth, al movil que lo tendra que guardar y mostrar por pantalla, luego el usuario pulsando un boton devolvera el numero por bluetooth.

    El problema esta en que no tengo mucha idea de java ni programar para android, he visto varias apliaciones que me pueden ayudar y estoy intentando usarlas y modificarlas pero no llego a nada en claro, esta que tu explicas a qui es bastante parecido a lo que necesito, pero no consigo ni si quiera compilar lo que explica.

    Este es mi correo por si quieres ponerte en contacto arnaupereztalens1@gmail.com
    Cualquier ayuda es bienvenida muchas gracias. Saludos.

  2. Hola Roque, queria agradecerte y felicitarte por los articulos, han sido de mucha ayuda y entendimiento para mi, con suerte he logrado ejecutar y entender todo lo que explicas, pero estoy tratando de mover dos motores con scrollbars o seek bars en android, es decir quiero escribir o enviar datos por el puerto serial, si no entendi mal usas inputStream para leer, es suficiente usar un outputStream y un bufferRead para enviar datos al arduino es decir outputstream.write seria posible que puedas explicarme o aniadir un metodo sencillo que escriba en el puerto serial. Otra pregunta es, se necesita que el nuevo metodo para escribir en el puerto serie este en el AsyncTask o directamente en la activityInicio?, porfavor podrias ayudarme o explicarme, te agradesco de antemano por todo el material mostrado.

    • Perdon se me ocurrio otra pregunta, es posible enviar y recibir datos al mismo tiempo por el puerto serial, es decir si envio datos para encender, disminuir velocidad de un motor, recibire asi mismo los datos de la temperatura?.
      Solo basta con escribir en el puerto serial, y el puerto serial del arduino escuchara todo, o son dos puertos diferentes, 1 el del arduino y otro el de android?, He llegado a confundir mucho el funcionamiento, por lo que no logro aclarar el proceso para poder porgramarlo, seria inmesa tu ayuda, muchas gracias.

  3. Hola Alex,

    muy interesantes tus preguntas. Lo primero que tengo que decir es que no estoy muy seguro de la respuesta, porque la experiencia que tengo programando puertos serie proviene mas bien de PC’s, no de arduinos ni de la interfaz bluetooth de android.

    Por lo que he googleado por ahi, el protocolo RS232 si permite enviar y recibir datos simulataneamente, pero lo cierto es que yo nunca lo he usado asi, ni en un pc, ni en un arduino, ni en android. Y tambien hay que decir que equiparar una conexion entre dispositivos bluetooth a una conexion serie, no se hasta que punto es correcto.

    El resumen hasta aqui, es que lamentablemente, no tengo ni idea :S. Habria que sentarse unas cuantas horas, y hacer un par de proyectos de demo, y probar, a ver que se puede hacer y que no.

    Lo que si creo poder responder, es que efectivamente, de alguna manera tendras que gestionar la comunicacion con el arduino con una tarea asincrona, o un hilo (Thread). Sino cuando envies o recibas informacion, posiblemente la app se bloqueara. Y si tienes que estar enviando y recibiendo constantemente como parece ser el caso de tu app, pues tendrias que usar Thread. Posiblemente una asynctask no te sirva, porque este tipo especiales de threads estan enfoncadas a ser creadas, ejecutar una tarea, y morir, no a vivir mucho tiempo y realizar un proceso continuo.

    En fin, siento no ser de mas ayuda, pero para poder responderte, tendria que haber hecho un proyecto igual al tuyo 🙂

  4. Que tal Roque, ps bueno bueno como te habia dicho antes, necesitaba leer y escribir en el arduino desde android mediante Bluetooth, el cual usa el puerto serie para poder transferir datos. Al fin pude encontrar lo que necesitaba para poder hacerlo y tenias razon es mediante hilos.
    No es mi codigo, pero es de lo q yo me base para poderhacerlo. Dejo el link de la pagina para que puedan revisarla:

    http://english.cxem.net/arduino/arduino5.php

  5. Hola Roque,
    Estoy leyendo tus artículos y me parecen muy interesantes. Estoy en un proyecto que utiliza hardware pero no es arduino. conecto la placa a una tablet android con un adaptador ft232R usb. me comunica perfectamente y recibo datos sin problemas.
    El problema es que programo con Android Studio y necestio depurar la aplicación para las pruebas.
    Necesito saber si hay alguna manera de conectar el hardware al pc y poder realizar las pruebas a través de la máquina virtual (AVD). ya que sino no se donde están los errores.
    Cada vez que modifico algo, lo instalo en la tablet y pruebo el hardware, si falla es un poco complicado saber donde está el problema.
    Gracias de antemano.

    • Vaya, te traes un problema interesante entre manos. Desconocia la existencia de ese adaptador, he estado googleando un poco, pero bueno, no puedo ayudarte demasiado.

      Lamentablemente no tengo ni idea de como puedes conseguir lo que quieres. Lo unico que se me ocurre es que te instales el emulador de Genymotion, que seguramente ya lo conoces y estas utilizandolo porque es mucho mas rapido que el emulador oficial de android.

      Por debajo del emulador de genymotion lo que hay es una maquina virtual de Virtualbox. Recuerdo que en alguna ocasion, en una instalacion virtual de windows xp en virtualbox, hice una redireccion de puertos serie, del puerto serie del pc anfitrion, a la maquina virtual de windows XP. Y funcionaba!

      No digo que funcione con una maquina virtual de android, pero por intentarlo. Quizas si googles un poco mas, encuentres algo.

      Otra opcion que se me ocurre es de alguna forma, snifear los datos del adaptador que usais. En la empresa que trabajaba antes, trabajabamos mucho con comunicacion entre pcs (y otros «cacharros» que no eran pc’s) por puerto serie. A veces no quedaba mas remedio que observar de alguna manera la comunicación entre ambos dispositivos cuando no podiamos meterle manos a los programas por no tener el fuente, o lo que fuera. Tenia un par de compañeros en el dpto de mantenimiento de la empresa, que me habian construido un cable especial de tal manera que podia conectarlo a los dos dispositivos y a un portatil, y recibir la misma informacion que uno de los dos equipos… No se si me explico.

      Quizas exista algo similar, un adaptador usb serie para android, en el que puedas conectar no solo tu dispositivo especial, sino que puedas tenerlo conectado tambien al ordenador y tracear.

      Si encuentras algo, no dejes de decirmelo.

  6. Hola Roque, a ver si puedes ayudarme, estoy haciendo un coche teledirigido con arduino, mi idea es controlarlo a través de un app que estoy creando con el app inventor a través de bluetooth, me ayudaría saber si hay alguna forma en la que pueda ver lo que está recibiendo el arduino(cuando uso la app) a través del monitor serie.

  7. Hola Buenos días este código es de JAVA verdad? y se puede programar en Netbeans o puedo usar app inventor

    • Hola que tal,
      si, el codigo es java, y si yo fuera tu lo intentaria programa en Android Studio, o en su defecto en Eclipse. No conozco a fondo app inventor, pero no creo que puedas programar esta app con el.

      Un saludo.

  8. Hola Roque buenos dias. Estan muy buenos tus articulos estan muy interesantes.
    QUisiera saber si me pudes ayudar en algo. Estoy usando Android Studio para un proyecto. Tengo una aplicacion desarrollada en la cual envia la ubicacion de una persona por medio de GSM. Ahora estoy necesitando usar Arduino y por medio de un boton externo enviar desde arduino hacia android y se ejecute ese codigo de enviar la ubicaion me podrias ayudar a resolver esa parte.

    Gracias de antemano.

    • para poder darte mi opinion necesito una idea mas clara de la arquitectura de tu proyecto. ¿Que clase de Arduino usas? ¿Que hace el arduino exactamente? ¿CUal es el papel del dispositivo android? Hablas de enviar la posicion, pero, ¿a donde?

  9. Hola una pregunta el método onTaskCompleted es propio de android , o lo has definido tú es k he googleado y aparece en varios códigos por la web, cual es su función y para k lo usas ? Cual es su implementación? Cumple algún fin para esta aplicación ? Lo mismo para onTaskCanceled? Hay tutorial sobre esos métodos.Un saludo y mi correo es junaries54976@gmail.com

    • La actividad InicioActivity, implementa la interfaz MiCallback, que tiene definido entre otros, el metodo que tu dices, «onTaskCompleted». La tarea asyncrona MyAsyncTask, recibe una instancia de la actividad como parametro, por lo tanto, puede tener acceso a los metodos publicos que obliga a implementar la interfaz MiCallback.

      Cuando la tarea asincrona termina sus trabajos, en el metodo onPostExecute, invoca el callback.onTaskCompleted. Como la actividad principal tiene implementado el interfaz del que hablamos, el resumen de todo esto, es que al terminar de ejecutarse la tarea asincrona, saltas a la actividad principal, al metodo onTaskCompleted.

      Sobre el nombre en si mismo, no es importante, puedes llamarle como quieras. Podriamos haberle llamado alTerminarTarea. Pero desde mi ignoracion, creo que cuanto mas se programe en ingles, mejor (consejo que yo mismo doy, pero a veces no sigo, como en estos ejemplos).

    • Hola, he tenido un pequeño problema con la plantilla de wordpress. Ya deberia estar ahi el codigo de nuevo. Un saludo

Los comentarios están cerrados.