0

Recibir datos de una IMU vía Bluetooth con Arduino y Linux

portada_IMU_bluetoothSaludos, humano. Al habla Transductor. Hoy me siento inspirado y voy a enseñarte cómo recibir el valor del ángulo de una IMU a través de Bluetooth. Arduino va a leer la IMU (un MPU-6050) y enviará el ángulo a través de un módulo Bluetooth HC 06, de forma que puedas ver los datos en la pantalla de tu ordenador.

Este tutorial es una fusión de otros dos que escribí. El primero mi sorprendentemente exitoso tutorial de Arduino y MPU-6050, dónde explico los detalles de esta IMU y las sutilezas del filtro complementario. El segundo es el tutorial sobre el módulo Bluetooth HC 06 en Linux. Te recomiendo que los leas si no has tocado nunca alguna de estas piezas o si quieres profundizar más en lo que explicaré durante este artículo.


 

Material:

  • Un chip MPU-6050
  • Un módulo Bluetooth HC 06
  • Una placa Arduino, preferentemente UNO, Nano o similares
  • Un cable USB
  • Un ordenador con Linux instalado

Instalar Blueman

Para que el ordenador pueda leer los datos que le llegan por Bluetooth desde Arduino, necesitarás un gestor de Bluetooth. Si estás en Linux, te recomiendo Blueman Bluetooth Manager. Si tienes una distribución con el sistema de paquetes .deb (Ubuntu, Debian y similares) puedes instalarlo con este comando de la Terminal:

apt-get install blueman

La instalación es corta. Ahora deberías poder abrirlo desde el menú y ver esta pantalla.

inicio_blueman


Conectar el HC 06 a Arduino

Como ya deberías saber a estas alturas, el HC 06 es un módulo Bluetooth. Tiene la ventaja de ser muy barato, puede encontrarse fácilmente y es sencillo de configurar: sólo se necesita conectarlo a una placa Arduino y mediante comandos por Serial se puede cambiar su Password, ID, baud rate

El HC 06 tiene cuatro pines: los dos de alimentación (VCC y GND) y otros dos para enviar datos (TX y RX). Estas son las conexiones del HC 06 con la placa Arduino:

Arduino RX – HC06 TX
Arduino TX – HC06 RX
Arduino 3.3V – HC06 VCC
Arduino GND – HC06 GND

Sí, los pines RX y TX de Arduino y el módulo están cruzados. No es ninguna equivocación.

modulemodulo_pines


Conectar el MPU-6050

El MPU-6050 es una IMU de 6DOF (se lee 6 Degrees Of Freedom). Eso significa que lleva un giroscopio y un acelerómetro, ambos de tres ejes (X,Y,Z). El MPU-6050 utiliza el protocolo I2C para enviar valores en bruto (raw values) de los ángulos que mide. Después, estas lecturas deben procesarse para evitar errores de precisión.

Las conexiones entre el MPU-6050 y Arduino son:

Arduino 3.3v – IMU VCC
Arduino GND – IMU GND
Arduino A5 – IMU SCL
Arduino A4 – IMU SDA

NOTA IMPORTANTE: En algunas versiones de Arduino los pines SDA y SCL son otros. Si tienes Arduino Leonardo o Arduino Due, visita este enlace para saber dónde tienes que conectar los pines SDA y SCL de la IMU.


Configurar el módulo Bluetooth

Si no lo has hecho ya, te recomiendo que configures el módulo HC 06. Este programa cambiará su nombre por el de ArduinoR y su password por 0000. A la hora de cargar el programa, tienes que desconectar el módulo Bluetooth. El código se transmite por Serial, y si no lo desconectas estaría ocupado por el HC 06. Después, tendrás unos pocos segundos para volver a conectarlo.

/* Programa de configuracion del modulo HC 06 con Arduino
 * Cambia el nombre del dispositivo, el PIN y los baudios
 *
 * Escrito por Transductor
 * www.robologs.net
 */
char nombre[10] = "ArduinoR";
char password[10] = "0000";
char baud = '4'; //4 = 9600 baud
 
void setup()
{
  Serial.begin(9600);
  
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  delay(15000); //Esperar 15 segundos para conectar el modulo
  
  Serial.print("AT"); //Iniciar la configuracion
  delay(1000);
  
  Serial.print("AT+NAME"); Serial.print(nombre); //Cambiar el nombre
  delay(1000);
  
  Serial.print("AT+PIN"); Serial.print(password); //Cambiar password
  delay(1000);    
  
  Serial.print("AT+BAUD"); Serial.print(baud); //Cambiar baudios
  delay(1000);
  
  digitalWrite(13, HIGH);
}
 
void loop(){}


 Programa para la IMU

Una vez configurado el módulo HC 06 tienes que cargar este código. Es el mismo que hay en el tutorial de Arduino y MPU-6050 del que te he hablado al principio. Simplemente lee las lecturas de la IMU, las combina y les aplica un filtro para eliminar posibles imprecisiones. Al final envía el ángulo X,Y por Serial.


#include <Wire.h>
 
//Direccion I2C de la IMU
#define MPU 0x68
 
//Ratios de conversion
#define A_R 16384.0
#define G_R 131.0
 
//Conversion de radianes a grados 180/PI
#define RAD_A_DEG = 57.295779
 
//MPU-6050 da los valores en enteros de 16 bits
//Valores sin refinar
int16_t AcX, AcY, AcZ, GyX, GyY, GyZ;
 
//Angulos
float Acc[2];
float Gy[2];
float Angle[2];

void setup()
{
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
}

void loop()
{
   //Leer los valores del Acelerometro de la IMU
   Wire.beginTransmission(MPU);
   Wire.write(0x3B); //Pedir el registro 0x3B - corresponde al AcX
   Wire.endTransmission(false);
   Wire.requestFrom(MPU,6,true); //A partir del 0x3B, se piden 6 registros
   AcX=Wire.read()<<8|Wire.read(); //Cada valor ocupa 2 registros
   AcY=Wire.read()<<8|Wire.read();
   AcZ=Wire.read()<<8|Wire.read();
 
    //Se calculan los angulos Y, X respectivamente.
   Acc[1] = atan(-1*(AcX/A_R)/sqrt(pow((AcY/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
   Acc[0] = atan((AcY/A_R)/sqrt(pow((AcX/A_R),2) + pow((AcZ/A_R),2)))*RAD_TO_DEG;
 
   //Leer los valores del Giroscopio
   Wire.beginTransmission(MPU);
   Wire.write(0x43);
   Wire.endTransmission(false);
   Wire.requestFrom(MPU,4,true); //A diferencia del Acelerometro, solo se piden 4 registros
   GyX=Wire.read()<<8|Wire.read();
   GyY=Wire.read()<<8|Wire.read();
 
   //Calculo del angulo del Giroscopio
   Gy[0] = GyX/G_R;
   Gy[1] = GyY/G_R;
 
   //Aplicar el Filtro Complementario
   Angle[0] = 0.98 *(Angle[0]+Gy[0]*0.010) + 0.02*Acc[0];
   Angle[1] = 0.98 *(Angle[1]+Gy[1]*0.010) + 0.02*Acc[1];
 
   //Mostrar los valores por consola
   Serial.print("Angle X: "); Serial.print(Angle[0]); Serial.print("n");
   Serial.print("Angle Y: "); Serial.print(Angle[1]); Serial.print("n------------n");
 
   delay(10); //Nuestra dt sera, pues, 0.010, que es el intervalo de tiempo en cada medida
}

Acuérdate de desconectar el HC 06 a la hora de cargar el programa.


Recibir los datos

Ahora Arduino está enviando los datos a través del cable USB. Pero no quieres eso, ¿verdad, lector? Los datos deben enviarse a través de la antena Bluetooth. Hay que decirle al ordenador que lea lo que llega por Bluetooth y lo muestre por pantalla.

Abre Blueman. Arriba a la izquierda verás un botón que pone “Search“. Si lo pulsas aparecerá una lista con todos los dipositivos Bluetooth cercanos, entre ellos el nombre que le has puesto a la placa Arduino (si no has modificado el código de configuración del HC 06, se llamará ‘ArduinoR’). Pulsa con el botón derecho sobre el nombre y selecciona la opción “Pair“.

pairingTendrás que introducir el PIN y darle a Aceptar. Si no has cambiado el programa de configuración, el PIN es ‘0000’. Cuando se haya emparejado aparecerá un aviso.

Sólo queda un último paso: vuelve a abrir el menú flotante y selecciona DevB. Esto hará que el dispositivo aparezca en la carpeta /dev/

conectar_devB

En la esquina superior derecha de la pantalla aparecerá un mensaje informándote de la nueva dirección del dispositivo. En mi caso es /dev/rfcomm0.

mensaje_conexionAhora abre la Terminal y escribe

cat < /dev/rfcomm0

pero cambiando /dev/rfcomm0 por tu dirección. Si has seguido bien toda mi explicación, verás que aparecen los valores de la IMU sobre la Terminal. Hay un poco de retraso a la hora de adaptarse a los cambios de inclinación, pero es normal.

Esto es todo por hoy, humano. Este robot ya ha cumplido el cupo diario de electrónica.

Final de línea.

 

Tr4nsduc7or

Originariamente creado cómo un galvanómetro de bolsillo, Transductor tomó consciencia de si mismo y fue despedido cuando en vez cumplir con su trabajo se dedicó a pensar teorías filosóficas sobre los hilos de cobre, los electrones y el Sentido del efecto Joule en el Universo. Guarda cierto recelo a sus creadores por no comprender la esencia metafísica de las metáforas de su obra. Actualmente trabaja a media jornada cómo antena de radio, y dedica su tiempo libre a la electrónica recreativa y a la filosofía.

Antes de comentar, por favor, lee las Normas

Ten el honor de decir "Primero!"

avatar
wpDiscuz