Android + Processing + Bluetooth

A finales de 2009 los creadores de Processing anunciaron que iban a dar soporte a la plataforma de Android. La verdad es que fue una noticia muy buena, ya que el famoso entorno de creación de gráficos animados iba a poder ejecutar sketchs dentro de móviles que tuviesen a Android como sistema operativo. Pero no se han quedado ahí y además admite la posibilidad de usar las características embebidas en los dispositivos móviles como el GPS, la brújula electrónica, enviar y recibir sms, etc y por supuesto bluetooth.

Lo que explicaré en este artículo son los pasos que he seguido para crear una conexión desde mi teléfono Android con un dispositivo bluetooth y poder enviarle información a la par que recibirla dibujando los resultados de una forma gráfica con Processing para Android.

Ya en su momento me dediqué a programar en symbian algo parecido:

Sin embargo finalmente lo deseché porque la plataforma de symbian tiene ya poco futuro y porque las APIS eran confusas, mal explicadas y no se puede acceder a todos los elementos de hardware con ellas.

Por otra parte no hay que compararlo con Amarino, ya que Amarino es una aplicación ya hecha para Android con una interfaz definida y está pensado para usarse con Arduino, sin embargo aquí vamos a programar nuestra propia aplicación con su propia interfaz para cualquier dispositivo que tenga un controlador bluetooth.

Dicho esto lo primero es necesario instalar todo el entorno de desarrollo, aquí viene bien explicado en castellano por lo que no considero necesario añadir más.

Antes de empezar, sería interesante que echarais un vistazo a dos páginas para entender mejor lo que viene a continuación. Por una parte la API de Android para bluetooth para comprender qué posibilidades nos ofrece. Por otra parte unos conceptos y un ejemplo de cómo usar Android y gestionar el hardware con Processing. A los que hayáis programado en Processing puede resultar extraño que además de poder usar las funciones básicas del entorno, se puedan incluir librerias y código de Java y la API Android. Esto es debido a que tanto Android como Processing tienen una fuerte vinculación con el lenguaje de programación Java y su unión ha creado una suerte de mescolanza que reúne lo mejor de ambos mundos.

El objetivo es que podamos crear una interfaz completa para que nos muestre los dispositivos bluetooth que hay alrededor, a continuación podamos elegir uno de ellos y finalmente conectarnos a este para enviar y recibir datos. En este caso en concreto voy a conectar mi móvil HTC Wildfire S con una placa Arduino a través de un módulo bluetooth. La placa Arduino enviará a mi móvil cada segundo un valor comprendido entre 0 y 39 y este lo mostrará en su pantalla. En el móvil habrá dibujado un botón que cuando se pulse enviará un 0 a la placa Arduino para encender o apagar el led del pin 13.

Este es el código fuente del sketch para la placa Arduino:

Ahora la parte de Android y Processing. A partir de aquí iré explicando los conceptos a medida que publico el código fuente para comentar los aspectos que considero que son más relevantes y finalmente pondré el código fuente integro.

Para poder programar el bluetooth de nuestro dispositivo basado en Android junto con Processing empezaremos por crear un sketch, daremos los permisos BLUETOOTH y BLUETOOTH_ADMIN en el menú Android/Sketch Permissions e importaremos las clases necesarias para que todo funcione:

Hay algunas librerías que, como veremos más adelante, podemos prescindir de ellas dependiendo de lo que queremos hacer y lo bien o mal que nos funcione.

A continuación vamos a añadir los métodos típicos de un sketch de Processing: setup y draw:

En el método setup forzamos a que la resolución de la pantalla sea de 320 píxeles de ancho x 480 píxeles de alto (HVGA), ya que es una configuración muy extendida dentro del mundo de los móviles. Establecemos que la frecuencia de refresco sea de 25 fps. Creamos dos tipos de fuentes con las que dibujar después los textos que queramos.

