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'); } }