Los módulos de bluetooth HC-05 y HC-06 son módulos muy populares para aplicaciones con microcontroladores PIC y Arduino. Se trata de dispositivos relativamente económicos y que habitualmente se venden en un formato que permite insertarlos en un protoboard y cablearlo directamente a cualquier microcontrolador, incluso sin realizar soldaduras. En esta entrada del blog vamos a explicar un poco del funcionamiento de estos módulos y como configurarlos. También abordaremos las diferencias entre el HC-05 y el HC-06.
En la foto de portada del artículo vemos de izquierda a derecha: los módulos HC-05 y HC-06 en formato amigable para protoboard y un módulo HC-05 en formato compatible con zócalos para Xbee (módulo bluetooth bee).
Módulo Bluetooth HC-05
El módulo de bluetooth HC-05 es el que ofrece una mejor relación de precio y características, ya que es un módulo Maestro-Esclavo, quiere decir que además de recibir conexiones desde una PC o tablet, también es capaz de generar conexiones hacia otros dispositivos bluetooth. Esto nos permite por ejemplo, conectar dos módulos de bluetooth y formar una conexión punto a punto para transmitir datos entre dos microcontroladores o dispositivos. En otro artículo posterior veremos como configurar dos módulos HC-05 para que se enlacen entre ellos y podamos transmitir información de un punto a otro.
El HC-05 tiene un modo de comandos AT que debe activarse mediante un estado alto en el PIN34 mientras se enciende (o se resetea) el módulo. En las versiones para protoboard este pin viene marcado como “Key”. Una vez que estamos en el modo de comandos AT, podemos configurar el módulo bluetooth y cambiar parámetros como el nombre del dispositivo, password, modo maestro/esclavo, etc.
Para comunicarnos con el módulo y configurarlo, es necesario tener acceso al módulo mediante una interfaz serial. Podemos usar un arduino con un par de cables (aprovechando el puente USB-Serial del Arduino), un kit para XBee o un simple MAX3232 en el puerto serie de la PC. Para este artículo estaremos usando un módulo Bluetooth Bee Pro que comercializamos en nuestra tienda web, así como una interfaz USB-Serial con socket Xbee “Foca” que también vendemos. Este es el hardware que utilizamos en nuestro taller, pero también es posible hacer los ensayos con el módulo HC-05 suelt0 o en formato para insertar en el protoboard sin mayor problema.

Diferencias HC-05 vs HC-06 y como identificarlos
Muchas personas y tiendas en internet venden el HC-06 y HC-05 como un mismo módulo, muchas veces uno pide un HC-05 y terminan vendiéndoles un HC-06. Esto se debe a que esencialmente el hardware es el mismo para ambos módulos. La única diferencia real es el firmware que viene cargado de fábrica. De hecho, si tenemos paciencia, podemos convertir un HC-06 a un HC-05 nosotros mismos con solamente cambiar el firmware de los módulos, pero quedas advertido: ¡Hay que construir la interfaz de programación!
Existen unos módulos aptos para insertarse en el protoboard que nos permiten una fácil identificación del módulo soldado antes de comprar. En estos módulos, los HC-05 normalmente tienen dos pines extra (además de TX, RX, VCC, GND) etiquetado como “Key” y “State”. El pin “key” es necesario para entrar al modo de comandos AT en el módulo HC-05 (pin 34) y por lo tanto, solo se instala cuando el módulo de bluetooth a bordo es un HC-05. También podemos identificar si se trata de un HC-05 por la forma en que se identifican con otros dispositivos bluetooth: El HC-05 se identifica como “HC-05”, mientras que el HC-06 se identifica como “Linvor” o “HC-06”.

