Conexión a Arduino por Bluetooth

El protocolo de comunicaciones Bluetooth, 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 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.

En este artículo voy a utilizar una placa 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 Arduino UNO.



Conexionado

La conexión de este módulo a una placa 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  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). 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 de Arduino en los pines 0 y 1. 

Para comprobar que la placa de Arduino es capaz de comunicarse con un dispositivo Bluetooth necesitamos dos cosas al menos: un dispositivo que envíe datos y un programa en 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 5 y 6 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:
El programa es el siguiente:

#include

SoftwareSerial ModuloHC05 (5, 6);  //pin RX, pin TX

void setup()
 {
  Serial.begin(9600);        //Inicializa puerto serie por hardware
  ModuloHC05.begin(9600);    //Inicializa puerto serie por software
 }

void loop() 
{

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

}

Para enviar datos a la placa 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 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.


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, la placa Arduino recibirá este texto por el módulo HC05 y lo mostrará en la terminal del IDE:


En todos los casos que queramos controlar algún dispositivo con Arduino (leds, 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 activar y/o detener un motor, la app deberá contar con uno o dos botones que al ser pulsados envíen un código por ejemplo «1» y «2», según el caso y el programa del Arduino deberá esperar estos textos y  procesar la información según el código y activar el pin correspondiente.

En el menu de inicio de la app, podemos seleccionar la opción controller mode, nos presentará la siguiente pantalla con los botones de comando similares a los de una consola.

Si accedemos a la configuración nos aparecerán los botones y el código que tienen asociado, código necesario para procesar en nuestros programas de Arduino. Una vez que sabemos el código de cada botón ya podemos pasar a utilizar el app.



En el siguiente ejemplo hemos realizado un circuito para probar el funcionamiento del módulo bluetooth y la app. Se trata de un montaje con cuatro diodos led, su funcionamiento será el siguiente: Vamos a poder encender los diodos de uno en uno desde el teléfono móvil y después apagar los cuatro a la vez.


#include
SoftwareSerial ModuloHC05 (5, 6);  //pin TX, pin RX
 
SoftwareSerial ModuloHC05 (5, 6);  //pin TX, pin RX

#define pinLedRojo 13
#define pinLedVerde 12
#define pinLedAmarillo 11
#define pinLedBlanco 10
void setup()
{
  pinMode(pinLedRojo, OUTPUT);
  pinMode(pinLedVerde, OUTPUT);
  pinMode(pinLedAmarillo, OUTPUT);
  pinMode(pinLedBlanco, OUTPUT);
  Serial.begin(9600);     
  ModuloHC05.begin(9600);

}
void loop()
{
  char dato;
 if (ModuloHC05.available())   //Llega algo por bluetooth?
 {        
  dato=ModuloHC05.read();            //Leer el dato recibido
  Serial.write(dato);                       //Mostrar el dato por el monitor serie
    if (dato=='4')
      {
      digitalWrite(pinLedBlanco,HIGH);    //Si el dato recibido es "4", Encender el diodo led blanco     
      }
    if (dato=='7')
      {
      digitalWrite(pinLedRojo,HIGH);           //Si el dato recibido es "1", Encender el diodo led rojo
     
      }
      if (dato=='2')
      {
        //Apagar diodos
        digitalWrite(pinLedRojo,LOW);      
        digitalWrite(pinLedVerde,LOW);            
        digitalWrite(pinLedAmarillo,LOW);           
        digitalWrite(pinLedBlanco,LOW);    
      }
     
 if (dato=='3')
      digitalWrite(pinLedVerde,HIGH);         //Si el dato recibido es "1", Encender el diodo led verde
      if (dato=='6')
      digitalWrite(pinLedAmarillo,HIGH);          //Si el dato recibido es "2", Apagar el diodo led amarillo
  }
}



Ejemplo anterior modificado para controlar la posición de un servomotor, posicionar el ser en 0º, 90º y 180º, además se completa el circuito con tres diodos led que indican la posición del servo.

#include
SoftwareSerial ModuloHC05 (5, 6);  //pin TX, pin RX
#include // Importamos la librera servo

#define pinServo 3  //Pin donde se conecta el servo
#define pinLedRojo 13
#define pinLedVerde 12
#define pinLedAmarillo 11
#define pinLedBlanco 10
Servo myservo;  // creamos el objeto servo de tipo servo

void setup()
{
  myservo.attach(pinServo);
  pinMode(pinLedRojo, OUTPUT);
  pinMode(pinLedVerde, OUTPUT);
  pinMode(pinLedAmarillo, OUTPUT);
  pinMode(pinLedBlanco, OUTPUT);
  Serial.begin(9600);     
  ModuloHC05.begin(9600);

}
void loop()
{
  char dato;
 if (ModuloHC05.available()) //Llega algo por bluetooth?
 {        
  dato=ModuloHC05.read();   //Leer el dato recibido
  Serial.write(dato);       //Mostrar el dato por el monitor serie
   
    if (dato=='7') // Posicionar el servo en 0º
      {
        digitalWrite(pinLedRojo,HIGH);   //Si el dato recibido es "1", Encender el diodo led rojo
        myservo.write(0);              
        delay(15); 
        //damos tiempo al servo para moverse a la nueva posicion      //Si el dato recibido es "4", Encender el diodo led blanco     
      
      }
    
      if (dato=='3') // Posicionar el servo en 90º
      {
        myservo.write(90);              
        delay(15); 
        //damos tiempo al servo para moverse a la nueva posicion      //Si el dato recibido es "4", Encender el diodo led blanco     
        digitalWrite(pinLedVerde,HIGH);   //Si el dato recibido es "1", Encender el diodo led verde
      }
    
      if (dato=='6') // Posicionar el servo en 180 º
      {
       myservo.write(180);              
       delay(15); 
       //damos tiempo al servo para moverse a la nueva posicion
       digitalWrite(pinLedAmarillo,HIGH);   //Si el dato recibido es "2", Apagar el diodo led amarillo
      }
      if (dato=='2')
       {
        //Apagar diodos
        digitalWrite(pinLedRojo,LOW);      //Si el dato recibido es "2", Apagar el diodo led  rojo
        digitalWrite(pinLedVerde,LOW);     //Si el dato recibido es "2", Apagar el diodo led verde
        digitalWrite(pinLedAmarillo,LOW);  //Si el dato recibido es "2", Apagar el diodo led amarillo
        digitalWrite(pinLedBlanco,LOW);    //Si el dato recibido es "2", Apagar el diodo led blanco
        myservo.write(0);  // Posicionar el servo en 0º            
        delay(15); 
        //damos tiempo al servo para moverse a la nueva posicion 
       }
  
  }
}



No hay comentarios: