ARDUINO 009 COMUNICACIÓN CON EL EXTERIOR A TRAVÉS DE BLUETOOTH

COMUNICACIÓN CON EL EXTERIOR A TRAVÉS DE BLUETOOTH
En este caso vamos a realizar la misma operación que en el anterior pero la información intercambiada será utilizando Bluetooth BLE (Bluetooth Low Energy) por lo que necesitaremos un smartphone Android o IOS y un módulo Bluetooth BLE que conectar a nuestro Arduino. En este caso utilizaremos el Bluetooth HM-10 que es posible encontrarlo aquí.
HM 10
A continuación las conexiones pertinentes del módulo HM-10 al Arduino. Hay que tener en cuenta que las patillas series TX y RX deben ir cruzadas.
HM 10 Connection
Como podemos ver en la Wiki de HM-10 se trata de un módulo Bluetooth BLE que posee abstrae y empaqueta una conexión Bluetooth Low Energy en una conexión serie. En la configuración "de fábrica" del firmware el módulo se comporta como un periférico BLE que expone un servicio BLE de conectividad (UUID: 0000ffe0-0000-1000-8000-00805f9b34fb) que permite la comuniciación entre el módulo y cualquier otro dispositivo central que se conecte a él. Para ello utiliza una característica (UUID: 0000ffe1-0000-1000-8000-00805f9b34fb) que almacena una lista de bytes (sin formato) con la siguiente lógica de funcionamiento:
  • Cuando el dispositivo central quiere enviar algún dato al módulo, hace un WRITE en la característica con el contenido del dato.
  • Cuando el módulo quiere enviar un dato al dispositivo central conectado, envía una NOTIFICATION al dispositivo central.
El módulo HM-10 implementa una conexión serie en los pines 1 (TXD en la placa breakout) y 2 (RXD) que está conectada a nivel lógico con la conexión BLE. Todo lo que le entra por el pin RXD lo envía vía notificaciones al dispositivo central y todo lo que escribe el dispositivo central se saca vía el pin TXD. De esta forma aunque los dos dispositivos (módulo HM-10 y dispositivo central) se están comunicando a través de BLE, de cara al micro que controla el módulo se trata de una simple conexión serie. En el caso de Arduino, está conexión se gestiona como cualquier otra conexión serie utilizando las librerías Serial o SoftwareSerial según los pines de Arduino a los que se conecten los pines TXD y RXD del módulo.
Esto último que podemos encontrar en la wiki del módulo es muy importante porque hará que tratemos al módulo bluetooth como si de un puerto serie se tratase.
Veamos ahora que modificaciones debemos realizar en nuestro anterior sketch para poner a funcionar el módulo:

/*
 * En este ejemplo leeremos comandos enviados desde una aplicación Android o IOS mediante bluetooth
 * y responderemos en función del mensaje recibido.
 * 
 * 
 */

#include <SoftwareSerial.h> //Incluimos los archivos de cabecera de la biblioteca SoftwareSerial para configurar un puerto serie

#define SIZE_BUFFER 200 //Tamaño del buffer

String inputString = "";         // cadena que utilizaremos de buffer para los mensajes recibidos
boolean stringComplete = false;  // variable que utilizaremos para saber si la cadena está completa. Comunmente se le suele llamar bandera o flag en inglés

SoftwareSerial bluetooth(2, 4); // RX, TX  
//  Conexión HM10               Arduino Uno
//     Pin 1/TXD     <---->     Pin 2 RX
//     Pin 2/RXD     <---->     Pin 4 TX

void setup() {

  // Inicializamos el puerto serie del Arduino a 9600 baudios y esperamos a que esté conectado
  // En este caso lo utilizaremos como debugger, es decir, todo las comunicaciones serán retrasmitidas también por este puerto para que sean visible en la consola.
  // Esto permitirá detectar si todo está funcionando correctamente.
  Serial.begin(9600);
  while (!Serial) {
    ; // bucle esperando por la conexion USB
  }

  // Configuramos el baud rate a 9600. El HM-10 debería venir por defecto con 9600. De no ser así deberá modificarse este valor o bien el del módulo mediante comandos AT (ver la wiki)
  bluetooth.begin(9600);

  // Reservamos 200 bytes de memoria para la cadena que utilizaremos de buffer
  inputString.reserve(SIZE_BUFFER);

  // Mensaje de bienvenida
  Serial.println("##### Ejemplo 5 Transmitiendo datos por Bluetooth ####");

}