La fotografía muestra una comparación entre los módulos HC-05 (izquierda) y HC-06 (derecha) en su versión para insertar en protoboard. El HC-05 tiene 2 pines extra
Interfaz de configuración de comandos AT en HC-05
El puerto serie en modo de configuración para el HC-05 debe configurarse de la siguiente manera: 34800 bps, 8 bits de datos, Sin paridad, Sin control de flujo. Para entrar al modo de comandos AT seguimos los siguientes pasos:
- Poner a estado alto en el pin 34 (PIO11)
- Conectar la alimentación del módulo (o resetearlo de preferencia)
- Enviar un comando AT\r\n para comprobar que estemos en modo de comando AT.
La siguiente lista es una compilación de los comandos que consideramos importantes
- AT\r\n Comando de prueba, debe responder con OK\r\n
- AT+ROLE=1\r\n Comando para colocar el módulo en modo Maestro (Master)
- AT+ROLE=0\r\n Comando para colocar el módulo en modo Esclavo (Slave)
- AT+VERSION?\r\n Obtener la versión del firmware
- AT+UART=115200,1,2\r\n Configurar el modo de funcionamiento del puerto serie en “modo puente”
- AT+PIO=10,1\r\n Colocar el pin de IO de propósito general a nivel alto
Existen otros comandos AT que están documentados en la hoja de datos que proveen nuestros amigos de iTeadStudio. Podemos encontrar la hoja de datos (datasheet) del HC-05 en la siguiente dirección:
http://biblioteca.geekfactory.mx/Bluetooth_Bee_Pro/datasheet_hc-05.pdf
Es importante notar que al módulo HC-05 no le agradan los caracteres \r o \n sueltos al finalizar un comando. Siempre debemos mandarle \r\n para finalizar cada comando, por lo que debemos configurar nuestro programa de terminal serial para que siempre envíe \r\n al final de cada linea. Si utilizamos el “Monitor Serial” del IDE de arduino hay que configurarlo de la siguiente forma:
Interfaz de configuración de comandos AT en HC-06
El HC-06 tiene un firmware distinto y también un funcionamiento distinto en cuanto a su modo de configuración. Para poder configurar el HC-06 es necesario que este NO este emparejado ni siendo usado por ningun dispositivo. De igual forma que el HC-05 es necesario conectarlo a la PC y usar un programa de terminal para darle instrucciones de configuración (Comandos AT), aunque también podemos escribir un programa de arduino o en un microcontrolador para configurarlo.
Para conectarlo con la PC utilizamos un adaptador USB serial como se muestra en la foto:
El módulo HC-06 acepta un set muy básico de comandos (algo raros por cierto), que permite pocas configuraciones, pero que sin duda será util para personalizar este económico módulo y configurarlo para satisfacer las necesidades de la aplicación.
Los comandos que soporta son:
- Prueba de funcionamiento:
- Envíar: AT
- Recibe: OK
- Configurar el Baudrate:
- Envíar: AT+BAUD<Numero>
- El parámetro número es un caracter hexadecimal de ‘1’ a ‘c’ que corresponden a los siguientes Baud Rates: 1=1200, 2=2400, 3=4800, 4=9600, 5=19200, 6=38400, 7=57600, 8=115200, 9=230400, A=460800, B=921600, C=1382400
- Recibe: OK<baudrate>
- Configurar el Nombre de dispositivo Bluetooth:
- Envíar: AT+NAME<Nombre>
- Recibe: OKsetname
- Configurar el código PIN de emparejamiento:
- Envíar: AT+PIN<pin de 4 digitos>
- Recibe: OK<pin de 4 digitos>
- Obtener la version del firmware:
- Enviar: AT+VERSION
- Recibe: Linvor1.8
Si ya hemos trabajado con comandos AT observaremos que los comandos estan lejos del estándar, lo más obvio es que:
- No es necesario finalizar el comando con \r\n, pero si es necesario ingresar los comandos con todos los caracteres seguidos sin pausas. NO hay necesidad de dar “enter” para finalizar un comando. El modulo tiene un Temporizador que hace necesario introducir el comando de una sola vez, sin pausas entre los caracteres.
- Por lo anterior, si utilizamos un emulador de terminal hay que pegarlos en leste y no escribirlos uno a uno con el teclado. También podemos usar el “monitor serial” de Arduino configurado como se muestra en la imágen más arriba en este artículo.
- Hay que tener cuidado de introducir TODAS LAS LETRAS DEL COMANDO en MAYUSCULAS, ya que de lo contrario, no funcionarán.
- Las respuestas no parecen respuestas estándar a comandos AT.
Conexión básica con Arduino
Las conexiones para realizar con arduino son bastante sencillas. Solamente requerimos colocar como mínimo la alimentación y conectar los pines de transmisión y recepción serial (TX y RX). Hay que recordar que en este caso los pines se debe conectar cruzados TX Bluetooth -> RX de Arduino y RX Bluetooth -> TX de Arduino. La siguiente imagen muestra las conexiones básicas para que funcione el módulo:

