Trabajando con el módulo Bluetooth

Objetivos

  • Presentar los conceptos básicos del BlueTooth.
  • Presentar los comandos AT.
  • Introducir el modulo BlueTooth HC-06 y HC-05 .
  • Presentar un programa básico de comunicación, entre un teléfono externo y un Arduino mediante el modulo Bluetooth.

Material requerido

 arduino
  • Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
 Img_3_4
  •  Una Protoboard.
 Img_3_6-300x185
  • Algunos cables de Protoboard.
 hc-06-wireless-serial-4-pin-bluetooth-rf-transceiver-module-rs232-ttl-500x500
  • Un módulo BlueTooth HC-06 o BlueTooth HC-05

Módulos BlueTooth disponibles

Hace ya un tiempo que disponemos de módulos BlueTooth sencillos y económicos, que resultan muy prácticos para todo esto, y en esta sesión, vamos a empezar viendo cuales tenemos disponibles y como trabajar con ellos.

Los más frecuentes en el mercado son los módulos HC-06 y HC-05 que si hacéis una búsqueda rápida, veréis que se consiguen por poco dinero, y están disponibles independientes o en modo SHIELD y para zocalo XBEE.

Hay bastante confusión en la red acerca de cómo diferenciar uno de otro y en muchas ocasiones sobre las prestaciones de unos y otros.

Lo primero es que el hardware de ambos módulos es el mismo. No hay diferencia hardware, pero el software que incorporan es diferente.

Además el modulo de conexión se monta sobre un soporte que a su vez puede presentar diferencias notables según el fabricante y las conexiones que realice, pero por lo que he podido comprobar, hay una diferencia obvia, el numero de pines del modulo montado.

BT-masterslave_2

El modelo HC-06 dispone de 4 pines, en lugar de los 6 que incluye el modelo HC-05, pero hay además importantes diferencias de funcionalidad y de manejo.

Básicamente el modelo HC-06 solo puede actuar como esclavo y además dispone de un juego reducido de instrucciones a las que atiende, mientras que el modelo HC-05 puede actuar  como master o como Slave y acepta un número mayor de órdenes de configuración.

Mientras que el HC-06 entra en modo de programación en cuanto lo enciendes y mientras no haya nadie conectado por Bluetooth, el HC-05 es ligeramente más complicado de colocar en modo comandos y requiere una cierta manera de arrancado, concretamente requiere que el pin KEY, (Que no estaba conectado el caso del HC-06) este en HIGH cuando encendemos el modulo.

Los comandos AT

La palabra Modem, que tal vez hayáis oído, deriva del apocope de MODulador DEModulador, y si veis pelis de los años 80 y primeros 90 eran esos chismes que hacían los ruiditos típicos de audio, asociados a la informática.

La velocidad de los módems empezaron sobre los 300 baudios o bits por segundos y fueron aumentando con la revolución tecnológica hasta 1.200, 2.400, 9.600 y los últimos que se comercializaron con ese nombre fueron de 56.000 baudios.

Por eso, los módems necesitaban una especie de comandos, que nos permitiera modificar la velocidad según necesitáramos, cuando el ruido impedía una comunicación fiable y ya de paso modificar algún que otro parámetro sobre la marcha.

Y como el RS232 solo disponía de dos hilos de comunicaciones, no había más remedio que  incorporar una orden de atención que significara que a continuación venia una orden de programación del modem, que no debía ser transmitida al otro extremo.

Es decir que las ordenes eran del tipo “AT+Orden”, donde AT era el comando especificado de atención. Enseguida todos los  módems y demás máquinas de comunicación serie empezaron a aceptar este tipo de órdenes, y al conjunto de ellas se llamó comandos AT, por extensión.

Con el tiempo, mucho del hardware sencillo que se comunica con otros equipos vía un humilde puerto serie, siguen aceptando ordenes AT para configurarlos y este es el caso de los módulos BlueTooth HC-05, HC-06 y otros pequeños dispositivos que veremos en el futuro.

El circuito HC-06 y HC-05

Pues es fácil. Fíjate que el modulo tiene rotulado el nombre de los pines, y simplemente conectar tensión y GND al módulo y después conectamos Txd y Rxd a los pines digitales 2 y 4 respectivamente de tu Arduino.  Para el módulo HC-06:

Arduino-BT

Fijaros que al hacer esta conexión, el LED del módulo HC-06, parpadea continuamente. Esto indica que no está pareado o vinculado.

Cuando conectes algo al módulo, esta luz se quedará fija y es la forma de saber si hay conexión o no.

La conexión es muy sencilla aunque requiere algún cable más que el modulo HC-06, y algún cambio:

Sesio-71_bb__2

En primer lugar, para que el HC-05 entre en modo comandos AT, requiere que cuando se enciende el modulo, el pin KEY este HIGH. Por eso hemos conectado la tensión Vcc del módulo BlueTooth al pin 8 de nuestro Arduino.

El consumo del módulo es mínimo y nuestro Arduino es capaz de alimentarlo sin problemas, por eso el modulo se encenderá cuando pongamos HIGH en el pin 9. Esto nos permitirá poner en HIGH el pin digital 8, al iniciar nuestro programa y después levantar el pin 8, de este modo cuando arranque entrara sin más en el modo de comandos AT.

El Txd y Rxd se deben conectar cruzados con los pines de comunicación de Arduino, que usaremos mediante la librería software Serial.

El pin State refleja, supuestamente, la situación en la que se encuentra el modulo y por ahora no vamos a utilizarlo.

El programa de control

Como el modulo BlueTooth es básicamente un nodo BT conectado a un interface serie, podríamos en principio conectar los pines RX y Tx a los equivalentes de Arduino en los pines 0 y 1 digitales, sin más que cruzarlos (BT Tx  a Arduino Rx y BT Rx a Aduano Tx) y de hecho muchos ejemplos en Internet utilizan este esquema y se comunican con el BT mediante las familiares instrucciones de Serial.print ().

Sin embargo, prefiero desaconsejar hacerlo así, porque los pines 0 y 1 se utilizan en la comunicación serie de Arduino con el PC a través del USB y por tanto, si los usamos para comunicar con el modulo BT, perderíamos la conexión con el PC.

Por ello prefiero destinar otro par de pines cualesquiera a la transmisión, aunque para ello tenemos que importar una librería que habilite la comunicación serie con otros pines como es la librería SoftwareSerial.

Para ello importamos la librería que viene de serie en el IDE y creamos un nuevo objeto serie llamado BT1 conectado a los pines 4 y 2:

El programa queda algo así:

#include <SoftwareSerial.h>
 
//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(2,4);void setup()
{
  BT.begin(9600);
  Serial.begin(9600);
}
 
void loop(){
  if(BT.available())
  {
    Serial.write(BT.read());
  }
  if(Serial.available())
  {
     BT.write(Serial.read());
  }
}

Si por cualquier motivo, no consigues establecer comunicación con el modulo BT, ve cambiando la velocidad hasta que veas que hay conexión.Fíjate ahora, en el modulo, verás una luz roja parpadeando. Eso significa que el modulo está listo para vincularse a un dispositivo BlueTooth o para aceptar comandos AT, el modulo HC-06 no necesita nada más para entrar en modo de aceptar comandos AT.

De hecho siempre que veas la luz parpadeando significa que el modulo no retransmitirá los comandos AT, sino que los interpretara como ordenes internas. Pero si realizas una conexión (y la luz roja se queda fija, ignorará los comandos AT y los transferirá sin más.

Si no lo has vinculado aún, y la luz roja parpadea, ya podemos enviar comandos AT. Veamos algún ejemplo.

El primero y más básico es enviar (siempre en mayúsculas) un simple AT desde la consola. Se supone que debería responder con OK.

  • AT+VERSION, devuelve la versión del Firmware
  • AT+NAMEXXX, modifica el nombre que queremos presentar cuando alguien nos busque:
    • AT+NAMEIESCAMP
  • AT+BAUDX, Fija la velocidad de comunicación entre el modulo y la consola según a la siguiente tabla:

1 configura        1200bps
2 configura        2400bps
3 configura        4800bps
4 configura        9600bps (Default)
5 configura        19200bps
6 configura        38400bps
7 configura        57600bps
8 configura        115200bps

Ejemplo: AT+BAUD7 configura la comunicación a 57600 baudios

  • AT+PINXXXX, configura el número de identificación personal, que se requerirá para establecer la vinculación
  • AT+PIN4516, establece 4516 como PIN

En caso de que probando varios de estos comandos, no obtuvierais respuesta, o vierais caracteres extraños en la consola, probad con otras velocidades hasta conseguir una que funcione. Probad diferentes velocidades en la línea:

BT1.begin(9600);

Una vez volcado el programa anterior a nuestro Arduino, con una velocidad de comunicación correcta con el módulo, vamos a probar a enviar y recibir información desde y hacia, un teléfono móvil.

Lo primero es confirmar que el LED del módulo BT parpadea, indicando que está en modo AT o esperando vinculación con otro dispositivo. Después asegúrate de que el BlueTooth del teléfono está activo y por último, dependiendo del programa que uses como terminal, pídele que busque dispositivos BT en los alrededores y vincúlate al que encuentres.

Si todo va bien ya podrás enviar y recibir mensajes de texto entre tu móvil y Arduino en ambas direcciones.

App Arduino Control Car

Descargamos la aplicación en nuestro móvil.

Asociamos el bluetooth de nuestro arduino a nuestro móvil si lo lo hemos hecho ya.

Cargamos el siguiente programa:

#include <SoftwareSerial.h>
 
//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(2,4);
int x;

void setup()
{
  BT.begin(9600);
  Serial.begin(9600);
}
 
void loop(){
  if(BT.available())
  {
    x = BT.read();
    Serial.println(x);

  }
 
  if(Serial.available())
  {
     BT.write(Serial.read());
  }
}

Y arrancamos nuestra aplicación:

unnamed

Conectamos a aplicación al módulo de nuestro arduino pulsando el botón con el nombre Bluetooth, una vez conectado (el led ya no debe parpadear) podremos ver en la pantalla Serial los valores que recibe al pulsar los botones:

bluetooth

Corresponde a:

Botón arriba -> 97

Botón abajo -> 101

Botón izquierda -> 98

Botón derecha -> 100

Botón ON -> 102

Botón OFF -> 103

Con nuestro L298N conectado y nuestro bluetooth de la siguiente manera:

//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(10,11);

// Configuramos los pines que vamos a usar
int motorDer1=4;  //El pin 4 a In1 del L298N
int motorDer2=5;  //El pin 5 a In2 del L298N
int motorIzq1=7;  //El pin 7 a In3 del L298N
int motorIzq2=8;  //El pin 8 a In4 del L298N
int derecho=3;       //El pin 3 a EnA del L298N
int izquierdo=6;     //El pin 6 a EnB del L298N

El programa se puede descargar L298N

Con la App AMR_Voice

Le daremos ordenes a nuestro robot con la voz, lo que necesitamos es que lleguen los comandos en forma de String, para ello leeremos de la aplicación carácter a carácter y los uniremos hasta alcanzar una cadena con la orden. La app la puedes descargar en el Google Play:

FAKEA9HHUHT1GKU.RECT2100

Y con el siguiente código recogemos el comando recogido desde la aplicación del móvil:

#include <SoftwareSerial.h>

//Aquí conectamos los pins RXD,TDX del módulo Bluetooth.
SoftwareSerial BT(2,4);
String voice;

void setup()
{
    BT.begin(9600); //Velocidad del puerto del bluetooth
   Serial.begin(9600); //Abrimos la comunicación serie
}

void loop(){
    voice=»»;
    while (BT.available()){
        delay(10);
        char c = BT.read();
       voice += c;
}
if (voice.length() > 0) {
      Serial.println(voice);

     // acciones según respuesta

   }
}
Texto mostrado en la pantalla Serial:

texto