{"id":1665,"date":"2014-07-25T09:45:20","date_gmt":"2014-07-25T07:45:20","guid":{"rendered":"http:\/\/guimi.net\/blogs\/hiparco\/?p=1665"},"modified":"2014-07-25T13:26:07","modified_gmt":"2014-07-25T11:26:07","slug":"arduino-modulo-bluetooth","status":"publish","type":"post","link":"http:\/\/guimi.net\/blogs\/hiparco\/arduino-modulo-bluetooth\/","title":{"rendered":"Arduino: M\u00f3dulo Bluetooth"},"content":{"rendered":"<p>En esta entrada configuraremos un m\u00f3dulo Bluetooth para comunicar nuestro Arduino. El objetivo es poder controlar nuestros proyectos desde un tel\u00e9fono m\u00f3vil u otro dispositivo similar con Bluetooth.<\/p>\n<p>Para ello vamos a utilizar un m\u00f3dulo Bluetooth HC-05 (tambi\u00e9n sirve el HC-06) que es muy com\u00fan y econ\u00f3mico (unos 4\u20ac). La diferencia entre ambos m\u00f3dulos es que el HC-05 que puede ser maestro o esclavo (master\/slave), mientras que el HC-06 solo puede actuar como esclavo (slave).<br \/>\n<img decoding=\"async\" src=\"\/imgs\/blog\/hiparco\/arduino\/016_1_Bluetooth_bb.png\" alt=\"\" \/><br \/>\n<!--more--><\/p>\n<p>Adem\u00e1s es bueno saber que el m\u00f3dulo da informaci\u00f3n mediante un LED que parpadea a diferentes velocidades con diferentes significados:<br \/>\n&#8211; Parpadeo r\u00e1pido: preparado<br \/>\n&#8211; Parpadeo lento: preparado para recibir comandos AT (configuraci\u00f3n)<br \/>\n&#8211; Un parpadeo cada cierto rato: emparejado<br \/>\n&#8211; Dos parpadeos cada cierto rato: conectado<\/p>\n<h2>CONFIGURACI\u00d3N<\/h2>\n<p>Primero vamos a configurar el m\u00f3dulo. Esto es recomendable aunque no necesario, y basta con hacerlo una vez. La configuraci\u00f3n se hace mediante <a href=\"http:\/\/es.wikipedia.org\/wiki\/Conjunto_de_comandos_Hayes\">comandos Hayes<\/a> (o comandos AT) y permite establecer cosas como el nombre del dispositivo, la velocidad o la clave (es lo \u00fanico que recomiendo modificar al principio).<\/p>\n<p>Los comandos m\u00e1s habituales son (hay que esperar un segundo entre comando y comando):<br \/>\nAT (devuelve OK)<br \/>\nAT+UART? (devuelve la velocidad)<br \/>\nAT+UART=19200,0,0 (establece la velocidad <em>velocidad<\/em>,<em>bit parada 0\/1<\/em>, <em>bit paridad 0\/1\/2<\/em>, devuelve OK)<br \/>\nAT+NAME? (devuelve el nombre del m\u00f3dulo)<br \/>\nAT+NAME=ARDUGUIMI (establece el nombre del dipositivo, devuelve OK)<br \/>\nAT+ROLE? (devuelve el estado del m\u00f3dulo -0: esclavo; 1: maestro-)<br \/>\nAT+ROLE=0 (establece el estado del dipositivo, devuelve OK)<br \/>\nAT+PSWD? (devuelve la contrase\u00f1a del m\u00f3dulo)<br \/>\nAT+PSWD=1234 (establece la contrase\u00f1a del dipositivo, devuelve OK)<br \/>\nAT+ADDR? (devuelve la direcci\u00f3n MAC del dispositivo)<\/p>\n<p>Para ello realizamos un circuito sencillo (esquema realizado con <a href=\"http:\/\/fritzing.org\/\">Fritzing<\/a>):<br \/>\n<img decoding=\"async\" src=\"\/imgs\/blog\/hiparco\/arduino\/016_1_Bluetooth_bb.png\" alt=\"\" \/><\/p>\n<p>El programa tambi\u00e9n es sencillo y nos permite enviar comandos AT al modulo Bluetooth utilizando el monitor serial para enviar y recibir mensajes. El modulo no debe estar conectado por Bluetooth a nada.<br \/>\nSe debe configurar el modulo serial a 9600 baudios con &#8220;Ambos NL &#038; CR&#8221;.<\/p>\n<p>En mi m\u00f3dulo las respuestas son inteligibles. Parece un problema de juego de caracteres. En teor\u00eda el comando AT+CSCS deber\u00eda ayudar pero no me ha servido. Lo importante es que aunque las respuestas sean ininteligibles, funciona.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * Con este programa se pueden enviar comandos AT al modulo Bluetooth\r\n * utilizando el monitor serial para enviar y recibir mensajes\r\n *\r\n * Se debe configurar el modulo serial a 9600 baudios con &quot;Ambos NL &amp; CR&quot;\r\n * El modulo no debe estar conectado por bluetooth a nada\r\n *\r\n * En mi caso las respuestas son inteligibles, pero funciona. Parece un problema de juego de caracteres.\r\n *\r\n * 2014 - Guimi (http:\/\/guimi.net)\r\n *\r\n * Mas informacion sobre los comandos Hayes (comandos AT): http:\/\/es.wikipedia.org\/wiki\/Conjunto_de_comandos_Hayes\r\n *\r\n *\/\r\n\r\n\r\n\/\/ LIBRERIAS\r\n\/\/----------\r\n#include &lt;SoftwareSerial.h&gt; \/\/Librer\u00eda que permite establecer comunicacion serie en pins diferentes al 0 y 1\r\n\r\n\r\n\/\/ CONSTANTES\r\n\/\/-----------\r\n#define PWR 5 \/\/ Alimentacion del modulo (5V)\r\n#define Rx 10 \/\/ Recepcion\r\n#define Tx 11 \/\/ Transmision\r\n#define KEY 12 \/\/ Indica que se desea comunicar con el modulo (comandos AT)\r\n\r\n\/\/ Inicializamos la comunicacion serie por los puertos del modulo BT establecidos\r\nSoftwareSerial BT(Tx, Rx);\r\n\r\n\/\/ FUNCION SETUP\r\n\/\/--------------\r\nvoid setup(){\r\n  \/\/ Definimos cada pin como entrada o salida\r\n  pinMode(PWR, OUTPUT);\r\n  pinMode(KEY, OUTPUT);\r\n  digitalWrite(PWR, LOW);\r\n  digitalWrite(KEY, HIGH);\r\n  digitalWrite(PWR, HIGH);\r\n\r\n  \/\/ Damos tiempo para que el dispositivo este listo\r\n  delay(500);\r\n\r\n  \/\/ Borramos el buffer del puerto BT  \r\n  BT.flush();\r\n  delay(500);\r\n  \r\n  \/\/ Preparamos la comunicacion mediante el puerto serie y el modulo BT\r\n  BT.begin(38400);\r\n  Serial.begin(9600);\r\n\r\n  \/\/ Notificamos que estamos listos\r\n  Serial.println(&quot;Introduzca comandos AT:&quot;);\r\n  BT.print(&quot;AT\\r\\n&quot;);\r\n\r\n}\r\n\r\n\/\/ FUNCION LOOP\r\n\/\/-------------\r\nvoid loop(){\r\n  \/\/ Si hay algo pendiente en el puerto BT lo transmitimos\r\n  \/\/ de forma transparente al puerto serie\r\n  if (BT.available()) {\r\n    \/\/ Escribimos en el puerto serie lo que leemos en el puerto BT\r\n    Serial.write(BT.read());\r\n  }\r\n\r\n  \/\/ Si hay algo pendiente en el puerto Serial lo transmitimos\r\n  \/\/ de forma transparente al modulo BT (que lo interpreta)\r\n  if (Serial.available()) {\r\n    \/\/ Escribimos en el puerto BT lo que leemos en el puerto serie\r\n    BT.write(Serial.read());\r\n  }\r\n}\r\n<\/pre>\n<h2>USO DEL M\u00d3DULO BLUETOOTH<\/h2>\n<p>Como ejemplo realizamos un circuito a\u00fan m\u00e1s sencillo que el anterior, sin utilizar &#8220;Key&#8221; (que es para configuraci\u00f3n) y alimentando el m\u00f3dulo directamente desde la placa (esquema realizado con <a href=\"http:\/\/fritzing.org\/\">Fritzing<\/a>):<br \/>\n<img decoding=\"async\" src=\"\/imgs\/blog\/hiparco\/arduino\/016_2_Bluetooth_bb.png\" alt=\"\" \/><\/p>\n<p>El programa tambi\u00e9n es sencillo y permite transmitir informaci\u00f3n entre el puerto serie y el puerto Bluetooth. Adem\u00e1s, a modo de ejemplo, interceptamos las se\u00f1ales recibidas por el m\u00f3dulo BT para reaccionar y encender o apagar un LED.<br \/>\nSe debe configurar el modulo serial a 9600 baudios con &#8220;Ambos NL &#038; CR&#8221;.<br \/>\nPara enviar mensajes por Bluetooth podemos utilizar BTControl, un programa de Android realizado por mi que permite conectar con un dispositivo BT y enviarle se\u00f1ales. El objetivo de BTControl es controlar mediante BT un robot Arduino o similar.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/*\r\n * Este programa conecta arduino por bluetooth utilizando un modulo HC-05\r\n * con otro dispositivo (p.e. un android) y ambos se comunican de modo transparente\r\n * \r\n * En medio de la comunicacion &quot;escuchamos&quot; en busca de comandos\r\n *\r\n * Se debe configurar el modulo serial a 9600 baudios con &quot;Ambos NL &amp; CR&quot;\r\n *\r\n * 2014 - Guimi (http:\/\/guimi.net)\r\n *\r\n * Basado en http:\/\/diymakers.es\/arduino-bluetooth\/\r\n *\r\n *\/\r\n\r\n\/\/ LIBRERIAS\r\n\/\/----------\r\n#include &lt;SoftwareSerial.h&gt; \/\/Librer\u00eda que permite establecer comunicacion serie en pins diferentes al 0 y 1\r\n\r\n\r\n\/\/ CONSTANTES\r\n\/\/-----------\r\n#define Rx 10 \/\/ Recepcion\r\n#define Tx 11 \/\/ Transmision\r\n#define LED 13 \/\/ LED\r\n\r\n\r\n\/\/ VARIABLES\r\n\/\/----------\r\nint caracter; \/\/ Caracter recibido\r\n\r\n\/\/ Inicializamos la comunicacion serie por los puertos del modulo BT establecidos\r\nSoftwareSerial BT(Tx,Rx);\r\n\r\n\r\n\/\/ FUNCION SETUP\r\n\/\/--------------\r\nvoid setup() {\r\n  \/\/ Definimos cada pin como entrada o salida\r\n  pinMode(LED, OUTPUT);\r\n\r\n  \/\/ Preparamos la comunicacion mediante el puerto serie y el modulo BT\r\n  BT.begin(9600);\r\n  Serial.begin(9600);\r\n  \r\n  \/\/ Notificamos que estamos listos\r\n  Serial.write(&quot;BT preparado:\\n&quot;);\r\n\r\n}\r\n\r\n\r\n\/\/ FUNCION LOOP\r\n\/\/-------------\r\nvoid loop() {\r\n\r\n  \/\/ Si hay algo pendiente en el puerto Serial lo transmitimos\r\n  \/\/ de forma transparente al modulo BT (que lo envia directamente al aparato vinculado)\r\n  if (Serial.available()) {\r\n    \/\/ Escribimos en el puerto BT lo que leemos en el puerto serie\r\n    BT.write(Serial.read());\r\n  }\r\n\r\n\r\n  \/\/ Si hay algo pendiente en el puerto BT lo transmitimos\r\n  \/\/ de forma transparente al puerto serie y buscamos comandos conocidos\r\n  if (BT.available()) {\r\n    \/\/ Leemos el puerto\r\n    caracter = BT.read();\r\n\r\n    \/\/ Escribimos en el puerto serie lo que leemos en el puerto BT\r\n    Serial.write(caracter);\r\n\r\n    \/\/ Si el mensaje recibido es uno conocido, ejecutamos la orden correspondiente\r\n    \/\/ En este sencillo ejemplo, algunos caracteres apagan el LED y otros caracteres encienden el LED\r\n    if (caracter == 'A' || caracter == '5' || caracter == 'W') {\r\n      \/\/ Turn off LED\r\n      digitalWrite(13, LOW);\r\n    } else if (caracter == 'B' || caracter == '1' || caracter == '2' || caracter == '3' || caracter == '4' || caracter == '6' || caracter == '7' || caracter == '8' || caracter == '9' || caracter == 'Y') {\r\n      \/\/ Turn on LED\r\n      digitalWrite(13, HIGH);\r\n    }\r\n\r\n    \/\/ Ademas para uno de los caracteres introducimos un salto de linea\r\n    if (caracter == '5') Serial.write('\\n');\r\n    \r\n  }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En esta entrada configuraremos un m\u00f3dulo Bluetooth para comunicar nuestro Arduino. El objetivo es poder controlar nuestros proyectos desde un tel\u00e9fono m\u00f3vil u otro dispositivo similar con Bluetooth. Para ello vamos a utilizar un m\u00f3dulo Bluetooth HC-05 (tambi\u00e9n sirve el HC-06) que es muy com\u00fan y econ\u00f3mico (unos 4\u20ac). La diferencia entre ambos m\u00f3dulos es [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,29,16,33],"tags":[],"class_list":["post-1665","post","type-post","status-publish","format-standard","hentry","category-arduino","category-electronica","category-hardware","category-programacion"],"_links":{"self":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts\/1665","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/comments?post=1665"}],"version-history":[{"count":15,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts\/1665\/revisions"}],"predecessor-version":[{"id":1696,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/posts\/1665\/revisions\/1696"}],"wp:attachment":[{"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/media?parent=1665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/categories?post=1665"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/guimi.net\/blogs\/hiparco\/wp-json\/wp\/v2\/tags?post=1665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}