Conexión de un módulo HC-06 a Arduino. Hay que revisar la correspondencia de pines en la serigrafía, ya que puede variar dependiendo del proveedor o lote.
En este caso estamos utilizando el hardware de UART, por lo que la comunicación con la PC no será posible. Para poder utilizar la UART para comunicarse con la PC mediante USB, es necesario utilizar un UART emulado por software, de manera que los pines de comunicación con el módulo bluetooth queden en pines distintos.
El código para la comunicación a través del bluetooth es idéntico al que utilizaríamos para comunicarnos con la PC vía USB. El siguiente ejemplo permite encender o apagar el led de la tarjeta arduino mediante el módulo bluetooth. El código funciona de la siguiente manera:
- Al envíar el caracter E, se pone en estado alto la salida del pin 13
- Al enviar el caracter A, se pone en estado lógico bajo la salida del pin 13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | /************************* https://geekfactory.mx ******************************* * * Sketch de prueba para modulos de bluetooth HC-05 y HC-06. Este programa puede * controlar el led de la tarjeta arduino a través de la conexión bluetooth. El * programa puede ampliarse para controlar una mayor cantiad de salidas. * * ESTE SKETCH USA EL PUERTO SERIE (UART), MISMO QUE ES UTILIZADO PARA * LA COMUNICACIÓN USB. EL USO DE BLUETOOTH O USB ES MUTUAMENTE EXCLUSIVO * (NO SE PUEDEN USAR AMBOS AL MISMO TIEMPO). * * PARA USAR LA CONEXIÓN USB Y BLUETOOTH AL MISMO TIEMPO ES NECESARIO EMULAR UNA * UART POR SOFTWARE. * * El funcionamiento es sencillo: * * Enviar un caracter 'A' para encender el led * Enviar un caracter 'a' para apagar el led * */ char rxChar; // Variable para recibir datos del puerto serie int ledpin = 13; // Pin donde se encuentra conectado el led (pin 13) // Configurar el arduino void setup() { // Pin 13 como salida pinMode(ledpin, OUTPUT); // Comunicación serie a 9600 baudios Serial.begin(9600); } // Ciclo infinito, programa principal void loop() { // Si hay datos disponibles en el buffer if( Serial.available() ) { // Leer un byte y colocarlo en variable rxChar = Serial.read(); // Procesar comando de un solo byte if( rxChar == 'A' ) { digitalWrite(ledpin, HIGH); Serial.println("ON"); } else if ( rxChar == 'a' ) { digitalWrite(ledpin, LOW); Serial.println("OFF"); } } // Podemos hacer otras cosas aquí delay(100); } |
Conclusión
Como podemos observar, los módulos HC-05 y HC-06 son bastante sencillos de configurar para usarse con el microcontrolador de nuestra preferencia. El HC-06 es el modelo más sencillo, presentando menos opciones para su configuración, pero siendo bastante util y económico para conectar nuestros dispositivos con microcontroladores a la PC, tablets, celulares, etc. El HC-05 por otra parte, nos permite hacer algunas cosas que su hermano menor no permite, como enlaces punto a punto entre dos módulos y también teniendo un juego de comandos más completo y un poco más “formal”, con algunas características interesantes como el control de pines de GPIO.
Ambos módulos son excelentes para proyectos escolares, de investigación e incluso para su integración en equipos o prototipos en el campo profesional, sin embargo, hay poca documentación formal. Esperamos que este artículo sea de utilidad para comprender mejor el funcionamiento y la configuración inicial.
Cuantos dispositivos esclavos se pueden conectar con el maestro ? Esto para construir una red centralizada
Hola buen dia. Es solo uno por vez. Si deseas hacer una red inalámbrica tipo estrella, checla la hoja de datos del radio NRF24L01+ que vendemos en nuestra tienda virtual.
Saludos soy nuevo en arduino, me recomiendas comprar un hm-10 ? Que diferencias hay entre el hm10, hc08, 06 y 05 cual es el mejor? Saludos, tu sitio está genial para los vamos comenzando, gracias.
El modulo HM-10 es para iphone y los HC son para android
HM-10 es mucho mejor, mejor rango y la autoconexion es posible, si puedes compralo, es mucho superior al HC05 y 06, obviamente no es solo para iphone tambien para android solo cambia la version, es BT4.0 y el HC05 es BT2.0 es mucho inferior
Buenas tardes, tengo el modulo bluetooth hc_06 maestro, pero lo necesito como esclavo. Alguien me dice que podría hacer o una sugerencia.
Lei que se puede cambiar el firmware con el hc_05 eso seria muy util.
Por favor es muy importante, agradezco de ante mano a los colaboradores.
Gracias.
Buenas noches, tengo una grannnnn duda, hemos estado trabajando en un proyecto con arduino modulo bluetooth y muchas cosas mas, pero resulta que no tenemos la pieza correcta del Bluetooth el que tengo es un Sparkfun RN-42 que es de color rojo, y la verdad he probado de mil maneras para que este no quede como una compra inncesesaria ya que nos costo 31$, la opcion viable es que pedire la de este blog porque ya hize las pruebas con este bluetooth y todo bien, pero el problema es ese de Sparkfun, pienso es una perdida de tiempo y dinero, ya que he buscado y no encuentro nada parecido para que me saque de la duda
Una pregunta, ¿alguien sabe si el Hc-05 se puede utilizar como modulo de audio bluetooth?
Buenas noches, quisiera saber si saben por qué cuando hago el test de los comandos AT reconoce casi todos, es decir, si pongo AT me devuelve ok con AT +PSWD me devuelve la contraseña, sin embargo si pongo AT+NAME no hace absolutamente nada pero si intento cambiar el nombre si deja, la verdad no se que es y ya probé poniendo el signo de interrogación y nada. Gracias
Hola amigo, te agradecería y me dieras una luz con el siguiente problema: tengo un HC-05 conectado a un módulo GPS cuyo propósito es enviar los mensajes (NMEA) generados por este último hacia el computador; cuando emparejo mi computador con el HC-05, se crean dos puertos COM virtuales, uno de salida(COM4) y uno de entrada (COM5) de datos, supuestamente el puerto de salida (COM4) es el que permite que el software del computador (ArcGIS) pueda leer los mensajes que provienen del GPS, sin embargo cuando intento conectarme a ese puerto obtengo un mensaje de error. Lo curioso es que si utilizo el monitor serial de Arduino, se conecta sin problemas al puerto y puedo ver que está llegando información, pero si utilizo un programa diferente, el puerto deja de funcionar y se bloquea. Tanto el GPS como el HC-05 los configuré a 9600 baudios. Saludos y felicitaciones por el tutorial.
Buenas tardes Mauricio, me pregunto si ya pudiste realizar el envio de datos del gps por medio del bluetooth, en este momento estoy haciendo algo parecido y no he logrado realizar dicha conexion
hola necesito que puedan subir la foto de la conexion cargo la pagina pero nose puede ver…por favor de agradeceria mucho saludos