En el método draw vamos a simular varias ventanas dependiendo del estado en el que se encuentre nuestra aplicación en cada momento. Así nada más empezar se muestra la ventana de búsqueda de dispositivos, a continuación se ofrece al usuario que seleccione uno de los dispositivos mostrados:

Después se intenta conectar con el dispositivo elegido y finalmente si tiene éxito se muestra la ventana con los datos enviados por Arduino y con el botón que mencionaba antes:

Si algo falla se muestra el error en una ventana:

Un sketch de Proccesing para Arduino se trata como una Activity, por eso se puede inicializar todo en el evento OnStart cuando es llamado al arrancar la aplicación (OnCreate no es llamado).

En el evento OnStart primero debemos llamar al método onStart de la clase padre para inicializar correctamente. Después recuperamos el adaptador bluetooth del móvil y comprobamos si está activo. Si está activo empezamos a mostrar la lista de dispositivos. Si no lo está, lanzamos una petición para activarlo. En esta petición Android nos mostrará un mensaje similar a este en el móvil para activar el bluetooth:

Pulsemos la opción que pulsemos, se llamará al evento onActivityResult:

Si hemos pulsado Si entonces empezaremos a mostrar la lista de dispositivos, si hemos pulsado No iremos directamente a la pantalla de error.

Cuando se abandona la aplicación se llama al evento onStop (onDestroy no es llamado)  y aquí se pueden liberar los recursos que hayamos utilizado antes de terminar definitivamente.

En el evento OnStop vamos a hacer dos cosas, aunque una de ellas está comentada por una razón que explicaré más adelante. Lo que se ve es que se cierra un socket que no es otra cosa que la conexión que hayamos establecido con nuestro dispositivo para poder liberar los recursos asociados a este. Finalmente se llama al método onStop de la clase padre para cerrar correctamente la aplicación.

El método empieza sirve para rellenar la lista de dispositivos bluetooth que más tarde mostraremos al usuario.

Inicializamos un array que rellenaremos de objetos BluetoothDevice. Aquí comento una problemática que me he encontrado: Puedes incluir los dispositivos que hay alrededor del móvil o bien incluir los que previamente se hayan emparejado. La parte que está comentada (y por tanto la del método onStop que desregistra el Receiver) se usa para lanzar un proceso de búsqueda de dispositivos bluetooth que estén cerca de nuestro móvil: se registra el empiece, cada dispositivo que se encuentre y el final de la búsqueda. Para manejar estos eventos se usa una clase del tipo BroadcastReceiver ya inicializada:

Cuando se empieza la búsqueda se encuentra en el estado 0 para mostrar la lista de dispositivos a medida que van apareciendo. Por cada dispositivo bluetooth que se encuentre se añade al array de dispositivos bluetooth, Cuando termina la búsqueda se pasa al estado 1 para que el usuario seleccione el dispositivo al que quiere conectarse.

El hacerlo de esta forma provoca que más adelante cuando se conecte al dispositivo bluetooth se tenga que mostrar una ventana preguntando por un código de emparejamiento para vincular el móvil con este.El problema es que esa ventana no se visualiza cuando están los gráficos mostrándose y el proceso de conexión dará finalmente un error. Por eso la otra alternativa que he encontrado es emparejar el dispositivo bluetooth a mano con el móvil y rellenar la lista de dispositivos con los que ya están vinculados en el móvil, así no pedirá el código de emparejamiento y se conectará con el dispositivo bluetooth directamente.

En varias ocasiones hay que capturar donde pulsa el dedo del usuario para saber qué acción quiere realizar. Esto se consigue con el evento mouseReleased:

Depende del estado en el que encontremos hará una acción diferente. Cuando estamos en el estado 0 y si se usara la búsqueda de dispositivos bluetooth (pero no es así por los motivos que he comentado) al pulsar en la pantalla cancelaría la búsqueda y lanzaría un ACTION_DISCOVERY_FINISHED al BroadCastReceiver visto anteriormente. Si estamos en el estado 1 se buscaría qué dispositivo bluetooth de la lista ha pulsado el usuario para conectarse a el. Si estamos en el estado 3 se comprueba si se ha pulsado el botón que envía un byte al dispositivo bluetooth.

