Control de dispositivos con el módulo Bluetooth HC05 y Arduino

El protocolo de comunicaciones Buetooth, nacido hace ya casi 20 años, está destinado a la transmisión de voz y datos en pequeñas redes inalámbricas. Ampliamente utilizado para evitar los cables en la conexión de dispositivos periféricos como parlantes o teclados a computadoras de escritorio y notebooks o para conectar una gran variedad de dispositivos a teléfonos móviles o tabletas, también puede ser aprovechado para el control inalámbrico de nuestros proyectos con Arduino gracias a módulos como el popular HC05, algunas de cuyas aplicaciones veremos en este artículo.

Antes de comenzar las conexiones, la habitual advertencia que siempre realizo cuando hago un análisis de un módulo para Arduino: asegurense de que el módulo que posean coincida con el que empleo en el artículo. Bajo la denominación “módulo bluetooth HC05” existe en realidad una amplia variedad de placas que varían en su conexión e incluso en la tensión de alimentación, por lo que una conexión inadecuada no sólo producirá un malfuncionamiento sino que incluso puede dañar irremediablemente el módulo. El módulo HC05 “original” consiste en una placa que funciona a 3,3 Voltios, tanto en su alimentación como en las señales de datos y control y que no cuenta con pines para su montaje, tal como se ve en la siguiente imagen.

Módulo HC05

Los módulos que se derivan de ella consisten en placas de adaptación sobre las que se suelda el HC05 y adaptan los valores de alimentación y/o señales a otros valores como 5 Voltios. Algunos pueden verse en la imagen de mas abajo, y este otro artículo recopila información sobre varios de ellos.

El HC05 en distintas placas adaptadoras

En este artículo voy a utilizar una placa denominada “CZ-HC-05” marcada como “gomcu” que contiene toda la circuitería para alimentar el módulo HC05 con 5V y permite su conexión en forma directa a placas que funcionen con esta tensión, como el Arduino UNO.

Módulo CZ-HC-05 gomcu

Conexionado

La conexión de este módulo a un Arduino es sumamente simple. Toda la complejidad del protocolo Bluetooth está resuelta por el HC05 que nos presenta un puerto serie con los típicos pines TX y RX para el envío y recepción de datos. La alimentación de 5 Voltios debe proveerse a través de los pines VCC y GND. KEY es una entrada que nos permite cambiar el modo de funcionamiento (según veremos mas adelante) y LED es una salida para conectar un led que indique la condición de trabajo del módulo, aunque éste ya cuenta con un led azul soldado sobre la placa en el lado inferior que cumple con esa función. El circuito mínimo para utilizar Bluetooth en nuestros proyectos es el siguiente:

Conexionado HC05-Arduino

Como se puede ver, el pin KEY se deja desconectado. En esta condición, todo lo que escribamos en el pin TXD es enviado por el HC05 a través de la conexión bluetooth a otro dispositivo (por ejemplo un teléfono) y los datos recibidos saldrán por el pin RXD, siempre a una velocidad de 9600 baudios, que es la preestablecida de fábrica. Si quisieramos realizar algún cambio en la configuración del HC05, como la velocidad de transmisión o modificar alguno de los muchos parámetros con que cuenta, debemos hacerlo entrar en el llamado “modo AT”, donde los datos que se envían al módulo no son transmitidos sino que son interpretados como comandos o instrucciones. En este artículo no voy a explicar esta funcionalidad, que quedará para un artículo futuro (de todos modos, no es imprescindible para dar los primeros pasos). El Arduino provee la alimentación al módulo a través de sus pines 5V y GND y las señales de datos se asignan a los pines 10 y 11, que funcionarán como un puerto serie por software para no interferir con el puerto serie del Arduino en los pines 0 y 1. Finalmente, se conecta un LED al pin 9, a través de una resistencia de 560 ohms, para realizar algunas pruebas.

El HC05 conectado al Arduino

Probando el circuito

