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

sábado, 17 de octubre de 2015

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

Los módulos bluetooth del tipo HC-0X tienen unas propiedades editables como el nombre, la velocidad de transmisión de datos o el pin de emparejamiento. Esto, según varias páginas en internet, es muy fácil de realizar, tan fácil que no se explica ni se demuestra como hacerlo. Después de indagar mucho y no conseguir editar mi HC-06 recibiendo respuesta (sí que encontré código que grabado en el Arduino cambiaba la configuración del módulo conectado pero que no permitía ver las respuestas generadas por este) decidí crear mi propio sketch con el que se podría utilizar el Serial Monitor de Arduino a modo de consola. Tras varias pruebas y muchas comidas de cabeza para entender problemas que planteaba, salió a la luz el programa. A continuación está la información de los comandos para este modelo:

1. Test de comunicación
Enviar: AT
Respuesta: OK

2. Cambiar velocidad de transferencia de datos

Enviar: AT+BAUDX
Respuesta: OKY

Pudiendo tomar X e Y los siguientes valores

X..........Y
1..........1200
2..........2400
3..........4800
4..........9600 (Por defecto)
5..........19200
6..........38400
7..........57600
8..........115200
9..........230400
A..........460800
B..........921600
C..........1382400

El ordenador no soporta más de 115200 así que la única forma de controlarlo es mediante programación limitar el cambio de tasa de datos máximo a 8.


3. Cambiar el nombre del módulo (20 caracteres como máximo)

Enviar: AT+NAMEXXXX
Respuesta: OKsetname

Siendo XXXX el nombre que nosotros queramos darle.


4. Cambiar pin de emparejamiento (1234 por defecto)

Enviar: AT+PINXXXX
Respuesta: OKsetPIN

El pin es un número de 4 bits por lo que tiene que ser un número comprendido entre 0000 y 8888.


5. Leer versión de firmware

Enviar: AT+VERSION
Respuesta: OKlinvorV1.X

Siendo X el número de la versión de vuestro módulo.


Hay más comandos, concretamente tres más, que vienen explicados en el datasheet del módulo. Aquí dejo el enlace: Datasheet HC-06



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.


NOTA: Seleccionar "Sin ajuste de línea en el Serial Monitor".

El programa recoge lo introducido por el Serial Monitor del IDE de Arduino, comprueba en primer lugar si es un comando de cambio de frecuencia y luego lo envía (en este caso modifica también la frecuencia del Arduino). Si se trata de otro comando, el módulo genera una respuesta que el programa recoge y muestra. Si por el contrario la cadena de caracteres no es reconocida como un comando interpretable, no genera respuesta y por tanto el programa muestra "Comando no válido". A esto se le suman los controles necesarios de entrada de datos así como la selección automática de frecuencia en el arranque del programa. Por automática se entiende que el Arduino se sintoniza solo a la velocidad a la que esté configurado el módulo (el programa va enviando comandos en distintas frecuencias y cuando recibe respuesta se detiene y queda sintonizado, podemos decir que hace un barrido por todas las frecuencias posibles hasta encontrar la "buena").

En los comentarios del código hay también datos importantes a tener en cuenta a la hora de entender el código como que en los cambios de frecuencia, la respuesta es generada en la frecuencia en la que se encontraba el módulo antes de enviar el comando de cambio. Esto conlleva la siguiente secuencia: Enviar comando > Leer respuesta > Cambiar frecuencia.

Aquí está el esquema de conexión:

Imagen hecha a partir de bases tomadas de Fritzing
Enlace al IDE de Arduino: https://www.arduino.cc/en/Main/Software

miércoles, 23 de septiembre de 2015

Primera entrada: Bienvenidos!!

Esta es la primera entrada del blog y quiero que sirva de presentación del mismo, así que allá vamos.

Este blog nace con el objetivo de compartir conocimiento. Hace ya un tiempo, adquirí el Starter Kit de Arduino y desde entonces ha sido un no parar. Proyectos, ideas, ambición... todo eso me ha acompañado este tiempo en lo referente a la electrónica y a la programación. Pero nadie nace sabiendo. Todo lo que sé es fruto de horas y horas frente al monitor, consultando blogs, el playground o el foro de Arduino... También sé lo costoso que es conseguir información fiable de primera mano, no por la calidad de los posts de la gente, sino por compatibilidad de placas, módulos, o simplemente por el intervalo de tiempo que pasa desde que se publica algo hasta que tú lo necesitas y entonces lo descubres con versiones posteriores, firmwares actualizados, problemas corregidos, otros nuevos detectados, etc. 

Por todo esto he creado este blog. La idea es compartir lo que sé con todo el que quiera. Ahorrarle todas esas horas de trabajo y esos problemas que solucioné yo un día, que no los tenga que volver a solucionar otro (aunque buscar caminos alternativos siempre es una manera de innovar y descubrir métodos nuevos). Al fin y al cabo la ciencia nunca se construye desde cero, sino sobre lo ya descubierto y documentado.

Dicho esto espero que todos los lectores lo disfrutéis y no tengáis ningún reparo en comentar, preguntar, aportar... como he dicho arriba, nadie nace sabiendo. No preguntes por miedo a parecer tonto y serás tonto toda la vida.

Estamos abiertos a todo tipo de propuestas y sugerencias, tanto en lo referente a la forma y estética del blog como al contenido.

Ahora ya solo queda empezar.

¡Ánimo!