El método que comprueba que elección ha hecho el usuario en el estado 1 es compruebaEleccion:

Con una sencilla fórmula matemática se puede sacar el dispositivo bluetooth que el usuario ha elegido en base a en qué parte de la pantalla ha pulsado. Después se pasa al estado 2 (Conexión al dispositivo bluetooth).

La lista de dispostivos bluetooth se hace con el método listaDispositivos:

Se recorre el array de dispositivos bluetooth mostrando su nombre y su dirección MAC. Es usada tanto en el estado 0 (listado de dispositivos bluetooth a medida que van apareciendo en la búsqueda) como en el estado 1 (selección del dispositivo bluetooth al que conectarse).

La conexión con el dispositivo bluetooth se hace con el método conectaDispositivo:

Aquí ocurre un caso especial. Para conectar con el dispositivo bluetooth se debe crear un socket con el dispositivo y después hacer la conexión propiamente dicha con el método connect. Sin embargo dependiendo de con qué dispositivo se conecte puede dar problemas el método que se use para obtener ese socket. La versión normal es la que está en el metodo y se supone que es la estándar, pero a mi me dio problemas al conectar al blueooth de un PC y tuve que usar las dos líneas que aparecen comentadas . Sin embargo con el módulo bluetooth de Sure la línea que aparece actualmente ha funcionado sin problemas. Como estamos creando una conexión SPP (como si fuese un puerto serie virtual) a través del protocolo RFCOMM, debemos obtener el socket que conecta con el servicio 00001101-0000-1000-8000-00805F9B34FB, que es el identificador único de servicio para SPP en el estandar Bluetooth. El método connect es bloqueante por lo que dejará la aplicación paralizada hasta que se conecte realmente o surja un error. Google dice que se debe usar un thread para separar el hilo de ejecución principal con el de la conexión, pero creo que está solución es más sencilla. Una vez se ha conectado se pueden recuperar el stream de entrada y el de salida para recibir y enviar datos respectivamente con el dispositivo bluetooth. A continuación se pasa al estado 3 (Visualización de datos e interacción con el botón). Si hubiese algún error se pasaría al estado 4 mostrando qué lo ha provocado.

El método que muestra los datos enviados desde el dispositivo bluetooth es muestraDatos:

Simplemente comprueba si se ha recibido algún byte y lo muestra. También muestra el botón ficticio que puede pulsar el usuario.

El método que se ejecuta cuando el usuario pulsa el botón es compruebaBoton:

Si se comprueba que el usuario ha pulsado en el área del botón se envía un byte con valor 0 al dispositivo bluetooth, que actualmente lo que hace es encender o apagar el led de la placa Arduino. Si hubiese algún error se pasaría al estado 4 mostrando qué lo ha provocado.

Finalmente el método que muestra los errores es muestraError:

Simplemente muestra el texto del error de forma apaisada para mostrar cadenas largas.

Dejo el código fuente entero:

314 comentarios en “Android + Processing + Bluetooth

  1. Angel MA

    It is an amazing job, so I couldn’t wait to try it, unfortunately there was a problem when attempting to run the application that says that it suddenly stopped due to a process related to classes.processing.androidtest.bluetooth_android. I hope you have bumped into this problem and could give a possible reason as well as a posible solution.
    Many thanks.

    Responder
      1. Angel MA

        Ohhh. it was configuration mistakes, I should have declared the permissions from the beginning, that was the problem, now i have sent some data to a PIC and viceversa. Thanks a lot and once more: AMAZING JOB!!!!!

        Responder
  2. Pedro

    Está muy bien, te lo has currado!
    Yo te recomendaría hacer más uso de las facilidades que tiene Android como los ListView (http://developer.android.com/resources/tutorials/views/hello-listview.html) para pintar los dispositivos BT. Y para ahorrarte el trauma de calcular si un dedo a pulsado un botón podrías hacerlo añadiendo un Button. Además así valdría para cualquier pantalla 😉
    Donde ando un poco perdido es en la parte del arduino.
    I Like!

    Responder
  3. David Asensio Cañas

    Hola, me parece muy interesante, pero no puedo compilar-lo, te importaría enviarme los archivos al correo creo que es por alguna tontería de código, Y así comparo 😀 gracias de antemano!

    Responder
    1. Oscar Autor

      Hola

      En el código fuente completo que había publicado no se por qué se me cambiaron algunas líneas a una sola y posiblemente ese fuese el error que te estaba dando, lo he cambiado, por lo que prueba a copiar de nuevo el código fuente y compilalo a ver si ahora te funciona.

      Responder
  4. David Asensio Cañas

    Muchisimas gracias ;), me es super util, estoy haciendo un robot humanoide con arduino y lo quiero controlar con un android, así que me sirve de mucho, Merci!

    Responder
  5. Alex

    Hola,

    This looks amazing!

    Which versions of the Android SDKs and tools did you use? I am having trouble compiling the Processing code in Processing 1.5.1 with Android API 7 tools.

    Thanks
    Alex

    Responder
  6. Sophie

    Hello,

    I am very excited about your project. I would like to do something similar.
    Is it possible that you download the entire Eclipse project files up?

    Thank you,
    Sophie

    Responder
  7. David Asensio Cañas

    Una pregunta, la conexión al modulo la haces directamente al 3.3v del arduino y directamente al tx/rx o le pones alguna resistencia diodo o algo?

    Responder
    1. JM Autor

      103 en smd significa 10000 ohmios, el último número es el número de ceros. Por otro lado 10^3 = 1000 que puede ser lo que haya querido poner el chino que ha hecho ese datasheet.

      http://webdelcire.com/wordpress/archives/135 Si lees la entrada verás que dice 1000 ohmios, ante la duda prueba con 10k ya que esa resistencia se encarga de limitar la corriente que pasa por los diodos de protección interna

      Responder
  8. joe

    Hola, excelente trabajo!

    que cambios tendria que hacer para que la aplicación acepte conexiones por el método startActivityForResult(Intent, int) ? saludos!

    Responder
  9. joe

    Gracias por tu respuesta tan rápida! correcto estoy leyendo esa parte, sin embargo como soy nuevo programando android estoy bien confundido, básicamente la necesidad que tengo de que el telefono se comporte como servidor es porque la comunicacion blue2 la estoy realizando desde del telefono a la pc (WIN7), y de esa manera la pc no me deja iniciar la comunicacion, dice no puede abrir puerto CON, lo mismo me pasa con los programas que son terminales blue, siempre la computadora tiene que iniciar la comunicación.

    Responder
    1. Oscar

      Bien. Tenga en cuenta que el artículo habla de conectarse a un módulo bluetooth que actua como servidor. Lo que no entiendo es por qué el PC no le deja actuar como servidor y que el móvil se conecte a este. ¿Con qué programa abre el puerto COM en el PC?

      Responder
  10. joe

    De antemano muchas gracias por tu colaboración!

    estoy usando Teraterm, hyperterminal y el emulador de terminal que trae el software del arduino, como no poseo un modulo quiero probar primero enviando datos desde la pc, el celular se conecta y muestra la pantalla esperando recibir datos, igual el dongle bluetooth que tengo conectado a la pc titila en senial de que inicio conexión pero al abrir alguno de estos programas para enviar datos no abre el puerto COM12 que es el que tomo el celular al vincularse con la pc, esto mismo me pasa con los emuladores de terminal del celular solo me permite conectar si la comunicación la inicia la PC, colocando al celular en modo «discoverable»

    Responder
    1. Oscar

      Bien

      Vamos a hacer lo siguiente. Primero abra el programa hyperterminal y después conecte el móvil al pc.

      Si no funciona vaya al administrador de dispositivos, puertos COM y cambie el puerto COM12 por el puerto COM4 y repita el punto anterior.

      Si no funciona intente ejecutar el primer paso con distintas velocidades (9600, 19200, 57600, 115200)

      Responder
  11. joe

    Actualizo, ya lo pude hacer funcionar conectando a una computadora con win XP. Parce que es un tema de seguridad en win7 que no deja que otros dispositivos inicien la comunicación..

    Responder
  12. jesus

    Hola esta muy bueno lo que haz hecho, me gustaria saber en que cambiaria el codigo para el caso de que yo desee usar el celular como controlador , por ejemplo el mandar a encender el led desde el celular

    Responder
    1. Oscar Autor

      Como puede ver en el vídeo Joe, el móvil es el que manda que se encienda el led o se apague. No hace falta cambiar ningún codigo.

      Responder
  13. Joshua

    Thanks for this tutorial! The main problem I encountered was that I was not able to get my Android phone to receive or send values to the Bluetooth modem until I set the baud rate on the Arduino sketch to 115200.

    I am not sure if the issue I encountered is a result of my hardware or software, so here are the versions of my hardware and software. Hopefully this will help someone else!
    Arduino 0022
    Processing 2.0a4
    T-Mobile G1 running Cyanogenmod 6
    Bluetooth Mate Silver (http://www.sparkfun.com/products/10393)

    Responder
        1. Theelectronicguy

          Lol, the reply button is hidden when there are 2 much replys so I have to write here. Anyways, why is there such a long delay(maybe 10 sec) between sending bytes of data and how can I get over it?

          Responder
  14. Electronicguy

    Hi, I love your post just one problem: It doesnt work well with my phone its hard to select a bluetooth device. I dont need to search for devices pair with them, etc. Can you please show me how to modify code to bare minimum and automatically set the adress of the bluetooth device to «00:11:11:XX:XX:XX»(and automatically connect). So far I cant compile because I cant compare bluetooth to a string.

    Thanks

    Responder
    1. Oscar

      Hi

      In function empieza comment all except estado = 1 and change it to estado = 2. Then in function conectaDispositivo add this line at the beginning: dispositivo = adaptador.getRemoteDevice(MAC ADDRESS) where MAC ADDRESS is the MAC of your bluetooth device.

      Responder
        1. Electronicguy

          I just thought about something. It would be cool if we could program an android phone using processing to connect to the processing app on a computer via wi-fi. Does anyone have an idea how to do that, where to start searching?

          Responder
  15. Luca

    Hi,
    before to start, i would say thank you for the great tutorial.
    Then, i have a question for you.
    I need to make a project for the University: i have to make an android application that use the accelerometer, saves datas in files and sends them via bluetooth!
    I developed the first part, now i will send the files via bluetooth!
    How can i integrate this code with mine?

    In attachment i leave you my code, i hope that you can help me…

    Again, thank you!
    …and everybody «Excuse me» for my bad English!

    See you soon!

    Luca.

    http://dl.dropbox.com/u/47779079/Acc.zip

    Responder
        1. Luca

          Hi again,

          if I would make an application not for Arduino, but for my pc that communicate with application…
          How can i modify this code?

          boolean estado;

          void setup()
          {
          Serial.begin(9600);
          pinMode(13, OUTPUT);
          digitalWrite(13, LOW);
          randomSeed(analogRead(0));
          estado = false;
          }

          void loop()
          {
          delay(1000);
          Serial.write(random(40));
          while(Serial.available() > 0)
          {
          Serial.read();
          estado = !estado;
          digitalWrite(13, estado);
          }
          }

          Because if i try to start this code, without arduino, processing tell me: Cannot find anything named Serial

          Responder
  16. fray

    HOLA tu codigo me parece muy util
    pero por orto lado megustaria saber que se necesita para conectar una impresora (PB2 y PB3 Impresoras Portátiles de Recibos) la idea es mediante la aplicacion android poder imprimir una factura

    Responder
      1. Theelectronicguy

        Oscar, do you have any idea about the problem below? I have reverted to your original code with the addition of apwidgets but I still get a 10-20 sec delay.BTW if you think its the code on the arduino thats the problem(doubt it) here it is:

        int ledpin = 9;
        int value = 0;

        void setup(){
        Serial.begin(9600);
        }

        void loop(){

        if (Serial.available() > 0) {

        value = Serial.read();
        if (value == 1) {
        analogWrite(ledpin,255);
        }
        else if(value ==0) {

        analogWrite(ledpin, 0);

        }
        }
        delay(100);
        }

        Thank you

        Responder
          1. Theelectronicguy

            I dont think my module is broken.If I use the multicolor led example in amarino,its in real time bit amarono is hard to program…

  17. Theelectronicguy

    You gotta fix that reply probrem 😀 . So lets say that I send a value of 100 to the arduino. First time it connects, the arduino receives the value 100(tested with an led). Then if I immediatelly go from 100 to 50(in steps of 5), I wait ten seconds and the the led starts to go from 100 to 50 in a split second. Now, I put a println(DATA SENT) just before the ons.write() and on the computer, I receive DATA SENT a few times per second. So my guess is that its a problem with ons.write(). Any idea?

    Responder
    1. Theelectronicguy

      Ok, I have found the solution, I had to put a 200 millisecond delay and write ons.flush(); after each write. Thank you Oscar for making this tutorial :D.

      Responder
  18. Martin

    Hola, tu codigo esta muy bien planteado y la explicacion mas, pero tengo una duda: en processing como exporto la aplicacion para el android, espero que me puedas ayudar

    Responder
      1. Martin

        Eso si lo lei, pero solamente ejecuta la aplicacion con el cable de datos, lo que me refiero es si se puede pasar la aplicacion APK al celular e instalarlo, sin utilizar el cable de datos

        Responder
  19. Martin

    Hola de nuevo, oye amigo de donde aprendiste a utilizar los recursos para manipular el bluetooth? Existe algun manual o libro donde venga las funciones del bluetooth?

    Responder
  20. Oscar

    Pues la de processing es porque se está usando la API de Android para bluetooth y en este mismo artículo está el enlace donde está la documentación. En cuanto a Arduino no hay que explciar mucho ya que se trata de usar el puerto serie con un módulo bluetooth que puede ver como funciona en este artículo http://webdelcire.com/wordpress/archives/135

    Responder
    1. Martin

      OK, ya vi lo de android, para transferir datos del arduino hacia el modulo bluetooth, se utilizan las mismas instrucciones que la de comunicacion serial?

      Responder
      1. Oscar

        Realmente no hay instrucciones para comunicaciones serie, ya que se trata de enviar y recibir datos, incluso los comandos Hayes son datos que se envían y se reciben aunque en el caso concreto de este módulo bluetooth no se aplica.

        Responder
  21. Oscarcv

    Hola, es genial, ya lo he probado.

    Tengo terminado un programa en VBasic para el PC, y estoy intentando hacerlo para la tablet.En este proceso me he topado con que no puedo introducir delay`s, Es por algún motivo en especial.
    un saludo.

    Responder
  22. Greg

    Hello thank you for the incredible effort your post has been very informative and helpful… still working on getting the sketch to run on my phone. I am planning to use Android Processing to control several servos with my phones accelerometer via bluetooth through my computer as your sketch does. My question for you is in regards to the Ketai Library… I’ve just discovered that they have several bluetooth functions that might simplify your code. Are you familiar with Ketai? What do you think of the idea…

    I must say that I am in the learn by doing phase of programing as such examples are ‘king’ thank you!

    http://www.danielsauter.com/display.php?project_id=113

    Cheers,
    Greg

    Responder
    1. Greg

      Any ideas why the program would be force stopping whenever I run the sketch on my phone, Motorola Atrix? It runs in my emulator though it doesn’t recognize any devices… but whenever I load the sketch onto my phone is doesn’t open or run.

      Responder
    2. Oscar Autor

      Hi Greg

      This post was published on August 13th, 2011, however the Ketai library with bluetooth support was released on Mar 10, 2012 ( http://code.google.com/p/ketai/downloads/detail?name=Ketai_v4.zip&can=2&q= ) So in that time I had not any libraries for bluetooth with Arduino and Processing, then I studied the Android API to explain everybody how to make it works.

      I think that a library like Ketai is good for developers who wants to abstract from low level code.

      Regards.

      Responder
      1. Greg

        Thanks for the reply… seems like the Bluetooth Ketai library is still experimental so don’t think I’ll use it yet… just thought I’d mention it for those online searching for ways to connect via Bluetooth and Processing to Arduino.

        Cheers,
        Greg

        Responder
  23. Conor

    Where in the code do you print the incoming bluetooth packets to the middle of the screen? Also, is there a place where I can get all of the source code in the order it was written in? For me, the source code at the bottom of your post has a lot of the text removed (and placed above).

    Responder
    1. Conor

      Nevermind. I just discovered that when I translate the page from Spanish to English large chunks of the source code are removed. Hope this helps anyone else that uses the automatic translate option of Google Chrome’s browser.

      Cheers. Great Tutorial!

      Responder
  24. Pingback: connecting an android phone to an arduino via bluetooth « Which Light

  25. gas

    Good morning, I have a question: it’s possible to connect at the same time to two bluetooth modules, driven by two microcontrollers, that send data to the same sketch on Android phone?
    Thank you

    Responder
  26. gas

    Thank you Oscar for your reply. I have an Android version 2.3 and so I see that it’s possible to obtain a connection with other two bluetooth modules (drived by two pic24fxx). I want to ask if you can tell me if there are any source code (better in in Processing language…) to realize the control of this dual simultaneous communications.
    Thanks in advance

    Responder
    1. Oscar

      Sorry, but I don’t know if there is any code to do that. However the bluetooth code in Processing is the same for Android, so you can look for any Android code in Internet and then implements it in a Processing sketch like this article.

      Responder
  27. Pingback: Android – Bluetooth Interface | HACKOLOG - Amazing Hacks and Mods

  28. Pingback: Introduction « Bluetooth Blues

  29. Julio César

    Hola Oscar

    Muy buena explicación de tu código y excelente applicación para empezar a conectar arduino con android via bluetooth, tengo un problema que copie todo el código que proporcionas a eclipse pero me salen varios errores, no se si de favor pudieras subir la carpeta de tu proyecto donde desarrollaste el código para eclipse, ya que en la carpeta que se desarrolla para eclipse para cualquier programa siempre se incluye carpetas como bin, gen, src, etc. gracias saludos.

    Responder
    1. Oscar Autor

      El proyecto lo desarrollé en processing, no en eclipse, por eso no hay ningún proyecto para el entorno de desarrollo.

      Responder
  30. Alex

    Hola Oscar

    Estoy programando una app en android mediante eclipse. Una parte de ella está centrada en encontrar los dispositivos bluetooth que tengo alrededor y conectarme uno por uno para enviar y recibir datos entre el dispositivo conectado y el mio propio. Me falta la parte de la conexión, he visto que has ido explicando el código, lo que es de gran ayuda, con lo cual si yo implemento en mi app esa parte de la conexión, o parte de ella, debería de funcionar a pesar de que lo desarrollaste en processing ¿no?.

    Muchas gracias de antemano.
    Un saludo.

    Responder
  31. gas

    Hi Oscar,
    I wish to connect a microcontroller with Android 2.3.4 via usb, using processing: can you suggest any example?
    Thank you

    Responder
        1. Oscar

          In that case the microcontoller can act as usb Host. The next question is: can you enable a serial communication between your Android mobile and the pic24?

          Responder
          1. gas

            I’m not sure to understand your question. Now I only can communicate between pic and PC or Android and PC via usb…

  32. Oscar

    As you mentioned above, you want to communicate between pic and android directly, don’t you? So The first step is to program the microcontroller as a CDC Host, have you tried it succesfully that issue?

    Responder
      1. Oscar

        Ok, now when you connect you device to Android you should have a serial port. Make an .apk with the next source code for Processing:

        import processing.serial.*;

        void setup()
        {
        size(240, 320);
        PFont font = createFont(«Arial», 16, true); // Arial, 16 point, anti-aliasing on
        textFont(font);
        fill(255);
        background(0);
        String vector[] = Serial.list();

        for(int index = 0; index < vector.length; index++)
        {
        text(vector[index], 5, 50 * index + 16);
        }

        }

        And tell me the results

        Responder
  33. gas

    Now I’d manually write the code and the compiler write: «No library found for processing.serial» in the first line. Where can I find this library?

    Responder
    1. Oscar

      Ok, I thought the serial library was implemented in processing for android, but it doesn’t, so let’s jump to the pool and try a new method.

      First of all, is your board a IOIO?

      If it is or you can modify your project to be the same, then you can use the Uart class: https://github.com/ytai/ioio/wiki/UART

      The way to include the IOIO library in Processing is explained here: http://wiki.processing.org/w/How_to_Install_a_Contributed_Library#Non-Processing_Libraries

      Responder
  34. gas

    No, my board is a explorer 16 and I try to use the application «CE370 Explorer16 USB Bulk Out Demo without USB PICTail» of Microchip. It’s good for usb communication PCboard, but I’m not able to replace my phone with the Pc. In every case, I’ll examine your suggestions and I’ll tell you

    Responder
  35. romelapj

    Estoy probando el programa con una galaxy tab 10.1-y me molesta bastante para la conexion y envia la informacion al arduino en el momento que toco el boton…cualquier sugerencia la tendre en cuenta gracias

    Responder
    1. Oscar Autor

      No entiendo lo de «y me molesta bastante para la conexion», ¿Qué te molesta?.

      En cuanto a que te envíe la información en el momento que tocas el botón, prueba a quitar la línea delay(1000)

      Responder
  36. romelapj

    Lo que sucede es q estoy implementando el codigo en android(eclipse)
    y no entiendo el porque no me comunica…te agradeceria mucho si miraras el codigo, de ante mano te doy gracias y te felicito por el tutorial y si no puedes ayudarme entendere 😀

    Responder
    1. Oscar Autor

      Prueba a hacerlo desde el bluetooth de un PC a ver si ocurre lo mismo. Tiene pinta de que el no está bien conectado el pin RX del módulo bluetooth al pin TX del microcontrolador.

      Responder
  37. Usco

    Hola, es que intento hacer este mismo ejercicio, pero me resulta un error a la hora de dar play, ya que sigue sin reconocerme las librerias de bluetooth, no se ya que hacer, ya le di a todos los permisos de sketch en android y nada… me podrias ayudar, trabajo en Mac OS X. pero es casi lo mismo. ya tengo el sdk de andorid completo.

    Responder
  38. mistery

    Hi,
    First off all I want to thank you for this code it is great, simple and working 🙂
    And second I have one question.
    I can connect to my bluetooth and recieve sendt data, I can even send data with ons.write(0x..) in hex but now i have to send byte, how can i convert sone variable that I have let say it is
    byte a;
    and send it thrue bluetooth
    I tried
    ons.write(a);
    and
    ons.write(hex(a));
    but it did not work.
    I think i tried to send
    int a;
    ons.write(a);
    and this did not work to.
    So if you can please explain me a little more how to send different types of variable.
    Thank you so much

    Responder
    1. Oscar Autor

      If you use ons.write(a) (where a is byte) it will send only a byte, if you need to send other types you will have to convert them into array and then send. For example:

      long data;
      .
      .
      .
      ByteBuffer bb = ByteBuffer.allocate(8);
      byte vector[] = bb.putLong(data).array();
      ons.write(vector);

      Responder

Responder a David Asensio Cañas Cancelar la respuesta

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