Bienvenidos, una vez más, mis jóvenes padawan. Pasad, pasad, al fondo hay sitio. Hay cerveza en la nevera (si eres menos, píllate un refresco). Os preguntaréis qué ha sido de este viejo aprendiz de tecnólogo en los años que han pasado. Dejadme, como buen friki, parafrasear a Gandalf: "Es peligroso, Frodo, cruzar tu puerta. Pones tu pie en el camino, y si no cuidas tus pasos, nunca sabes a dónde te pueden llevar...".
Yo he recorrido mi propio camino en los últimos 4 años. Seguro que para muchos hubiera sido fácil, pero se conoce que no soy muy bueno tomando decisiones... O manteniéndolas. El caso es que, aunque no vuelvo convertido en Gandalf el Blanco de los Abismos de Moria (friki, friki, guiño, guiño) sí que he experimentado unas cuantas transformaciones. Pero hay algo que vuelve a llamar a la puerta de mi alma (por Dios, qué ñoño estoy), y es volver a escribir. Concretamente, volver a mis articulillos sobre Robótica y Arduino. Hoy, en concreto, voy a tratar sobre cómo se puede reprogramar un módulo Bluetooth HC-05 con nuestra querida Arduino, utilizando el puerto serie (concretamente, un puerto software) para comunicarse con dicho módulo mediante comandos AT. ¿Vamos allá?.
¿Qué es el módulo HC-05 y cómo se conecta?
Bueno, esa parte es fácil. Estos módulos tienen conectividad Bluetooth. Eso significa que pueden comunicarse por vía inalámbrica con cualquier dispositivo que cuente con dicha tecnología (smartphones, ordenadores... o con tarjetas Arduino que, a su vez, cuenten con uno de estos módulos. Es decir, podemos hacer que dos Arduinos se comuniquen inalámbricamente si cuentan con sus respectivos módulos. La apariencia de este tipo de módulos es la de la imagen.

Hago aquí un pequeño inciso para matizar el nombre: vamos a usar el módulo HC-05, no el HC-06 (que físicamente es muy parecido). El HC-06 sólo puede trabajar en modo esclavo (ya explicaremos esto).
Los pines del módulo, en orden, son:
- EN: (O key) Enable. Sólo se conecta (como es nuestro caso) cuando queremos entrar en modo programación AT, en cuyo caso hay que conectarlo a 5 V.
- Vcc: Alimentación (lo ideal es trabajar con 3.3 V, pero yo trabajo con la lógica de 5 V con Arduino, y nunca he tenido problema).
- GND: Tierra
- Tx: pin de transmisión de datos. Tiene que ir al pin Rx de Arduino (pin 0 si queremos usar el puerto serie de hardware de la tarjeta, pero nosotros usaremos otro pin con la utilidad SoftwareSerial).
- Rx: pin de recepción. Debe conectarse al pin Tx de transmisión de la Arduino (pin 1 si usamos el puerto serie de Arduino, que no va a ser nuestro caso).
- State: este pin da información sobre el estado de conexión del módulo, poniéndose a 1 cuando está conectado y a 0 cuando está desconectado. Normalmente no lo usaremos.
¿Qué son los comandos AT?
Hablando mal y pronto (como es tónica en mí), los comandos AT son órdenes sencillas que permiten reprogramar (en este caso) el módulo para cambiar algunas de sus características (nombre, contraseña, o rol como maestro/esclavo, entre otras cosas). Estos comandos se introducen en el módulo a través del puerto serie de Arduino.
¿Pero el puerto serie de Arduino no ofrece ciertas dificultades?
No exactamente. El problema del puerto serie es que si lo conectamos, en este caso, al módulo HC-05 (a través de los pines 0 y 1), será imposible grabar nuevos programas en la tarjeta Arduino, al ser éste el canal de comunicaciones utilizado. No es que haya tanto problema en esto (es tan fácil como desconectar dichos pines antes de la transmisión de nuevos programas), pero la librería SoftwareSerial hace años que nos proporciona la posibilidad de usar cualquiera de los otros pines digitales de nuestra tarjeta. Nosotros, en concreto, vamos a utilizar las patillas 11 y 12.
De todos modos, aquí te dejo un enlace a un artículo de Luis Llamas sobre el puerto serie. Está realmente bien.
Ok. Pues vamos a conectar entonces.
Verás que es muy sencillo. Como hemos comentado antes, normalmente utilizamos sólo cuatro de los seis pines (alimentación, Tx y Rx). En el caso particular de querer trabajar en modo programación AT, hay que conectar también a 1 lógico el pin Enable. Te dejo el esquema sin y con protoboard.
Ok. Conectado. ¿Qué programa vamos a usar?.
El programa que te adjunto a continuación utiliza la librería SoftwareSerial. El puerto serie por software que vamos a usar definirá su pin de recepción Rx en el pin 11, y el pin de transmisión Tx en el 12. Lógicamente, ambos pines se conectarán al revés a las patillas Tx y Rx, respectivamente, del HC-05 (el transmisor de un elemento debe conectarse al receptor del otro y viceversa).
Hay que detallar, eso sí, que aunque la velocidad de comunicación en puertos serie es, normalmente, de 9600 baudios, tanto para Arduino como para el módulo BT, cuando estamos en modo programación, la velocidad de este último es por defecto de 38400 baudios, lo que nuestro programa deberá tener en cuenta.
En líneas generales, tendremos que cumplir con los siguientes puntos:
- Importar la librería SoftwareSerial.
- Definir los puertos serie de Arduino por Software (que trabajará a 9600 baudios) y el del módulo HC-05 (en modo AT trabaja a 38400 baudios).
- Parar el programa para que el sistema se paralice hasta que pongamos en marcha en la IDE de Arduino el monitor del puerto serie.
- (Opcional): Enviar un mensaje de saludo a través de ambos puertos para monitorizar si funcionan.
- Ir reenviando el texto que se recibe en un puerto a su complementario (para programar en modo AT, tenemos que enviar mensajes al puerto serie del módulo BT a través de nuestro puerto en Arduino, y recibir en éste los mensajes de confirmación o de error del HC-05).
Os paso el código completo:
//Importamos la librería SoftwareSerieal
#include
//Definimos dicho puerto serie en los pines 11 y 12
SoftwareSerial softSerie(11,12); // RX, TX
void setup()
{
//Inicializamos el puerto serie de Arduino
Serial.begin(9600);
while (!Serial) {
; // Para evitar errores, paralizamos el programa mientras no se conecte el monitor en la IDE de Arduino
}
//Inicializamos el puerto del módulo BT a 38400
softSerie.begin(38400);
//Lanzamos un mensaje por ambos puertos a efectos de calibrar si hay comunicación
Serial.println("¡Hola desde Arduino!");
softSerie.println("¡Hola desde el módulo BT!");
}
void loop()
// reenviamos al puerto Serie contrario lo que recibamos en cada puerto
{
if (softSerie.available())
Serial.write(softSerie.read());
if (Serial.available())
softSerie.write(Serial.read());
}

