En un artículo anterior explicaba cómo utilizar un módulo Bluetooth HC-05 para agregar conectividad a una placa Arduino. En esa ocasión utilicé el módulo con su configuración de fábrica, porque no era necesario introducir ninguna modificación a los valores originales. Sin embargo, en algunos casos debemos cambiar algunos de los parámetros de la configuración, como la velocidad por ejemplo, para lo cual debemos llevar el módulo a un estado particular de programación que nos permite cambiar ese y otros parámetros. En este artículo veremos cómo configurar el HC-05 conectándolo a una placa Arduino UNO.
En el artículo previo utilicé un módulo HC-05 del tipo «CZ-HC-05» marca «gomcu» que funciona en su totalidad con 5 Voltios y se conecta en forma directa al Arduino UNO. En este artículo, y para aprovechar la oportunidad de explicar un caso diferente, voy a emplear un módulo distinto, el «ZS-040», que tiene la particularidad de funcionar con dos valores de tensión.
Este módulo tiene una alimentación de entre 3.6 y 5V, por lo que puede ser alimentado desde una placa que funcione con 5V, pero sus pines de datos operan a 3,3V. La salida de datos (TXD) puede conectarse directamente a un Arduino como el UNO, porque 3,3 Voltios son interpretados en una entrada del Arduino como un nivel ALTO, pero la entrada de datos (RXD) debe conectarse a través de un divisor resistivo que disminuya la tensión de la salida del Arduino, como se puede ver en la siguiente imagen:
Las conexiones se completan con los pines de alimentación GND y VCC, STATE que no se conecta y EN que nos servirá para forzar la entrada del módulo en el modo de configuración.
El modo configuración consiste en un modo especial de trabajo del HC-05 en el que los datos recibidos no son transmitidos sino que se interpretan como instrucciones o comandos que especifican qué parámetro interno se quiere consultar o modificar. Estos son comandos AT, que en general tienen el siguiente formato:
AT+(comando)? Consulta el valor actual de un parámetro y lo devuelve
AT+(comando) = (Valor) Establece el valor de un parámetro
Ejemplo:
AT+NAME?
Respuesta: +NAME: HC05
y para cambiar el nombre:
At+NAME=ARDUINO (cambia el nombre de «HC05» a «ARDUINO»)
Respuesta: OK
El listado completo de los comandos AT puede encontrarse aquí.
Este módulo tiene la particularidad de contar con dos modos de configuración, uno que permite la modificación de cualquier parámetro y otro que tiene algunas limitaciones. En mis pruebas, la única diferencia que observé entre ambos modos fue en el comando que cambia el nombre al módulo (AT+NAME), que sólo puede realizarse en el primer modo. En ambos casos la velocidad de comunicación es de 38400 baudios.
Para poner el módulo en el modo «reducido», hacemos lo siguiente:
- Desconectamos su alimentación (VCC)
- Apretamos el pulsador incorporado
- Conectamos la alimentación (VCC) (ya podemos soltar el pulsador)
En cambio, para entrar en el modo «completo» no nos sirve el pulsador y debemos conectar el pin EN a 3,3 Voltios (ya sea a la salida 3.3 del Arduino UNO o a 5V con un divisor resistivo idéntico al de la imagen anterior). El procedimiento en este caso es el siguiente:
- Conectamos EN a 3,3V
- Desconectamos la alimentación del HC-05 (VCC)
- Conectamos la alimentación del HC-05 (VCC) (sin desconectar EN)
En ambos casos, se evidencia que el módulo está en modo programación porque el LED parpadea de manera lenta.
Para poder enviar los comandos AT al HC-05 y ver los valores que devuelve, usaremos la terminal serie del IDE de Arduino, cargando un pequeño programita al Arduino UNO que haga de «puente» entre la computadora y el módulo Bluetooth, de manera que todo lo que escribamos en la terminal salga por un puerto serie por soft del Arduino hacia el módulo (en los pines 10 y 11), y todo lo que éste responda entre al mismo puerto serie y sea copiado a la PC.
#include <SoftwareSerial.h> SoftwareSerial ModuloHC05 (10, 11); //pin RX, pin TX void setup() { Serial.begin(38400); //Inicializa puerto serie por hard ModuloHC05.begin(38400); //Inicializa puerto serie por soft } void loop() { char dato; if (ModuloHC05.available()) { //Llega algo por bluetooth? dato=ModuloHC05.read(); //Leer lo que llegó Serial.write(dato); //Sacarlo a la terminal } if (Serial.available ()) { //Llega algo de la terminal? dato=Serial.read(); //Leer lo que llegó ModuloHC05.write(dato); //Sacarlo al módulo Serial.write (dato); //Eco en la terminal } }
Una vez cargado el programa en el UNO, configuramos el monitor serie en 38400 baudios y activamos «ambos NL y CR» en los ajustes de línea, porque el módulo HC05 espera que los comandos AT terminen con los caracteres <CR> y <LF>.
Como les digo siempre, espero que el artículo les haya sido de utilidad. Cualquier duda o sugerencia, en la sección de comentarios.
Saludos Profe Tolocka, tengo un problema al querer conectar un HC05 maestro con varios esclavos (5 en total, también HC05). He hecho la conexión por ahora sólo con uno, pero si apago el maestro el esclavo sigue en estado de conexión, y si deseo reconectar el maestro a este mismo (por lo menos en un corto tiempo) no lo permite.
EL sistema que deseo montar es, un maestro que contacta a un esclavo, le envía una activación y este le devuele alguna información, luego deberá contactar a los otros y repetir esclavo ya contactado.
Una pregunta, ¿QUE ES LA ‘PAIR LIST’ y cómo se llena?, esto lo encontré buscando al respecto.
Podrán servir los COMANDOS: AT+LINK, AT+DISC
Les pido me indiquen cómo hacerlo, gracias. Mao
EL Codigo y diagramas me han funcionado muy bien. mi HC 05 estaba como maestro y ya lo he cambiado a esclavo pero aun asi no logro que mi celular lo reconozca como bluetooth .
que podra ser????
HOLA CARLOS, PUDISTE SOLUCIONARLO,??? TENGO EL MISM PROBLEMA NOSE QUE SERA LA VERDAD, YO ESTOY DESDE PRINCIPIOS DEL AÑO PASADO CON ESTO
para que sirve el pin state?
Hola Emilio, depende un poco del modelo, la salida LED o STATE provee la misma información que el led que tiene incorporado la placa e indica si está vinculada a otro dispositivo o en modo configuración.
Hola, por favor me podrías indicar cómo hiciste para conectar varios módulos al mismo tiempo
Hola Carlos, yo he usado varios robots, cada uno con su HC-05 configurado para tener un identificador (comando NAME) distinto, para que no se confundan. No se si eso responde tu inquietud
Hola Ernesto, gracias por tu publicación!! hace 2 días que estoy tratando de tener una comunicación con los comandos AT, cargué mas de 15 programas y ninguno me funcionaba, ya estaba pensando que mi hc-05 estaba fallado, hice una prueba más con el tuyo y entró de una!!
Gracias por realizar esta publicación!!
Saludos
Gracias Enrique, me alegro de que el artículo te haya servido!
buenas tardes ..alguien que me oriente se los agradezco … usando el BT HC05 …funciona bien conectandolo al pin (10 , 11) del arduino uno… pero deseo conectarlo a otros pines del arduino mega …por ejemplo pin (30, 31)…. pero no me funciona … existe algo para lograrlo… gracias por su atencion … mi mail es ….. magaza52@gmail.com
HOLA, TENGO UN PROBLEMA, NO PUEDO CAMBIAR LA VELOCIDAD DE TRANSMICION DE 9600 A 115200 EN OTRO MODULO HC 05 LO HABIA CAMBIADO CON AT+BAUD8. AHORA ME COMUNICO PERO NO PUEDO CAMBIAR
Como otros, pensaba que había quemado 2 HC05 hasta que encontré esta página. Funciona todo genial. Muchas gracias.
Que bueno Ángel, me alegro que te haya servido!
excelente explicacion, hice todos los pasos y conexiones y todo excelente, lo unico es q mi modulo bluetooth no se queda en modo maestro, le doy el comando AT+ROLE y me dice ROLE=0, luego le digo AT+ROLE=1 y me responde OK, y hago todos los demas comandos q dicen AT+CMODE, AT+BIND= la clave del otro modulo, pero luego le pregunto AT+ROLE y me dice ROLE=0 osea no se queda como maestro es lo que me falta culminar mi humilde proyecto, me podrian ayudar porfa
solo quiero hacer una comunicacion inalambrica un arduino con su modulo bluetooth (esclavo) y un led o un modulo rele que se active cuando yo oprima un boton en otro modulo con su arduino y su modulo bluetooth (maestro).