sábado, 12 de diciembre de 2015

Configuración del módulo bluetooth HC-05 por comandos AT

El módulo HC-05 es un módulo físicamente igual que el HC-06, el siguiente de la familia, pero diferente en cuanto al firmware que llevan grabado. La principal distinción es que se puede conectar a otro módulo al poder configurarlo como maestro, algo que en el 06 es imposible, siendo siempre esclavo. Ser maestro o esclavo NO determina la dirección del flujo de datos, es decir, la comunicación es bidireccional. Al igual que con el módulo HC-06, presentado en la entrada anterior, con el HC-05 también escribí un sketch con el objetivo de utilizar el Serial Monitor del IDE de Arduino como consola y poder, mediante esta, enviar comandos y modificar las propiedades configurables de estos módulos.

Al adquirir este módulo (que por cierto me costó muy barato, 2'74€) por AliExpress, lo primero que observé es que no tenía los pines típicos de un HC-05 que yo había visto por internet. En vez de STATE, RXD, TXD, GND, VCC y KEY, tenía STATE, RXD, TXD, GND, VCC y EN. Mi primer pensamiento fue que como el único pin diferente era el KEY (que sabía que era el necesario para entrar en el modo AT), el EN sería una especie de "enable" y tendría la misma función. Pero como estas cosas nunca son como te esperas, en las pruebas falló.

NOTA: Para los módulos "normales" todo lo explicado en este post también sirve, con la ventaja de tener el pin KEY accesible desde el primer momento y no teniendo que hacer soldaduras extra como me pasó a mí. Aunque recomiendo leer la entrada entera por si acaso, no habría ningún problema en acceder directamente a la parte de los comandos y del esquema de conexiones y posteriormente al código, saltándose la parte intermedia.

Después de buscar y buscar, me enteré de que había más de un tipo de módulo, y que lo que variaba era el patillaje de la base azul (lo que es realmente el módulo es la plaquita verde y es igual en todos. Nosotros llamaremos módulo al conjunto en sí, incluyendo la base azul y haré distinción cuando me refiera solo a la plaquita verde). El que yo tenía llevaba soldado un pulsador entre el pin de la placa verde correspondiente a la entrada en el modo AT, el cual debía estar pulsado para entrar. Pero no era así sin más porque midiendo continuidad con el pulsador presionado, el polímetro marcaba infinito, es decir, no había continuidad. Mi modelo de módulo era el GW-040 (o ZS-040) que funcionan de una manera ligeramente diferente a los "normales". Por esto decidí hacer lo que explico en el párrafo siguiente.


Pulsador en el módulo.

Casi toda la información que utilicé y en la que me baso para lo que explico a continuación fue sacada de http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/. Tengo que decir que no toda esa información me fue útil. Después de leer la página y hacer las pruebas pertinentes llegué a "mi" método pero antes de explicarlo quiero hacer un matiz. Manteniendo presionado el botón que traía mi módulo (teniendo el pin EN en HIGH) entraba en el modo AT, pero como dice la página de Martyn Currey, hay dos modos AT, que llama "full" y "mini". En el primero, todos los comandos están "habilitados", pero en el segundo hay unos cuantos que lanzan error al enviarlos. Para entrar, sí o sí hay que poner el pin 34 en HIGH pero una vez dentro podemos mantenerlo o quitarlo, quedándonos en "full" o cambiando a "mini". Mi planteamiento fue que iba a ser costoso estar pendiente de mantener el pulsador del módulo presionado y enviar los comandos a la vez a través del PC, por eso opté por cortar el plástico protector en el que van enfundados estos dispositivos y soldar en el pin 34 de la placa verde medio jumper (en vez de puentear el pulsador como habría sido lógico pensar ya que como he dicho antes, el polímetro no marcaba continuidad al accionar el pulsador). Luego le di un par de vueltas de celo para evitar tirones accidentales. Así quedó soldado:

Antes de "envolver" en celo.

Localización del pin 34 en la placa verde.

Así, poniendo el pin 34 en HIGH a través del jumper entraba en modo AT y a no ser que lo desconectase estaba en "full", teniendo acceso a todos los comandos, algo mucho más cómodo. Según he leído, hay que hacer un divisor de voltaje para alimentar ese pin 34 con 3.3V pero también digo que alguna vez lo he conectado a los 5V de Arduino y no ha pasado nada extraño, ha funcionado como siempre. La última cosa que señalar es que para entrar en AT hay que tener el pin 34 alimentado antes de conectar la alimentación del módulo, es decir, imaginando que tenemos una protoboard delante, conectar primero el pin que nos hace de KEY y luego "pinchar" el módulo. Sabremos que hemos entrado porque la luz roja se alternará en encendida y apagada en intervalos de un segundo en cada posición. También es válido conectar tanto alimentación como KEY y controlar por software cual se activa primero, por ejemplo con un delay().

Aquí dejo el enlace del datasheet (Datasheet HC-05) y una lista con todos los comandos (tomada de la guía del usuario del módulo bluetooth EGBT-045MS).

Aquí muestro el esquema de conexiones (sin divisor de voltaje en el pin 34):
Imagen hecha a partir de bases tomadas de Fritzing

Este módulo, para detectar un comando, tiene que leer el "final de línea" y el "retorno de carro" ("\r\n"), pero para simplificarlo aun más y no tener que estar pendiente de cambiarlo, ya va incluido en el código y por tanto el Serial Monitor tiene que estar, como de normal, en "Sin ajuste de línea".

En este momento ya podemos cargar el sketch a nuestro Arduino. El archivo .ino lo podéis encontrar en el enlace a "Archivos" al final de la entrada junto al enlace al IDE de Arduino.

Cabe destacar que al entrar en modo AT con el HC-05, este entra siempre en frecuencia 38400, así que nos ahorramos la función de "sintonización" a la frecuencia correspondiente que utilizábamos en el sketch del 06, por lo demás es casi idéntico.

Enlace al IDE de Arduino: https://www.arduino.cc/en/Main/Software

37 comentarios:

  1. Hola, tengo unas simples cuestión, por que conectas el rx y tx al RX y TX del arduino en vez de usar pines diferentes? y dos ¿por que debo ponerle resistencias al pin rx?

    ResponderEliminar
    Respuestas
    1. Hola Carlos, a la primera pregunta:
      Entiendo que te refieres a por qué no he utilizado los pines rx y tx del Arduino. Lo lógico sería utilizarlos pero a la hora de cargar un sketch necesitas tener esos pines libres al ser los mismos que utiliza el puerto serial del ordenador, es decir, no puede estar conectado el pc (a través del USB) y el módulo en esos pines a la vez. Para evitar tener que desconectar y conectar si aplicamos modificaciones al programa y lo queremos subir una vez montado el circuito, utilizo la librería SoftwareSerial, que permite establecer los pines que indiquemos nosotros como puerto para comunicación, dejando libres los tx(1) y rx(0).

      A la segunda pregunta:
      Normalmente la electrónica que adquiramos funcionará a 3.3V pero llevará un regulador de tensión para poder alimentarla con 5 o más voltios y que reduzca el voltaje para el funcionamiento de controladores u otros componentes de la placa. Hay páginas donde se comenta que la entrada de datos no lleva esa "protección" con el regulador y recomiendan montar un divisor de voltaje con resistencias para conseguir los 3.3V desde los 5V que envía Arduino (al contrario no es necesario porque Arduino sí es capaz de interpretar correctamente los 3.3V supuestos que envía el módulo). La idea es que la primera resistencia tenga una caída de 1/3 de la tensión, lo que se traduce en que el pin rx conectado a continuación recibirá 3.33V (5-5*1/3)(esto se consigue poniendo las resistencias de modo que la segunda tenga valor aproximado al doble a la primera). En la práctica yo alguna vez lo he puesto sin el divisor y ha funcionado todo perfectamente, no sé si porque realmente sí que lleva regulador el módulo o porque el controlador tolera los 5V, pero aun así, dos resistencias, que en mi país rondan los 4 céntimos cada una, creo que es un gasto permisible a la hora de montar el circuito y que nos asegura la protección de nuestro HC-05.

      Un saludo y gracias por comentar.

      Eliminar
    2. Gracias por tu respuesta, me haz librado de muchas dudas. Aunque, ya realizado estos pasos, como hago que mi bluetooth quede en modo maestro para que me mande datos al pc (estoy haciendo un trabajo y quiero mandar datos de mi MPU6050 por BLuetooth a mi pc)

      Eliminar
    3. Para conectar un módulo de esta familia con un dispositivo como un pc, un móvil o una tablet, el módulo necesariamente tiene que estar en modo esclavo. Si estás seguro de tener un HC-05 (los HC-06 que conozco son fijos y todos son esclavos), siguiendo este post, debes introducir el comando "AT+ROLE=0" sin comillas (si introduces "AT+ROLE=1" establecerás modo maestro). Ahora estarás en modo esclavo. Desde tu pc, si buscas dispositivos bluetooth debería aparecerte tu módulo y pedir una contraseña que será, si no la has cambiado, "1234". Una vez introducida la contraseña se emparejará y podrás mediante el código oportuno leer los datos que te envíe el Arduino. Creo que no es necesario decir que tu pc debe disponer de conexión bluetooth. Algo que hay que destacar es que para salir del modo AT (ya sea "full" o "mini") hay que desconectar la alimentación del módulo o bien este entero. El sketch que hay publicado se encarga de entrar automáticamente en modo AT así que cuando lo reconectes asegúrate de no tener este mismo programa cargado ya que entrarías de nuevo en este modo. La configuración en esclavo permanecerá así hasta que mediante comandos la vuelvas a cambiar. Si tienes problemas con la contraseña, en el datasheet a partir de la página 5 tienes todos los comandos y las diferentes configuraciones (nombre, contraseña, emparejamiento...) que puedes conseguir según los parámetros introducidos.

      Por lo que me has dicho creo que entiendes que para enviar datos ha de ser maestro. Esto es falso. Ser maestro o esclavo es solo la condición necesaria para establecer comunicación. Podríamos compararlos con un conector electrónico: necesitas un macho y un hembra para que el cobre haga contacto aunque luego la corriente puede circular en un sentido o en otro. Aquí pasa lo mismo, da igual quien sea maestro o esclavo en cuanto al tráfico de datos, ambos podrán enviar y recibir aunque para establecer la conexión sí deberán tener un rol específico.

      Eliminar
    4. Hola disculpa quisiera que me ayudes en algo yo tengo tambien el hc 05 pero el que viene con el boton y lo estoy usando con un pic 16f887 el problema es que cuando enciendo el modulo para poder vincularlo con mi celular el modulo no aparece no lo detecta el detalle es que el modulo queda con el led intermitente esperando ah que se conecte pero no lo encuentra el celular ni ningun dispositivo quisiera saber ah que se debe eso y si hay alguna forma de correguirlo usando comandos at para ccs agradeceria tu respuesta

      Eliminar
    5. El tema de la sintaxis para pics se me escapa. Conozco C/C++ pero nunca lo he utilizado para programar microcontroladores.

      Para empezar, lo ideal sería que buscases una inscripción en el módulo que te certificase que es del tipo GW-040 o ZS-040 para asegurarte de que la estructura interna es como la que explico aquí. De ser así podrás seguir los pasos que seguí yo y que cuento en este post (soldar el pin extra, utilización de los modos full y mini...) Acerca del tema de los comandos, obviamente no podrás utilizar el código que publico salvo que haya alguna forma de programar pics desde el IDE de Arduino, lo cual desconozco, pero mientras al módulo le lleguen los comandos debería poder configurarse igual. Con esto me refiero a que los comandos son "estándar", lo que cambia son las funciones con las que se los envías, las cuales dependen del lenguaje que utilices.

      Lo importante, una vez solucionado el problema de comunicación para transferirle los comandos, es que AT+ROLE esté a 0 (modo esclavo), AT+CMODE=1 (para que pueda conectarse con cualquier dispositivo y no solo con el dispositivo de la MAC que tenga configurada), y por último establecer una contraseña con AT+PSWD para poder introducirla en el dispositivo con el que te vayas a conectar, que en este caso es tu teléfono (por defecto suele venir "1234").

      Espero que te haya sido de ayuda. De no ser así, en Aliexpress hay Arduinos Nano muy bien de precio que no llegan a 2€ (1.76 USD), de los que además el funcionamiento es idéntico al del Arduino UNO que aparece en diagrama de conexiones que publico en este post y que te sirven para configurar tu HC-05 por comandos AT. Con esto quiero decir que si es algo que puedes necesitar más adelante y a lo que le puedes sacar provecho a lo mejor te conviene adquirir uno. Si estás familiarizado con microcontroladores y sabes programar tampoco te costaría aprender a programar en Arduino, con lo que tu adquisición por escasos 2€ puede ser bastante interesante.

      Eliminar
    6. He entendido que la frecuencia de comunicación no la habías cambiado y por eso no te he dicho nada. Por si acaso, la "normal" es la de 9600 baudios que se configura como AT+UART=9600,0,0. Esto lo debes especificar también en la app que utilices en el teléfono. Tienes más información acerca de los comandos en el datasheet del módulo, también publicado en este post.

      Eliminar
  2. Muchas gracias por explicarme todo, y tenias razón, con cualquier modulo HC-05 o 06 sirve la transmisión de datos, ademas, tu código para la configuración del modulo HC-05 funciono a la perfección. Gracias por todo.

    ResponderEliminar
  3. Hola, he visto tu publicación y espero que me ayudes a resolver mis dudas, tengo un HC-05 configurado como slave, desde una app que estoy haciendo en android envió un dato y sin problema el HC-05 lo recibe (¿Como se?... porque tengo un led para que encienda en caso de que llegue un dato en especifico ´1´ de lo contrario no sucede nada), ahora quiero enviar cuando llegue el dato enviar otro dato al android, eso aun no logro hacerlo, en AT configure mi HC-05 así:
    AT+ROLE=0 (slave)
    AT+UART=9600,0,0

    Y mi sketch para enviar y recibir es este...
    char entrada;
    int a=1;
    int v=1;
    #include
    SoftwareSerial conexion(10,11);//RX|TX
    void setup()
    {
    pinMode(7,OUTPUT);
    conexion.begin(9600);
    digitalWrite(7,LOW);
    }

    void loop()
    {
    if(conexion.available()>0)
    {
    entrada=conexion.read();
    if(entrada=='1')
    {
    digitalWrite(7,HIGH);
    conexion.write(entrada);
    delay(200);
    }
    //conexion.write(entrada);
    }
    }

    ResponderEliminar
    Respuestas
    1. Hola, en teoría la configuración del módulo es correcta. Creo que el problema está donde pones "conexion.write(entrada);", que debería ser "conexion.print(entrada);". La función write(), desde mi experiencia, solo se usa para visualizar caracteres creados para pantallas LCD (es decir, los que te defines tú, normalmente mediante createChar(), y que no van incorporados). Pruébalo y me comentas si se ha solucionado el fallo.

      Hago un par de observaciones a tu código. Declaras variables antes de la etiqueta "include". Esto no es del todo correcto aunque en muchos casos funcione. La etiqueta include es lo que se llama una directriz de precompilado. Esto quiere decir que mediante ella el compilador edita (sí, edita) el código antes de compilarlo. En concreto, en este caso, incorpora (como un copy-paste) el código alojado en SoftwareSerial.h. Si diese la casualidad de que algunas de las variables que te declaras para tu sketch coinciden en nombre con las internas del código que incorporas mediante el #include, probablemente te tiraría error al compilar. Si este error te lo marca en la librería, para encontrar el fallo te puedes volver loco. Por eso te recomiendo que las etiquetas tipo #include, #define... las pongas al inicio de todo y evites posibles problemas de ese tipo. La segunda observación es que veo que utilizas:

      #include
      SoftwareSerial conexion(10,11);//RX|TX

      Me imagino que te faltará "" (sin las comillas) después del include. No estoy seguro de que funcione tal y como lo has publicado en el comentario. Aclaro que todo esto son solo sugerencias basadas en lo que sé.

      Un saludo. Espero respuesta.

      Eliminar
    2. Error de dedo eso del #include, ya he cambiado las recomendaciones que me haz hecho y de todas maneras, no trabaja para enviar datos, ya no se que mas probarle, no se si en los parametros de la velocidad en AT le tenga que poner algun otro valor, por ejemplo UART=9600,1,0

      Eliminar
    3. Una duda, de que sirve el AT+ROLE=2
      Estoy leyendo acerca de el y según y dice "Slave-Loop----Passive connection, receive the remote Bluetooth master device data and
      send it back to the master device; "

      Eliminar
    4. La configuración que deberías tener es la 9600,0,0. Estoy redactando un código y comprobaré si conectándolo con un pc funciona. Cuando lo tenga te lo comparto por aquí.

      Respecto a tu duda, nunca he configurado como AT+ROLE=2 pero entiendo que hace función de espejo. Aun así creo que no debería haber problemas utilizando las de 0 y 1. ¿Has corregido lo de "write" por "print"?, pensaba que el fallo estaba ahí. En cuanto pueda te subo el sketch.

      Eliminar
    5. Te dejo 3 capturas. Al final lo he comprobado con un Android con la aplicación SerialTerminal que está disponible en Google Play. En la primera captura de pantalla se puede ver en la parte de abajo un "Port: HC-05" que nos verifica a qué dispositivo estamos vinculados. Una vez le doy a Connect se conecta y se puede ver en la segunda captura como enviando varios números solo devuelve los "1" (que son los que entran dentro del "if"). En la última captura se puede ver la configuración mediante la que está comunicando, que comparando con los parámetros del datasheet verifica que es correcto AT+UART=9600,0,0.

      Un detalle a tener en cuenta es que si el módulo no está en AT+CMODE=1 será imposible conectarlo con nadie que no tenga la dirección especificada con BIND (estos comandos se usan para especificar con que módulo quieres que se conecte en una conexión entre Arduinos, aunque si no lo has usado debería estar bien configurado). En tu caso esto no debería ocurrir ya que como comentabas, sí que lograbas enviar pero no leer de vuelta. En breves subiré un nuevo tutorial de como conectar los módulos a PC y a Androids y entre sí con lo que menciono algunas líneas más arriba. Espero que se haya solucionado el problema. Te adjunto también el código que utilicé para comprobarlo. Hice algunos cambios para aprovechar un montaje que ya tenía hecho. Utilicé los pines 4 y 2 en vez de los 10 y 11 y en vez de conectar un led al pin 7 usé el que incorpora Arduino en el pin 13.

      Los últimos posibles errores que se me ocurren son que tu Arduino no soporte la librería SoftwareSerial.h (yo uso Uno, Nano y Mega y en este último no funciona), que justamente los pines que utilizas no estén habilitados internamente para usar como puerto, cuya solucion sería cambiar a otros, o que la aplicación que estás desarrollando tenga algún problema y por eso no te permite leer. Insisto que con el código con el que comentaste pero cambiando write por print debería funcionar.

      Un saludo.

      Enlace: https://drive.google.com/open?id=0BxJcVvlDwBsIQTRLT1BLMDBLNWM

      Eliminar
    6. Sobre esto que comentas "Un detalle a tener en cuenta es que si el módulo no está en AT+CMODE=1 será imposible conectarlo con nadie que no tenga la dirección especificada con BIND", esos comandos AT no los he modificado porque hasta donde lei son usados en caso que se quiera usar el modulo como maestro, he probado mi bluetooth con la app que me recomendaste y claro que arranca, manda uno y a su vez recibe uno, el problema entonces esta en mi codigo de android, ya es un pequeño gran paso para seguir adelante, y si, cambie el write por println, gracias.

      Eliminar
    7. Sí, así es. Te lo comenté por si en el futuro lo cambias para otro proyecto, que tengas en cuenta que a lo mejor tienes que reconfigurarlo para tu proyecto de la app con Android. Me alegro de que al menos hayas encontrado el fallo. Al fin y al cabo es lo primero que hay que hacer cuando algo no funciona. Un saludo :)

      Eliminar
    8. Saludos, gracias por la ayuda y tienes muy buen blog. (Y)

      Eliminar
  4. Muy Buena info, gracias

    MCH, Argentina

    ResponderEliminar
  5. Buenas tardes. Felicidades por el post! tengo el gw-040 y realize los pasos y logro configurar los comandos AT pero despues no puedo comunicar el dispositivo al bluetooth del celular. el led parpadea con intermitencia de 2seg aproximadamente. Por favor una ayuda

    ResponderEliminar
    Respuestas
    1. Creo que lo que te sucede es que no sales de modo AT. Prueba a apagar Arduino, desconectar de la protoboard el pin que has soldado (dejándolo al aire eh, no lo desueldes!), y volver a encender Arduino.

      Cuando estés conectado con tu teléfono el módulo HC-05 debería hacer un parpadeo rápido dos veces, estar dos segundos apagado y así sucesivamente. Te dejo la secuencia aquí siendo cada paréntesis el tiempo en segundos, la E encendido y la A apagado:

      E(0.5), A(0.5), E(0.5), A(2)...

      Si por el contrario parpadea así, E(2) A(2) E(2) A(2)... quiere decir que, efectivamente, no has salido del modo AT.

      Espero tu respuesta :D

      Eliminar
  6. Tenia el mismo problema con mi modulo... no entraba en modo configuración.... tengo mal pulso para soldar...... al encender el modulo... aprietas el botón una vez y queda en modulo configuracion

    ResponderEliminar
  7. De verdad, ¡muchísimas gracias! Ya no sabía qué hacer con el módulo BT y tú me has ayudado. Gracias, en serio.

    ResponderEliminar
  8. Hola a todos, estoy iniciando un nuevo proyecto, el cual consiste en un PIC16F628A y un modulo HC-05, primero quiero configurar al modulo con los famosos comandos "AT" desde el pic, sin necesidad de alguna computadora, ya que mi proyecto asi lo requiere, he intentado infinidad de codigos y ni siquiera logro cambiarle el nombre al modulo, conecto el pin "KEY" del modulo a positivo antes que nada para entrar en modo comansos AT, el LED parpadea mas o menos cada 2 segundos despues de que alimento al modulo, este es un codigo que intente:
    #include <16f628a.h>
    #use delay(INTERNAL=8M)
    #use rs232(baud=9600,bits=8,stop=1,parity=N,xmit=pin_b2,rcv=pin_b1)
    #FUSES INTRC_IO
    #FUSES NOWDT
    #FUSES NOMCLR
    #FUSES NOBROWNOUT
    #FUSES NOLVP
    #FUSES NOPROTECT
    #use standard_io(a)
    void main()
    {
    output_high(pin_a1);
    delay_ms(500);
    output_low(pin_a1);
    printf("AT+NAMEJARVIS\r\n");
    }

    ResponderEliminar
    Respuestas
    1. Muy buenas, sin tener un esquema de conexión es algo complicado. Te propongo una cosa con la que a lo mejor solucionas tu problema. Para un proyecto que estuve haciendo necesitaba poder modificar parámetros pero no tenía el módulo demasiado accesible físicamente para estar pulsando botones o conectando pines y habilitar el modo AT. La solución fue alimentarlo desde un pin de Arduino.

      El consumo del modulo es muy bajo y en mi caso, mi Arduino era capaz de suministrar la corriente necesaria para hacerlo funcionar. Prueba a alimentar la patilla VCC del HC-05 con uno de los pines de tu PIC (pero asegúrate antes que el micro es capaz de alimentarlo, para un UNO la corriente máxima son 20mA: https://www.arduino.cc/en/Main/ArduinoBoardUno, y de que la tensión son 5V). Una vez conectado sería algo tan sencillo como alimentar el KEY y después el VCC para que al arrancar el módulo entrase en modo AT. Una vez terminado de configurar, puedes poner a 0 los pines KEY y VCC (esto apagaría el módulo) y a continuación volver a activar el VCC (esto lo volvería a encender pero sin entrar en AT al no tener el KEY en high). Como ves la idea es muy sencilla, solo consiste en controlar la alimentación del módulo electrónicamente. En caso de que tu PIC no fuese capaz de suministrar la corriente necesaria, siempre puedes utilizar un transistor para hacer la funcion descrita antes. El 2N2222 debería valerte. Espero noticias. Un saludo.

      Eliminar
    2. Hola, muchas gracias por la respuesta, hice lo que me dijiste, pero en vez de mandarle un UNO con un pin del PIC, le mande un CERO con un pin del PIC y conecte positivo directo al modulo, al principio alimento el pin 34 del modulo con positivo, después enciendo el modulo y este parpadea lento, le mando los comandos AT y después lo apago y lo vuelvo a encender y el led parpadea muy rápido, pero no logro ni siquiera cambiarle el nombre al modulo, tengo conectado el TX del modulo al RX del PIC y también el RX del modulo al TX del PIC, los tengo conectados directo sin ningún divisor de voltaje, ya que anteriormente lo he utilizado así y me ha funcionado, realice una aplicación y transmitía y recibía datos desde un celular y un PIC y funcionaba sin necesidad de un divisor de voltaje, en fin lo que quiero lograr es comunicar dos PIC'S, uno de ellos con un HC-05 y el otro con un HC-06, el HC-05 lo quiero configurar como maestro para que se conecte al HC-06, pero quiero configurarlo desde el PIC, pero no logro ni cambiarle el nombre al modulo,muchas gracias y un saludo

      Eliminar
    3. Hey! Creo que ha habido una confusión. Cuando hablaba de UNO me refería al modelo de la placa Arduino, que se llama Arduino UNO.

      A pesar de todo, creo que el funcionamiento está bien por lo que describes. El problema es de código según parece. Cuando te conectas con los HC-05 en modo AT la velocidad de transmisión es de 38400 baudios. Si envías a otra frecuencia diferente o no respetas los delays entre instrucciones es posible que no funcione (por temas de saturación de buffer).

      Lo ideal sería que pudieses leer lo que te devuelve el módulo para ver si te envía las respuestas programadas (ejemplo: enviando "AT" devuelve "OK") o por el contrario te envía algún carácter raro, lo que significaría que algo no estás haciendo bien. Solo puedo decirte que por lo que comentas, el problema de hardware que te expliqué en el anterior comentario lo has solucionado y ahora mismo el problema es puramente de código.

      Si no encontrases solución te propongo como opción conseguir una placa Arduino UNO o Arduino Nano, que por internet son muy baratas, y programarlos desde ahí con el código que hay en esta entrada. Siento no poder ayudarte más con tu PIC.

      Un saludo.

      Eliminar
    4. Al fin lo pude resolver, era la velocidad, leí la hoja de datos del PIC y con 16 MHz tenia menos error, use un oscilador externo y funciono, logre cambiarle el nombre, pin y todo lo que desee al modulo,muchas gracias.

      Eliminar
  9. Hola, disculpa cuento con dos módulos de bluetooth, uno es fc-114 y el otro es zs-040. Los dos ingresan correctamente a modo configuración ya que parpadean con intervalos de 1 segundo, sin embargo al momento de introducir los comandos AT, no me regresa una respuesta como OK, que es la que aparece en todos los ejemplos. Serías tan amable de ayudarme. Gracias

    ResponderEliminar
    Respuestas
    1. Hola, antes de buscar soluciones quiero que hagas algunas comprobaciones para asegurarnos de que no has pasado nada por alto.
      Lo primero es saber si son HC-05 o 06 (entiendo que si lo has comentado en esta entrada en vez de en la del HC-06, será un 05) ya que el código es muy parecido pero no idéntico, por ejemplo en cuanto a las frecuencias de comunicación, imprescindible para que el pc y el módulo se "hablen" a la misma velocidad. Lo segundo es saber si has probado el código que hay en la entrada (me he dado cuenta de que no se ve y tiene que ser por alguna incompatibilidad, de todas formas en el enlace del final tienes el archivo .ino). Este código nunca me ha dado problemas, de hecho antes de publicarlo rebusqué posibles fallos y hasta ahora a nadie le ha dado problemas. Lo último que se me ocurre es que tengas configurado el Monitor Serie en "CR+LF" por ejemplo en vez de "Sin ajuste de línea". Cuando puedas, por favor, revisa eso y me comentas algo. Te recomiendo hacer las pruebas con el comando "AT" ya que este sirve tanto para el modo full como el mini.

      Un saludo.

      Eliminar
  10. Hola,perdona,pero cuando envío el comando AT me devuelve: Comando no válido.Estoy usando un Arduino Mega.He probado con muchos códigos diferentes y no me devuelve el Ok.

    ResponderEliminar
    Respuestas
    1. Hola, esto sucede porque el código subido es para los Arduino UNO, Nano... En el sketch subido se ha utilizado la librería SoftwareSerial par especificar que la comunicación serie va por dos pines distintos a los predefinidos 0 y 1. La placa Arduino MEGA, tiene 4 canales para comunicación serie y parece ser que por esto no admite el cambio a otros pines diferentes mediante la librería mencionada antes. La solución por tanto pasa por corregir el código para tu caso, eliminando el "cambio" de pines y especificando directamente por qué puerto quieres que se comunique mediante Serial2.begin(), Serial3.begin()... No me enrollo más. Si no sabes como hacer esto, vuelve a comentar y seguimos profundizando en el asunto. Un saludo y perdón por la tardanza en contestar, el inicio de curso es duro ;)

      Eliminar
  11. Hola que tal, tengo problemas con un HC-05. Despues de tratar de configurarlo con muchos códigos por medio del arduino logré modificar nombre y pin (aunque me pide un pin de 6 caracteres me parece raro, si lo pongo de 4 me marca ERR), pero no puedo cambiarlo a esclavo me marca "ERR" y trato de meter otros comandos AT y marca lo mismo, será que le falta el cable que tu soldaste para que me deje configurar todos los parametros? Y tampoco puedo salir del modo de comandos AT, sigue con el parpadeo lento. Saludos.

    ResponderEliminar
    Respuestas
    1. Hola, lo primero que debes hacer es asegurarte de que tu módulo es un HC-05 y que entras en el modo AT adecuado (no todos los parámetros son modificables desde todos). Por esto último es por lo que tuve que soldar dicho pin. Así no puedo decirte más. Es algo que nunca había visto y que tendría que depurar con calma. Si estás usando el código que dejé publicado, intenta ejecutarlo con la version 1.6.7 del IDE de Arduino. Particularmente, es una versión que no me ha dado problemas y la última con la que me han funcionado bastantes librerías I2C, por ejemplo, así que no me extrañaría que fallase o no se ejecutase correctamente si usas una versión POSTERIOR. Siento no poder ayudarte más. Un saludo :)

      Eliminar
  12. Hola, hace tiempo que has publicado esta entrada, pero buscando por Google he llegado a tu página.
    Tengo el hc05 zs-040. Yo he entrado en el modo At 2, presionando el botón al conectarle +5 hasta que el parpadeo de la luz sea lento.
    Uso el monitor de arduino para programar y la verdad que he podido configurarlo correctamente.
    He podido vincularlo a mis teléfonos android, pero ( aquí es donde me pierdo), cuando intento conectarme no lo consigo. No entiendo porque. La app que quiero usar no establece la conexión.
    He buscado en mil foros pero no doy con la solución.
    Estoy a la espera de un hc06 para probar... Lo que me extraña es que se vincule bien pero después no hay conexión? Por Qué?

    ResponderEliminar
  13. Congratulation for the great post. Those who come to read your Information will find lots of helpful and informative tips. Stencil Mexico

    ResponderEliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Hola, tengo un problema con un HC 05 que no se deja configurar, desde el primer momento que lo conecté, ya estaba supuestamente en modo configuración (parpadeo lento), conseguí cambiarle el nombre, y ya no ha vuelto a contestar, sigue en modo de configuración, he probado todos los métodos que he encontrado, y no consigo nada.
    Ya es un reto personal, no es por el módulo que vale una miseria.
    Muchas gracias

    ResponderEliminar

Piensa, comenta, comparte y crece...