Para comprobar que el Arduino es capaz de comunicarse con un dispositivo Bluetooth necesitamos dos cosas al menos: un dispositivo que envíe datos y un programa en el Arduino que los reciba. Para esto último, escribimos un programa simple que lee continuamente los datos recibidos por la interfaz serie por software en los pines 10 y 11 y los retransmite por el puerto serie del Arduino al programa Monitor en el IDE. De esa manera, cualquier dato recibido a través del módulo Bluetooth se copiará en la ventana del monitor. El programa es el siguiente:

#include <SoftwareSerial.h>

SoftwareSerial ModuloHC05 (10, 11);  //pin RX, pin TX

void setup() {

 Serial.begin(9600);        //Inicializa puerto serie por hard
 ModuloHC05.begin(9600);    //Inicializa puerto serie por soft

}

void loop() {

 if (ModuloHC05.available())                    //Llega algo por bluetooth?
            Serial.write(ModuloHC05.read());    //Sacarlo a la terminal

}

Para enviar datos al Arduino usaremos un teléfono Android con una aplicación específica. Afortunadamente, si buscamos en la Play Store (Arduino Bluetooth, por ejemplo) hallaremos gran cantidad de apps que son capaces de transmitir datos, de muy variadas formas: terminales de texto, simuladores de controles de juego, controles remotos para autos, etc. Por su versatilidad, yo elegí la app llamada “Arduino Bluetooth Controller”, que tiene varias funciones y es muy configurable. Puede encontrarse en la Play Store.

Si alimentamos nuestro circuito, veremos que el led azul parpadea rápidamente, lo que indica que el HC05 no está conectado ni vinculado a otro dispositivo. ¿Qué significa esto? Dos dispositivos están conectados cuando están a una distancia mínima y operativos para que el bluetooth funcione y sea capaz de transmitir datos. Si el teléfono está apagado, por ejemplo, no puede existir conexión. Por otro lado, los dispositivos están vinculados (paired) cuando ya se han conectado y han intercambiado información de protocolo como la clave de conexión.

Al descargar e iniciar la app primero deberemos buscar el HC05 a través del Bluetooth. Para eso, tocamos el símbolo de lupa y luego de unos segundos nos aparecerá “HC-05” bajo el título de “Available” (disponible). Tocamos “HC-05” y se nos solicitará el PIN del dispositivo para vincularse. El pin por defecto es “1234” (es otra de las cosas que se puede modificar usando el modo comando que mencioné antes)

Una vez vinculados el teléfono y el HC05, ya podemos enviar datos. Podemos comprobar esta condición porque el led azul del HC05 parpadea lentamente, prendiendo dos veces (la tercera condición es cuando ya hay vinculación pero se pierde la conexión, lo que se evidencia porque el led parpadea lento, pero prende una sola vez). La app tiene cuatro modos de trabajo posibles: Controller, que simula un joystick, switch que funciona como un botón ON/OFF, Dimmer para realizar un control continuo, como el del brillo de una lámpara y Terminal para enviar y recibir texto. Para la primer prueba tocamos “Terminal Mode”

Una vez en el modo terminal, escribimos un texto y le damos al botón aceptar del teclado

Si todo está bien conectado, el Arduino recibirá este texto por el módulo HC05 y lo copiará a la terminal del IDE:


En todos los casos que querramos controlar algo con el Arduino (leds, luces, relés, motores, etc) debemos seguir un procedimiento similar: contar con una app que envíe datos por bluetooth y un programa en el Arduino que los reciba y actúe de acuerdo a los datos recibidos. Si el proyecto consiste en prender y apagar un motor, la app deberá contar con uno o dos botones que al ser pulsados envíen algo como “1” y “2”, según el caso, u “ON” y “OFF” y el programa del Arduino deberá esperar estos textos y activar o no la salida donde está conectado el motor (a través de un relé o cualquier otro elementos de control, por supuesto).

A modo de ejemplo, este sería un programa para prender y apagar el led conectado al pin 9. Espera permanentemente que llegue algo desde el HC05 y cuando llega, si es un caracter “1” prende el led y si es el caracter “0”, lo apaga

#include <SoftwareSerial.h>

#define   LED   9          //Pin para el LED

SoftwareSerial ModuloHC05 (10, 11);  //pin RX, pin TX

