Arduino Bluetooth Communication


La comunicación Bluetooth es un sistema de comunicación inalámbrica de corto alcance (unos 10 metros aproximadamente). Aunque algunos pueden llegar a los 30 metros, pero depende también si hay obstáculos o paredes en medio.

Para crear una comunicación se necesitan 2 dispositivos. Para este ejemplo usaremos el Bluetooth del móvil para que transmita información a nuestra placa a través de una aplicación y el Bluetooth HC-05 de nuestra placa.

Aunque pueda parecer complicado, es tan sencillo como establecer una conexión entre los dispositivos y mandar letras de un lado al otro.

El módulo Bluetooth que tenemos se llama HC-05 y su conexión se hace como se indica en la siguiente imagen.

*En los ejercicios de pruebas, se recomienda NO UTILIZAR LOS PINES 0 y 1

Si observamos detenidamente debemos conectar 4 cables a nuestra placa.

Empezamos por la alimentación de energía de nuestra placa al módulo. Como ya sabréis se necesitan siempre 2 cables para que los aparatos eléctricos funcionen. Y siempre han de conectarse un voltaje de alta tensión (cable rojo) y a otro de baja tensión o a tierra, que en inglés se llama GROUND (cable negro).

La conexión de alta tensión es de 3.3V o 5V; nuestra vida no corre peligro de electrocución; es el PIN que aparece como Vcc. Este PIN se ha de conectar al pin del voltaje que aparece en la figura anterior. La conexión a tierra es de 0V y debe ir conectada al PIN que pone GND; que es una abreviación de GROUND.

Cuando lo conectemos veremos parpadear un LED del Bluetooth.

 

Comunicación del Bluetooth

Ahora procederemos a la conexión de los pines de comunicación.

Podemos ver que el Bluetooth tiene otros dos pines que se llaman TXD y RXD. TXD es el canal donde el Bluetooth Transmite información y RXD es el canal de Recepción.

Para establecer una comunicación debemos definir en nuestra placa también un Pin de Recepción, en este ejercicio utilizaremos el 10 y otro de Pin de Transmisión, que será el pin 11.

La lógica que hemos de seguir es que la placa transmite información desde el PIN 11 al Pin de recepción RXD del Bluetooth. Y de la misma manera El Bluetooth transmite información desde TXD a la placa que lo recibe al Pin 10, como se ve en la figura.

TXD –> Pin 10

RXD –> Pin 11

El pin restante KEY no lo usaremos ya que sirve para configurar parámetros internos del módulo.

 

Programación con ArduBlockly

Para programar con Ardublockly deberemos entender los siguientes conceptos.

La tasa de Baudios es la velocidad de la información que se transmite al Bluetooth. No nos adentraremos mucho en este aspecto, pero solo hay que saber que si dos dispositivos no se comunican a la misma velocidad no entenderemos lo que nos dicen si uno transmite a mayor velocidad que el otro.

El Bluetooth por lo general funciona a 38400 bps (baudios por segundo), pero es posible que este configurado con otra velocidad como 9600 o en algunos casos 19200 bps.

Luego especificamos los pines de transmisión como habíamos dicho anteriormente. El Pin 10 a RX y el Pin 11 a TX.

SoftwareSerial es una librería que hace que podamos elegir cuáles son nuestros pines de comunicación en lugar de utilizar los que vienen por defecto que son el 0 y el 1. Pero como esos pines son los que se utilizan para programar la placa y leer desde el monitor serie, vamos a dejarlos libres. Para más información podéis consultar la siguiente página.

Para saber que nuestro dispositivo Bluetooth funciona, vamos a lanzar un mensaje por el puerto serie en el caso de que hayamos enviado un dato desde el móvil a nuestra placa.

Para usar nuestra primera aplicación Bluetooth, una muy sencilla es RoboPad++, en cuyos botones envía una letra concreta para cada acción, por lo que simplificamos el proceso de lectura de datos.

Realizamos el siguiente código de bloques y lo cargamos.

En el momento que emparejemos los dispositivos y apretemos un botón de una aplicación conectada por Bluetooth nos deberá aparecer el mensaje que hemos definido desde el monitor serie.

Si os habéis dado cuenta, y como se documenta anteriormente, cada botón está asociado a una letra, pero puede ser algo confuso. El botón UP por ejemplo ejecuta las letras USS, estas 3 letras contienen una letra indicativa de UP y dos de Stop. Esto ocurre en el momento de liberar el botón, por lo que atenderemos nuestro código en función de nuestros intereses tal y como se explica en el siguiente enlace.


ATENCION: La letra S se envía cuando dejamos de apretar el botón. Es decir que si mantenemos presionado el botón solo enviamos la U, hasta que liberamos que envía la letra S

A partir de este momento, nuestra misión será leer el dato y asociar distintas instrucciones en función de los valores leídos. Pero deberemos tener cuidado a la hora de leer y gestionar la información leída por el Bluetooth.

Por un lado, podemos leer el módulo Bluetooth como si fuera un carácter o como si fuera una linea de texto completa.Hay que prestar atención, porque estos dos tipos de dato son distintos.

El tipode dato carácter, solo lee una letra y se declara como char, mientras que la tipo de dato texto, lee una palabra completa y se declara como String. Así que vamos a estudiarlos por separado.

Caracteres por Bluetooth

Empezaremos leyendo carácter por carácter. Creamos una variable del tipo de dato que necesitamos, en este caso character. Hay que prestar atención en utilizar comillas simples para caracteres. Las comillas dobles son para el tipo de dato texto.

Y leemos en el momento que nuestro programa detecte que hay un dato disponible.

El código nos debe quedar como el siguiente y una vez compilado y subido deberemos de acceder al monitor serie para visualizar los caracteres que se envían.

 

En este momento, podemos activar un actuador reconociendo cada una de las letras que obtenemos de nuestro dispositivo Bluetooth, en este caso moveremos un motor, pero podemos controlar más de un servomotor o encender un LED a distancia.

RECOMENDACIÓN: Usar las pilas para no depender de la alimentación del cable del USB del ordenador

 

Texto por Bluetooth

Si ahora utilizaremos el modelo Beetle de la aplicación y observaremos una cosa muy curiosa. Este nuevo modelo tiene ahora unas pinzas que se pueden abrir y cerrar en mayor y menor medida, así que si apretamos los botones que hay a un lado de la pinza, obtendremos otros valores para leer.

Y en el momento que queramos leer la línea de datos, hacemos check en el apartado readString. De esta manera, leeremos la línea completa del Bluetooth, en vez de asociarlo solo a un carácter.

Este ejercicio es muy útil cuando utilizamos otras aplicaciones que envían un protocolo extendido y necesitamos leer mucha información en una misma línea.

Pasar un valor de texto a número

Si nos encontramos con que el texto puede contener números como es el caso anterior, también podemos extraer ese número de la variable String y almacenarlo en otra variable numérica para controlar sobre otros actuadores mediante ese número.

Este es un modelo especial que nos permite una mayor versatilidad y que manejaremos con aplicaciones más avanzadas. En este programa definimos unos valores mínimos y máximos para la pinza y así convertir fácilmente su rango de apertura.

Leemos un carácter, y si coincide con el que proporciona un número a continuación, leemos un número con el bloque toInt leyendo el resto de la cadena.

¿Cómo se interpretan las letras dentro de una placa electrónica? Nos podemos acordar de que cada letra se corresponde a un número dentro del código ASCII, de esta manera tenemos una correspondencia numérica dentro de una placa con un carácter que podemos leer en nuestro idioma.