bclose

Controlando Arduino con Android

Objetivos

.

 
    • Conectar los módulos Bluetooth a Arduino.
    • Presentar una aplicación Android llamada ArduDroid.
    • Ver como podemos usar ArduDroid para controlar Arduino desde el movil.
    • Montar un circuito de ejemplo.
 

Material requerido.

Imagen de Arduino UNO

Arduino UNO o equivalente.

Imagen superior

 Un módulo BlueTooth HC-05 o HC-06,

conexiones

 Algunos cables de protoboard, preferiblemente Dupont macho/hembra mas una protoboard

componente Una resistencia de 330Ω
componente 4 LEDs
Simbolo de Android Un móvil Android

 

Trabajando con HC-05 y Android

 

Una vez que hemos visto cómo usar los comandos AT para programar los módulos Bluetooth, en las sesiones anteriores, podemos pasar a la parte fácil que es usar nuestros móviles Android para controlar cualquier proyecto con BlueTooth. Es tan sencillo como conectarnos al módulo y escribir un pequeño programa que gobierne el flujo de control.

Podríamos hacerlo con comandos de texto directos, pero es demasiado poco elegante y aquí  nos gustan las cosas presentables, por lo que vamos a usar un programa de lo más simpático,  disponible para Android que se llama ArduDroid.

Está escrito por TechBitar, y podéis encontrar aquí su página Ardudroid.

Básicamente es un  programa Android con botones y deslizadores, más un esquema de programa Arduino que podemos usar para enviar y recibir comandos de una forma presentable, y que además funciona muy bien.

Para ello necesitaremos que descarguéis ArduDroid de la GooglePlay para Android y lo instaléis en vuestro teléfono.

 
  • Siento tener que decir, de nuevo, que los módulos HC-05 y HC-06 no son capaces de conectar con los móviles de Apple o al menos yo no lo he conseguido
 

Después basta con conectar cualquiera de los dos módulos a nuestros Duinos con un par de cables para GND y Vcc más Rxd y Txd.

Vamos a dedicar esta sesión a ver como conectamos uno de los módulos para la conexión normal de trabajo y cómo usar el Ardudroid para gobernar mensajes de texto, pines digitales y ya puestos algún pin PWM.

 

Diagrama de conexión

 

Vamos a montar inicialmente un pequeño circuito con tres diodos LED para que veamos cómo controlarlos desde el móvil, y luego iremos complicando un poco más el montaje (No, no es una amenaza).

Esquema electrico

 

El montaje de la protoboard es trivial para gente tan experimentada:

Esquema de protoboard

 

El programa de control ArduDroid

 

Ardudroid incluye un programa Arduino, que podemos utilizar como esqueleto para nuestros propios proyectos. Pero nosotros vamos a hacer algunos cambios en la conexión que él hace, porque no me gusta nada que usemos los pines 0 y 1 para comunicarnos con Arduino, así que nosotros usaremos los pines 2 y 3 para la conexión con el módulo BlueTooth.

 
  • Creo que ya comentamos que si usamos los pines 0 y 1 nuestro código funcionara, pero anularemos la conexión con el PC vía USB, que usa los pines 01 y 1.
  • El autor, que es un hombre de mundo, no tiene problemas, porque prueba los programas con un segundo módulo BT, y cuando tiene el programa pulido, no necesita volver a reprogramar, pero yo soy un poco más torpe y prefiero no cerrar esa puerta mantener abierto el USB para mensajes por ejemplo.
 

Vamos a ir presentando el programa de control de Arduino en pequeñas dosis para evitar asustar a nadie, y que los sufridos lectores huyan despavoridos, y de ese modo, además, podremos ir viendo poco a poco las diferentes secciones del programa, que estoy seguro ayudara a su mejor comprensión.

En primer lugar, necesitamos saber, que el programa Ardudroid envía todos los comandos con una sintaxis sencilla. Todas las ordenes empiezan por * y terminan en #, y si la orden incluye múltiples datos, esto vienen separados por el símbolo |