void setup() {

 Serial.begin(9600);        //Inicializa puerto serie por hard
 ModuloHC05.begin(9600);    //Inicializa puerto serie por soft

 pinMode (LED, OUTPUT);      //Salida

 digitalWrite (LED, 0);
}

void loop() {
 char dato;
 if (ModuloHC05.available()) {              //Llega algo por bluetooth?
  dato=ModuloHC05.read();                   //Leer lo que llegó
  Serial.write(dato);                       //Sacarlo a la terminal
  if (dato=='1') digitalWrite (LED, 1);     //Si es "1", prende el LED
  if (dato=='0') digitalWrite (LED, 0);     //Si es "0", apaga el LED
 
 }
           

}

Para probarlo usamos la misma App, en “Switch mode” teniendo la precaución de configurarla primero para que al encender envíe “1” y al apagar envíe “0” (tocando el “engranaje” de la configuración en el Switch mode)

Y para terminar, otro programa de ejemplo para el Dimmer Mode, donde la app envía el valor del “slider” entre “0” y “255”.

#include <SoftwareSerial.h>

#define   LED   9          //Pin para el LED

SoftwareSerial ModuloHC05 (10, 11);  //pin RX, pin TX

void setup() {

 Serial.begin(9600);        //Inicializa puerto serie por hard
 ModuloHC05.begin(9600);    //Inicializa puerto serie por soft

 pinMode (LED, OUTPUT);      //Salida

 digitalWrite (LED, 0);
}

void loop() {
 char dato[4]="000";
 byte valor;
  
 if (ModuloHC05.available ()){
    delay (5);
 
    while (ModuloHC05.available()) {              //Llega algo por bluetooth?
      dato[0]=dato[1];                            //Recolecto los caracteres
      dato[1]=dato[2];
      dato[2]=ModuloHC05.read();
   }
 
 Serial.println (dato);
 Serial.println ("\n");

 valor=100*(dato[0]-'0') + 10*(dato[1]-'0') + (dato[2]-'0');
 analogWrite (LED, valor);
 }
           

}

Como decía antes, existen muchas apps para enviar datos a un Arduino y seguramente podrán encontrar la que mas se adapte a las necesidades de su proyecto. En última instancia, si sus requerimientos son muy específicos tienen la opción de diseñar su propia app usando App Inventor.

En otros artículos describiré algunos detalles de este módulo que quedaron pendientes, así como el procedimiento para enviar datos del Arduino al teléfono.

Como siempre, espero que les sea de utilidad y cualquier duda o sugerencia, en los comentarios!

4 comentarios en «Control de dispositivos con el módulo Bluetooth HC05 y Arduino»

  1. Buenas tardes
    El tutorial es bueno, estoy comenzando a aprender de la comunicación con módulos bluetooth, pero tengo una duda con la conexión del hc 05,¿es posible conectar el dispositivo en manera maestro y detectar un dispositivo de audio como un manos libres sin importar la calidad de la audio?, si la respuesta es si ¿que procedimiento de configuración en el modulo hay que seguir? y ¿como seria el protocolo de comunicación?
    saludos

    Responder
  2. Hola profesor, en primer lugar felicitarlo por tan interesante publicación y el esfuerzo realizado.
    Quisiera hacerle una pregunta, estoy tratando de armar un Arduino con dos sensores (HC-SR04 y LM35) y un módulo HC-05, el Arduino está conectado a una Raspberry Pi vía cable USB, en principio he logrados leer los datos que se imprimen por el puerto serial con un escript Python y este a su vez los almacena en MySQL – mariaDB, hasta ahí todo en orden, mi problema surge cuanto tengo la necesidad de separar el Arduino de la Raspberry Pi a una distancia de 10mts. aprox., no logro hacer conexión vía bluetooth, en realidad no se como enviar los datos de arduino por el HC-05 y tambien se me está complicando por parte de Python, hacer el escrip para leer estos datos.
    Espero pueda ayudarme, lo apreciaría mucho.
    Saludos cordiales.

    Responder
    • Hola Matías, la idea es que el led se encienda sólo (sin que haya ningún comando o dato enviado de por medio) al establecerse la conexión Bluetooth?

      Responder

Responder a MC Cancelar la respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias