En esta entrada configuraremos un módulo Bluetooth para comunicar nuestro Arduino. El objetivo es poder controlar nuestros proyectos desde un teléfono móvil u otro dispositivo similar con Bluetooth.
Para ello vamos a utilizar un módulo Bluetooth HC-05 (también sirve el HC-06) que es muy común y económico (unos 4€). La diferencia entre ambos módulos es que el HC-05 que puede ser maestro o esclavo (master/slave), mientras que el HC-06 solo puede actuar como esclavo (slave).

Además es bueno saber que el módulo da información mediante un LED que parpadea a diferentes velocidades con diferentes significados:
– Parpadeo rápido: preparado
– Parpadeo lento: preparado para recibir comandos AT (configuración)
– Un parpadeo cada cierto rato: emparejado
– Dos parpadeos cada cierto rato: conectado
CONFIGURACIÓN
Primero vamos a configurar el módulo. Esto es recomendable aunque no necesario, y basta con hacerlo una vez. La configuración se hace mediante comandos Hayes (o comandos AT) y permite establecer cosas como el nombre del dispositivo, la velocidad o la clave (es lo único que recomiendo modificar al principio).
Los comandos más habituales son (hay que esperar un segundo entre comando y comando):
AT (devuelve OK)
AT+UART? (devuelve la velocidad)
AT+UART=19200,0,0 (establece la velocidad velocidad,bit parada 0/1, bit paridad 0/1/2, devuelve OK)
AT+NAME? (devuelve el nombre del módulo)
AT+NAME=ARDUGUIMI (establece el nombre del dipositivo, devuelve OK)
AT+ROLE? (devuelve el estado del módulo -0: esclavo; 1: maestro-)
AT+ROLE=0 (establece el estado del dipositivo, devuelve OK)
AT+PSWD? (devuelve la contraseña del módulo)
AT+PSWD=1234 (establece la contraseña del dipositivo, devuelve OK)
AT+ADDR? (devuelve la dirección MAC del dispositivo)
Para ello realizamos un circuito sencillo (esquema realizado con Fritzing):

El programa también es sencillo y nos permite enviar comandos AT al modulo Bluetooth utilizando el monitor serial para enviar y recibir mensajes. El modulo no debe estar conectado por Bluetooth a nada.
Se debe configurar el modulo serial a 9600 baudios con “Ambos NL & CR”.
En mi módulo las respuestas son inteligibles. Parece un problema de juego de caracteres. En teoría el comando AT+CSCS debería ayudar pero no me ha servido. Lo importante es que aunque las respuestas sean ininteligibles, funciona.
/*
* Con este programa se pueden enviar comandos AT al modulo Bluetooth
* utilizando el monitor serial para enviar y recibir mensajes
*
* Se debe configurar el modulo serial a 9600 baudios con "Ambos NL & CR"
* El modulo no debe estar conectado por bluetooth a nada
*
* En mi caso las respuestas son inteligibles, pero funciona. Parece un problema de juego de caracteres.
*
* 2014 - Guimi (http://guimi.net)
*
* Mas informacion sobre los comandos Hayes (comandos AT): http://es.wikipedia.org/wiki/Conjunto_de_comandos_Hayes
*
*/
// LIBRERIAS
//----------
#include <SoftwareSerial.h> //Librería que permite establecer comunicacion serie en pins diferentes al 0 y 1
// CONSTANTES
//-----------
#define PWR 5 // Alimentacion del modulo (5V)
#define Rx 10 // Recepcion
#define Tx 11 // Transmision
#define KEY 12 // Indica que se desea comunicar con el modulo (comandos AT)
// Inicializamos la comunicacion serie por los puertos del modulo BT establecidos
SoftwareSerial BT(Tx, Rx);
// FUNCION SETUP
//--------------
void setup(){
// Definimos cada pin como entrada o salida
pinMode(PWR, OUTPUT);
pinMode(KEY, OUTPUT);
digitalWrite(PWR, LOW);
digitalWrite(KEY, HIGH);
digitalWrite(PWR, HIGH);
// Damos tiempo para que el dispositivo este listo
delay(500);
// Borramos el buffer del puerto BT
BT.flush();
delay(500);
// Preparamos la comunicacion mediante el puerto serie y el modulo BT
BT.begin(38400);
Serial.begin(9600);
// Notificamos que estamos listos
Serial.println("Introduzca comandos AT:");
BT.print("AT\r\n");
}
// FUNCION LOOP
//-------------
void loop(){
// Si hay algo pendiente en el puerto BT lo transmitimos
// de forma transparente al puerto serie
if (BT.available()) {
// Escribimos en el puerto serie lo que leemos en el puerto BT
Serial.write(BT.read());
}
// Si hay algo pendiente en el puerto Serial lo transmitimos
// de forma transparente al modulo BT (que lo interpreta)
if (Serial.available()) {
// Escribimos en el puerto BT lo que leemos en el puerto serie
BT.write(Serial.read());
}
}
USO DEL MÓDULO BLUETOOTH
Como ejemplo realizamos un circuito aún más sencillo que el anterior, sin utilizar “Key” (que es para configuración) y alimentando el módulo directamente desde la placa (esquema realizado con Fritzing):

El programa también es sencillo y permite transmitir información entre el puerto serie y el puerto Bluetooth. Además, a modo de ejemplo, interceptamos las señales recibidas por el módulo BT para reaccionar y encender o apagar un LED.
Se debe configurar el modulo serial a 9600 baudios con “Ambos NL & CR”.
Para enviar mensajes por Bluetooth podemos utilizar BTControl, un programa de Android realizado por mi que permite conectar con un dispositivo BT y enviarle señales. El objetivo de BTControl es controlar mediante BT un robot Arduino o similar.
/*
* Este programa conecta arduino por bluetooth utilizando un modulo HC-05
* con otro dispositivo (p.e. un android) y ambos se comunican de modo transparente
*
* En medio de la comunicacion "escuchamos" en busca de comandos
*
* Se debe configurar el modulo serial a 9600 baudios con "Ambos NL & CR"
*
* 2014 - Guimi (http://guimi.net)
*
* Basado en http://diymakers.es/arduino-bluetooth/
*
*/
// LIBRERIAS
//----------
#include <SoftwareSerial.h> //Librería que permite establecer comunicacion serie en pins diferentes al 0 y 1
// CONSTANTES
//-----------
#define Rx 10 // Recepcion
#define Tx 11 // Transmision
#define LED 13 // LED
// VARIABLES
//----------
int caracter; // Caracter recibido
// Inicializamos la comunicacion serie por los puertos del modulo BT establecidos
SoftwareSerial BT(Tx,Rx);
// FUNCION SETUP
//--------------
void setup() {
// Definimos cada pin como entrada o salida
pinMode(LED, OUTPUT);
// Preparamos la comunicacion mediante el puerto serie y el modulo BT
BT.begin(9600);
Serial.begin(9600);
// Notificamos que estamos listos
Serial.write("BT preparado:\n");
}
// FUNCION LOOP
//-------------
void loop() {
// Si hay algo pendiente en el puerto Serial lo transmitimos
// de forma transparente al modulo BT (que lo envia directamente al aparato vinculado)
if (Serial.available()) {
// Escribimos en el puerto BT lo que leemos en el puerto serie
BT.write(Serial.read());
}
// Si hay algo pendiente en el puerto BT lo transmitimos
// de forma transparente al puerto serie y buscamos comandos conocidos
if (BT.available()) {
// Leemos el puerto
caracter = BT.read();
// Escribimos en el puerto serie lo que leemos en el puerto BT
Serial.write(caracter);
// Si el mensaje recibido es uno conocido, ejecutamos la orden correspondiente
// En este sencillo ejemplo, algunos caracteres apagan el LED y otros caracteres encienden el LED
if (caracter == 'A' || caracter == '5' || caracter == 'W') {
// Turn off LED
digitalWrite(13, LOW);
} else if (caracter == 'B' || caracter == '1' || caracter == '2' || caracter == '3' || caracter == '4' || caracter == '6' || caracter == '7' || caracter == '8' || caracter == '9' || caracter == 'Y') {
// Turn on LED
digitalWrite(13, HIGH);
}
// Ademas para uno de los caracteres introducimos un salto de linea
if (caracter == '5') Serial.write('\n');
}
}