viernes, 18 de marzo de 2016

Comunicación inalámbrica Bluetooth usando el chip HC-05


Buenas a todos.

Os traigo otro tutorial para Arduino. En este caso vamos a conectar dos módulos inalámbricos Bluetooth. Se trata de los chips HC-05 (muy parecidos a los HC-06 aunque con diferente configuración de pines). Se pueden comprar por algo menos de 3€/módulo y vienen dotados de un microcontrolador que facilita en gran medida la interacción con este chip (poniendo por medio cierto nivel de abstracción).

Buscando por internet he visto que no existe mucha bibliografía acerca de cómo comunicar dos módulos. La mayoría de las fuentes indican cómo conectar HC-05 con un móvil Android o con el PC. De modo que aquí vamos a profundizar un poco más.

Así que venga,  vamos a entrar en detalle.

Para probar la conexión vamos a emplear los siguientes elementos:

  • Dos placas Arduino. En este caso se empleará un Arduino UNO y un MEGA 2560.
  • Dos módulos HC-05.
  • Una resistencia de 10K y otra de 120 ohmios.
  • Un LED.
  • Un pulsador.
  • Cables (tanto macho-macho como macho-hembra).

Vamos a trabajar con un ejemplo simple. Uno de los dos Arduinos se conectará al módulo HC-05 configurado como maestro, mientras que el otro lo hará al esclavo. Al presionar el pulsador conectado al Arduino que porta al maestro, se encenderá el LED conectado al Arduino que porta al esclavo. De esta forma, estaremos activando un LED de forma inalámbrica. Este sencillo ejemplo será la base para efectuar cualquier comunicación Bluetooth que deseemos, ya sea tanto para enviar cadenas de texto simple como para enviar imágenes.


1. Configuración del HC-05 mediante comandos AT

En primer lugar se debe configurar el módulo Bluetooth. Para ello haremos uso de los comandos AT. En la siguiente figura podemos ver el pinout del HC-05. Para aquellos que empleéis el HC-06, simplemente tened en cuenta que no dispondréis de los pines STATE y EN como podéis ver. Yo recomiendo emplear el HC-05, pues aporta más información y permite disponer del modo de configuración de una forma más cómoda.


En este tutorial usaremos el módulo HC-05. Como podemos ver, cuenta con un botón que en el HC-06 no existe. Esto es lo que nos permitirá acceder al modo de comandos AT.

Ahora ten cuidado. Pues aunque veas tu módulo HC-05 idéntico al de la fotografía, puede no serlo. Me explico: el firmware del microcontrolador depende del fabricante y existe una gran variabilidad entre ellos. Por lo que los pasos que se siguen en este tutorial pueden no valer al pie de la letra. Pero teniendo cuidado con estas variaciones, podremos conectar sin problemas nuestros módulos HC-05.

No obstante, yo intentaré aportar mi experiencia personal, para resolver el mayor número de casos posibles.

Bueno, seguimos por donde íbamos. Es hora de conectar nuestros módulos HC-05 a Arduino para darles alimentación. El esquema a seguir es el siguiente:


Conectaremos en primer lugar un módulo Bluetooth y posteriormente lo desconectaremos y conectaremos el otro. Así no nos complicamos conectando los dos Arduinos.

Bueno, aquí viene el quebradero de cabeza. En los HC-05 "oficiales" debemos conectar todos los pines a excepción de VCC. Una vez hecho esto, mantenemos presionado el pulsador de nuestro módulo y conectamos el cable rojo, de modo que al arrancar el microcontrolador con el botón presionado, entraremos en el modo de comandos AT. Este estado se reconoce porque el LED del HC-05 parpadea a un ritmo más lento.

Puede darse el caso, como me sucedió a mí, que no se tenga que seguir este protocolo para entrar en el modo comandos. En mi caso concreto, conecto el módulo HC al completo tal cual (sin presionar el botón). Y una vez parpadea frenéticamente (el parpadeo que indica búsqueda de dispositivos) presiono el botón, apenas un segundo. No obtengo respuesta visual alguna por parte del hardware, pero al introducir comandos, éstos comienzan a actuar.

Sea como sea, se ha desarrollado el siguiente código, que podemos emplear tanto para un caso como para otro:

#include <SoftwareSerial.h> //Librería para comunicación con HC
SoftwareSerial BTserial(10,11); // 10: RX | 11: TX

char c = ' '; //Caracter empleado para la comunicación serie
              //entre Arduino y HC
 
void setup() {
    Serial.begin(9600); //Puerto serie para interactuar
    Serial.println("Arduino - OK!");
    BTserial.begin(9600); //Puerto serie emulado para HC
    Serial.println("BTserial - OK!"); 
}
 
void loop(){

  //Si existe algún dato disponible en el módulo HC para
  //pasarlo a Arduino...
    if (BTserial.available()){
        c = BTserial.read(); //Lee ese dato
        Serial.write(c); //Y lo escribe para verlo en el monitor
    }

    //Si existe algún dato disponible escrito por el usuario...
    if (Serial.available()){
        c =  Serial.read(); //Se lee el dato
        Serial.write(c); //Se escribe en el monitor (feedback)
        BTserial.write(c); //Y se envía al HC
    }
}


Tras cargar este programa en Arduino y teniendo en cuenta la forma que tenga nuestro módulo de darnos acceso a su modo comando, podremos escribir en la consola los comandos necesarios.

Si pincháis aquí tendréis acceso a una lista de todos los comandos AT en PDF, con sus posibles valores y las respuestas esperadas. Recomiendo que le echéis un vistazo. De todos modos, nosotros vamos a describir brevemente los comandos que deberemos usar.

Para introducir todos los comandos usaremos el monitor serie del Arduino que esté ejecutando el código. Para ello deberemos seleccionar la opción «Ambos NL & CR» como indica la figura. NOTA: podemos probar que realmente estamos en el modo comando escribiendo en la consola el comando "AT" (sin las comillas). De esta forma el HC-05 nos devolverá la señal "OK" como verificación.



Haremos la configuración en el siguiente orden: el primer HC-05 conectado será el esclavo, mientras que el segundo será el maestro:
  • Para el caso del esclavo realizaremos los siguientes ajustes:
  1. Introduciremos el comando AT+NAME=ESCLAVO y presionaremos la tecla INTRO. Con esto fijaremos el nombre a "ESCLAVO". Podemos comprobar esto simplemente escribiendo AT+NAME? en el monitor serial. En el caso de algunos módulos HC-05, no se obtiene respuesta para este último comando. Si es vuestro caso, no os preocupéis.
  2. Introduciremos el comando AT+ROLE? para asegurarnos de que nuestro módulo actúa en modo esclavo. Deberá devolvernos el valor 0.
  3. Introduciremos el comando AT+ADDR? para obtener la dirección MAC del esclavo. Es importante que anotemos esta dirección, ya que la usaremos posteriormente.


  • Para el caso del maestro realizaremos los siguientes ajustes:
  1. Introduciremos el comando AT+NAME=MAESTRO.
  2. Introduciremos el comando AT+ROLE=1 para que actúe como maestro.
  3. Introduciremos el comando AT+CMODE=0 para que se nos permita conectarnos a una MAC específica, en lugar de buscar. Podemos comprobar que se ha escrito introduciendo AT+CMODE?.
  4. Introducimos el comando AT+BIND=, donde será la MAC que anotamos del esclavo, empleando las comas como separador y las mayúsculas. Por ejemplo, si obtuvimos la MAC 2016:1:64e5a, introduciremos el comando AT+BIND=2016,1,64E5A en el monitor serial.


Una vez ajustados ambos módulos procedemos a su desconexión.



2. Conexión entre ambos módulos HC-05

A continuación vamos a proceder a montar el circuito definitivo. Seguiremos el esquema de la siguiente figura:


Y cargaremos los siguientes códigos en el Arduino MEGA (con el HC-05 maestro) y el Arduino UNO (con el HC-05 esclavo):

Código para el maestro:
#include <SoftwareSerial.h>

// Se conecta un pulsador al PIN 3. El MAESTRO envía el estado del botón al ESCLAVO.

SoftwareSerial BTSerial(10,11); //RX, TX

char estadoPulsador = '0';

void setup() {
  Serial.begin(9600);
  BTSerial.begin(9600); //Se inicializa comunicación BT a 9600

  pinMode(3,INPUT);
}



void loop() {
  estadoPulsador = (digitalRead(3)==HIGH) ? '1': '0';

  BTSerial.write(estadoPulsador);

  delay(100);

}

Código para el esclavo:
#include <SoftwareSerial.h>
#define PINLED 13

// Se conecta un LED al PIN 13. El ESCLAVO recibe el estado del botón del MAESTRO y enciende/apaga el LED

SoftwareSerial BTSerial(10,11); //RX,TX

char estadoLED = '0';

void setup() {
  pinMode(PINLED, OUTPUT);
  digitalWrite(PINLED, LOW);
  Serial.begin(9600);
  BTSerial.begin(9600);
}

void loop() {
  if(BTSerial.available() > 0)
    estadoLED = BTSerial.read();

  if(estadoLED == '0')
    digitalWrite(PINLED, LOW);
  else
    digitalWrite(PINLED,HIGH);

}

Una vez hecho esto, al iniciar ambos programas veremos cómo el LED de ambos HC-05 deja de parpadear frenéticamente para emitir un parpadeo más lento, estando los dos prácticamente sincronizados en el tiempo. Esto quiere decir que nuestros dispositivos están ahora conectados. Si presionamos el botón podremos ver cómo el LED se enciende mientras lo mantengamos.

Como os decía, ésta es la base para comunicar dos dispositivos por medio de Bluetooth. Estamos jugando con un caracter que se envía y, en función de su valor, determinará si nuestro Arduino UNO debe encender o no el LED. Igualmente podremos enviar otro tipo de caracteres, como podrían ser los caracteres de una cadena para intercambiar mensajes, los bytes de una imagen para reconstruirla en el Arduino receptor, etc.

Espero que os haya servido el tutorial. Y espero no haber pasado nada por alto. Si es así, editaré la entrada hasta que consiga reunir toda la información posible. Cualquier duda me podéis preguntar por comentarios o a través de wemento@gmail.com.

Gracias por vuestro tiempo.

Salu2


No hay comentarios: