Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Arduino: Módulo Bluetooth

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