Cuando ArduDroid envía una orden típica, es algo así:  *10|3|2#

Por eso, porque las órdenes se envían codificadas, vamos a empezar con algunas definiciones previas:

#define START_CMD_CHAR '*'
#define END_CMD_CHAR '#'
#define DIV_CMD_CHAR '|'
#define CMD_DIGITALWRITE 10
#define CMD_ANALOGWRITE 11
#define CMD_TEXT 12
#define CMD_READ_ARDUDROID 13
#define MAX_COMMAND 20  // max command number code. used for error checking.
#define MIN_COMMAND 10  // minimum command number code. used for error checking.
#define IN_STRING_LENGHT 40
#define MAX_ANALOGWRITE 255
#define PIN_HIGH 3
#define PIN_LOW 2

Además usaremos la librería SoftwareSerial, para hablar con el modulo BlueTooth, mediante los pines digitales 2 y 3:

#include <SoftwareSerial.h>
SoftwareSerial BT1(3, 2); // RX | TX

Definiremos unas variables para contener los valores que leeremos del comando:

int ard_command = 0;
int pin_num = 0;
int pin_value = 0;

El cuerpo principal del loop es muy sencillo, Vamos a empezar recibiendo mensajes de texto:

char get_char = ' ';  // Para leer BT1
if (BT1.available())
    {   get_char = BT1.read();
        delay(25);

        if (get_char != START_CMD_CHAR)
            return; // Si no hay *, vuelta a empezar

        ard_command = BT1.parseInt();  // Leemos la orden
        pin_num = BT1.parseInt();      // Leemos el pin
        pin_value = BT1.parseInt();    // Leemos valor

Recuerda que parseInt (), va leyendo caracteres hasta llegar a uno que no es un numero valido y entonces devuelve en un entero las cifras que ha leído.

Una vez que leemos ard_command, evaluamos que tipo de comando es, y si la orden es de tipo texto, llamamos a un viejo conocido GetLine () para conseguir el String:

if (ard_command == CMD_TEXT)     // Si el comando es de texto:
   {
        String s = GetLine();
        Serial.println(s);
   }

Si lo que recibimos es una orden que corresponde al boton GetData , enviamos algo, previamente pactado, por ejemplo la lectura de A0 (Aunque no tenemos nada conectado en este momento:

if (ard_command == CMD_READ_ARDUDROID)
   {   BT1.print(" Analog 0 = ");
       BT1.println(analogRead(A0));  // Leemos A0
       return;  // Done. return to loop();
       Y si la orden es un digitalWrite de algún pin:
       if (ard_command == CMD_DIGITALWRITE)
           processDW(pin_num, pin_value);
    }

He preferido procesar las órdenes con funciones, fuera del cuerpo principal para que sea un poco más limpio el programa.

La función GetLine es la habitual, simplemente modificada para leer de BT1 en lugar de Serial:

String GetLine()
  {   String S = "" ;
      if (BT1.available())
         {  char c = BT1.read(); ;
            while ( c != END_CMD_CHAR)    //Hasta que el caracter sea END_CMD_CHAR
              {  S = S + c ;
                 delay(25) ;
                 c = BT1.read();
              }
            return( S ) ;
         }
  }

Y en cuanto a la función processDW, que maneja las órdenes digitales:

void processDW(int pin_num, int pin_value)
   {   if (pin_value == PIN_LOW)
           pin_value = LOW;
       else if (pin_value == PIN_HIGH)
           pin_value = HIGH;
       else
           return; // Error

       digitalWrite( pin_num,  pin_value);
       return;
   }

Para manejar los comandos de escritura analogica, mediante PWM, tenemos, otro apartado de lo mas sencillo:

 if (ard_command == CMD_ANALOGWRITE) 
     { analogWrite( pin_num, pin_value ); 
       // add your code here
       return; // De vuelta alloop();
     }

Aquí os pongo una copia completa del programa Prog_72_1

Y aquí teneís un minivídeo con el resultado del programa

 

 

 

Resumen de la sesión

 

 
    • Hemos presentado el programa ArduDroid. Una aplicación de lo más simpática para manejar vuestros proyectos a través del móvil.
    • Hemos incluido un ejemplo de circuito para manejar desde el móvil.
    • Hemos presentado como complementar la aplicación Android con un programa base que nos proporciona Ardudroid, para manejar nuestros dispositivos.
 
 
 

 

 

 

(24) Comments

  • Hola en Android Cuando no tenes boton fisico de menu mantenes el boton virtual de aplicaciones recientes y se convierte en boton menu.

    Saludos

    • Adrian

    Buenas. Excelente tutorial. Sin embargo tengo una duda. No puedo ingresar al menú. Como aparece en el video. Ya q mi smartphone Samsung S5. No tiene dicho botón de Menu. Por lo tanto no logro conectarme. Que me sugieren. Gracias

    • Hola Adrian, pues me imagino que tendra algun sistema equivalente para hacer la misma funcion pero no sabria decirte

      • DCDAMIAN

      Tengo el mismo problema con un Samsung no tiene el botón de menú pero le encontré por ahí en configuraciones BlueTooth y se conecta. Cambia la frecuencia del parpadeo de los led. Pero no logre recibir ni mandar ninguna señal del programa ardudroid al arduino, alguna sugerencia, Gracias.
      Probé con otro celular que si tiene el botón de menú y paso exactamente lo mismo.

      • Hola Damien no puedo hablar de un movil que desconozco, pero hay dos ideas importantes ene esto:
        1 – Puedes usar modulos BT 2.0 o BT 4.0 con Arduino y no todos los telefonos aceptan ambos, asegurate de que el tuyo acepta el que corresponde

        2 – El parpadeo de los led no es un buen indicador, ya que depende del firm del modulo que es cambiante. SI te conectas prueba a enviar y ecibir a ver que pasa

    • Fredy

    hola soy nuevo en esto e estado siguiendo y realizando cada una de tus lecciones. y todo bien tocante a esta practica todo bien hasta la orea de conectar el bluetooh con el modulo al movil aparentemente si se conecta la aplicas ion pero en el modulo sigue parpadeando el led que pudiera estar pasando

    • Hola Fredy, hay mil fabricantes de estos modulos y muchos de ellos modifican el firm, asi que si te funciona no le des mas vueltas

  • Buenas tardes, he montado el circuito y ha ido todo perfecto; solo una duda… ¿Por qué los pines digitales proporcionan en esta ocasión una intensidad muy baja a los LED? Cuando montamos un circuito sin controlarlo por BlueTooth si que proporciona una intensidad mayor.

    Un saludo,
    Luis.

    • Jaime Sanchez

    Hola como esta alguien que me pueda ayudar con el problema que no me puedo conectar al programa mediante el bluetooth el programa que me quiero conectar es ardudroidbitar

    • Hola Jaime, prueba a cambiar la velocidad de comunicación del módulo en la línea BT1.begin(57600);

      • Hola ivan la verdad soy nuevo en esto ya lo cambie a 57600 pero todavia no me puedo conectar no se si me puedew facilitar mas las cosas.

    • Homer

    Hola
    primeramente felicito por las cosas creadas que han sido muy utiles, realice una aplicacion para encender luces por medio del bluetooth, pero el problema es cuando el cel esta fuera de alcance de la señal o se desconecta el modulo bluetooth 05.
    como controlo que esta en linea y si se pierde la conexion enviar una alerta.
    es un trabajo de la universidad quedo agracdecido de antemano mi correo duque1383@yahoo.com

    Homer

    • Hola Homer, me temo que sipierdes la conexion no será posible enviar ningun mensaje avisando de ello.
      Pero lo que si puedes hacer es interrogar periodicamente a tu HC-05 para consultar si esta vinculado o no con algun dispositivo. De hecho me parece recordar que uno de los pines que no usamos en el tutorial (STAT) indica si estas o no vinculado con algo, que es lo que creo que puedes usar, pero tienes que comprobar que esto que te digo es correcto ¿Vale?

    • Denis

    Hola

    Saludos, la funcion parseInt (), no la comprendo muy bien, acumula lo enviado para luego ubicarse en el pin y el valor para ese pin, no comprendo esta parte, o es que el programa envia tres datos al mismo tiempo como ser el numero para ar_comand, el pin, y el valor del pin??.
    Espero me puedan ayudar a entender.
    Gracias

    • buenos dias dens, la furcion ñarseint, si nl recuerdo ma, simplemente espera un integerpor la linea serie y termina con un kntro o al cabo de jn tiempo
      lo que recibe lo interñreta como un entero yes o que te devjeve

    • Claudio

    Hola, se me queda el led rojo del HC-05 parpadeando, dos cortos en ON y uno largo en OFF.
    Me dice el programa de AduDroid que esta enlazado, pero no se enciende ningún LED cuando pulso los botones de la tablet.

    He configurado los comandos AT y todo ha ido correcto:
    AT+PIN
    AT+NAME
    AT+PSWD
    AT+UART=38400,0,0
    Todo fue correcto.

    Que me falta por hacer?
    En el video veo que charly utiliza 5 hilos con el HC-05 y yo utilizo los 4 que pone en el esquema. Podría ser eso? En ese caso no se donde va ese PIN.

    • note fies mjcho de las luces claudio, ten en cuenta que cadafabfkcante gidne sus manias. prueba la cominicackon y me dices

  • Buenas, tengo un ,módulo de bluetooth HC05, un poco diferente (gomcu), pero he buscado sus comandos AT. Ya al hacer el ejemplo del modo de configuración tuve que usar BT1.begin() a 38400 baudios para obtener respuesta. Aunque al ejecutar el comando AT+UART? (equivalente al AT+BAUD del ejemplo) devuelve que está configurado a 9600. Pero a 9600 no hay manera de que el módulo funcione. Y al conectar el móvil, (ya por Ardudroid o por Bluetooth Console) , independientemente de los juegos de frecuencia que use, los comandos que envío desde el móvil aparecen en el monitor serie del IDE como caracteres ilegibles.

    Llevo tres días a cabezazos con la placa, no sé que hacer 🙁

    Gracias de antemano.

    • Hola Alejandro, a mi me pasó algo similar. Lo que hice fue, en modo AT, cambiar la velocidad con el comando “AT+UART:38400,0,0”. Inicialmente estaba a 9.600 como en tu caso y la comunicación no se establecía correctamente. A 38.400 me va perfecto.
      Un saludo.

  • Yo tambien tuve ese problema y lo solucione cambiando la protoboar increiblemente de tanto uso las conexiones quedaban sueltas en ella … cambiando por una nueva protoboard todos mis led volvieron a brillar iguales.. recuerda siempre que los led puestos directamente a arduino consumen mas por lo que si cargas mucho es logico que baje la tension… procura alimentar todo externamente con gnd comun y asi puedes asegurar la estabilidad del brillo en tus led

  • Soy yo de nuevo.
    No consigo que los pines digitales, excepto el 13, den una intensidad normal. Quedan muy por debajo que el 13 (que da la intensidad esperada).
    Alguien sabe que puede pasar?

    Mil gracias por todo!

  • De hecho todos los pins dan poca intensidad excepto el 13…

  • Dos cosillas:

    1. La misma que el compañero Morales, o sea, he tenido que meter 9600 baudios para que funcione.
    2. Los pines 12 y 13 me pasan una intensidad baja, o sea, los LEDs se me encienden muy poco…

    Mil gracias!

    • Máximo Morales Escobar

    Hola.
    Muchísimas gracias por toda la información que aportas.
    He conseguido que el sketch que propones funcione con el módulo de Blutooth XN-15B SPP y la app ArduDroid. El único cambio que he tenido que hacer en el sketch es modificar el valor de 57600 por el de 9600 en la línea 34, quedando por tanto en dicha línea el código:
    BT1.begin(9600);
    Gracias de nuevo.

Give a Reply

WordPress Anti-Spam by WP-SpamShield