void loop() {
  
  // Leemos del puerto serie hasta que se llene el buffer o haya un salto de linea

  // Seteamos la bandera a false
  stringComplete = false;

  // Mientras haya datos disponibles leemos caracter a caracter del puerto serie
  // Hemos sustituido el objeto Serial por el creado con anterioridad bluetooth
  while (bluetooth.available() && !stringComplete) {
    // Leemos un nuevo caracter:
    char inChar = (char)bluetooth.read();
    // lo concatenamos a inputString:
    inputString += inChar;
    // comprobamos si es un salto de linea o se ha llenado el buffer, si es asi seteamos la bandera a true
    if (inChar == '\n' || inputString.length() == SIZE_BUFFER) {
      stringComplete = true;
    }
  }

  /*
   * Si se trata de una cadena válida actuamos en consecuencia y vaciamos el buffer
   */
  if(stringComplete){
  
    //Eliminamos el salto de linea si lo hubiese
    inputString.replace("\n", "");
    
    if(inputString.equals("Hola")){
      Serial.println("Recibido por bluetooth:" + inputString);
      Serial.println("Saludos");
      //Enviamos sin salto de linea esta vez. Un detalle inportante a tener en cuenta es que los mensajes en BLE tiene un tamaño 20. Se se envían mensajes más grandes estos se fraccionarán
      bluetooth.print("Saludos");
    }else{
      Serial.println("No entiendo tu mensaje: "+inputString);
      bluetooth.print("No entiendo");
    }

    // Limpiamos el buffer
    inputString = "";
  }

  delay(500);
 
}

Una vez cargado el programa en el Arduino y si está todo conectado correctamente debería verse el mensaje de bienvenida del programa en la consola.
Para poder enviar y recibir datos por Bluetooth BLE utilizaremos la aplicación nRF Connect for mobile Android o nRF Connect for mobile iOS
Las siguientes capturas hacen referencia a la aplicación de Android pero el proceso en iOS es similar. En primer lugar escaneamos dispositivos y debería aparecer una lista en la que uno de ellos suele tener un nombre HM-10 o un nombre similar al chip que lleva, en este caso. A continuación se puede ver una captura de la aplicación con el listado de dispositivos escaneados. Será necesario que nuestro dispositivo posea Bluetooth 4 BLE.

List devices
Si entramos en el dispositivo (en este caso CC41-A) veremos los servicios del dispositivo y dentro del servicio ffe0 encontraremos la característica ffe1 en la que podremos suscribirnos por notificaciones de cambio de la característica (recibir datos), hacer una lectura del valor que tiene actualmente la característica o escribir un valor en la característica (esto mandará por serie lo que escribamos al Arduino).
Device
Si utilizamos el comando escribir (flecha hacia arriba), podremos enviar un mensaje al Arduino. En este caso se nos mostrará la siguiente ventana, seleccionaremos TEXT y enviaremos la palabra Hola.
TEXT
HOLA
Veremos que se ha impreso en la consola pero el Arduino no nos ha contestado, esto es debido a que utilizamos como carácter de fin de trama un salto de linea por lo que para terminar el mensaje podríamos enviar (seleccionado en lugar de TEXT UINT8) el número 10 que es la correspondencia en ASCII del salto de línea. Otra opción que queda propuesta al lector es modificar el código y utilizar un carácter de fin de trama distinto como por ejemplo una @ o un *.
diez
Resultado de la consola:
Monitor Result
Resultado en el móvil:
saludos
Con esta práctica hemos visto como es posible comunicar un Arduino median Bluetooth BLE. Este tipo de comunicación es muy útil si se está a cortas distancias y se quiere ahorrar batería en la comunicación.









No hay comentarios:

Publicar un comentario