octubre 19, 2017 admin

MPU6050: Giroscopio a MIDI para Arduino (I)

mpu6050-209x300

 

En la presente entrada les compartiré un sketch muy simple que hice para controlar a través del giroscopio MPU6050 un DAW (Ableton live 9). Para ello convertiremos unos valores de dicho dispositivo para usarlo como mensajes de control change (CC).

Necesitaremos

  • MPU6050
  • Protoboard
  • Arduino (UNO funciona bien)
  • Arduino IDE (www.arduino.cc)
  • cables
  • push buttons (yo los usé en mi proyecto por si ocupan)

Antes de comenzar

Yo hago un uso muy parcial y sencillo de este dispositivo. Lo estrictamente necesario para usarlo en las clases y proyectos del Musicmakerspace de G Martell. De ninguna manera soy experto en el tema, pero el código que dispongo funciona muy bien y está fácil de entender. Pueden checar los ejemplos de la librería para adentrarse en algo más pesado, por si gustan. Si no saben aún cómo convertir su arduino en MIDI-USB, chequen mis anteriores posts. (MOCO-LUFA).

Está en plan work in progress, pronto subiré el código completo junto con el proyecto en el que lo estamos utilizando para fabricar nuevos instrumentos en el Musicmakerspace.

Qué es el MPU6050

Según la wiki, el MPU-6050 (GY-521 sensor board) es un sensor fantástico para aplicaciones que procesan movimiento. Recopilamos algo de información para los curiosos, hemos copiado el texto de otra página (referencia al final de la cita)

 


Acelerómetro Giroscopio MPU-6050 6DOF

 DESCRIPCIÓN

 Sensor Giroscópico

 Un giroscopio es un dispositivo que funciona para miden velocidades angulares basándose en el mantenimiento del impulso de rotación. Si intentamos hacer girar un objeto que está girando sobre un eje que no es el eje sobre el que está rotando, el objeto ejercerá un momento contrario al movimiento con el fin de preservar el impulso de rotación total.

El giroscopio muestra el cambio de rango en rotación en sus ejes X, Y y Z.

Acelerómetro

 Mide la aceleración, inclinación o vibración y transforma la magnitud física de aceleración en otra magnitud eléctrica que será la que emplearemos en los equipos de adquisición estándar. Los rangos de medida van desde las décimas de g, hasta los miles de g.

MPU-6050

 El circuito integrado MPU-6050 contiene un acelerómetro y giroscopio MEMS en un solo empaque. Cuenta con una resolución de 16-bits, lo cual significa que divide el rango dinámico en 65536 fracciones,  estos aplican para cada eje X, Y y Z al igual que en la velocidad angular. El sensor es ideal para diseñar control de robótica, medición de vibración, sistemas de medición inercial (IMU), detector de caídas, sensor de distancia y velocidad, y muchas cosas más. El MPU-6050 contiene un giroscópico, un acelerómetro, además de un sensor de temperatura, mediante I2C  regresa unos valores conocidos como raw o “crudos” según el registro seleccionado.

A continuación se mostraron los rangos de escala y el valor máximo raw.

Rango De Escala Completa Giroscopio Sensibilidad del Giroscopio Rango De Escala Completa Acelerómetro Sensibilidad del Acelerómetro
±250 131 ±2 16384
±500 65.5 ±4 8192
±1000 32.8 ±8 4096
±2000 16.4 ±16 2048

 

ESPECIFICACIONES

  • Salida digital de 6 ejes.
  • Giroscopio con sensibilidad de ±250, ±500, ±1000, y ±2000dps
  • Acelerómetro con sensibilidad de ±2g, ±4g, ±8g y ±16g
  • Algoritmos embebidos para calibración
  • Sensor de temperatura digital
  • Entrada digital de video FSYNC
  • Interrupciones programables
  • Voltaje de alimentación: 2.37 a 3.46V
  • Voltaje lógico: 1.8V±5% o VDD
  • 10000g tolerancia de aceleración máxima

Fuente: https://hetpro-store.com/TUTORIALES/modulo-acelerometro-y-giroscopio-mpu6050-i2c-twi/


Manos a la obra

Lo primero que haremos será descargar la librería que nos permite comunicarnos a través de I2C:
https://github.com/jrowberg/i2cdevlib (I2Cdev y MPU6050) acá comprimí las que descargué yo (libs_gyro), copiarlas a Arduino/libraries y descomprimirlas por si no las encuentran.

Conexión del MPU6050 al arduino

mpu

Adicionalmente, yo puse dos botones con resistencia pull-up en los pines 6 y 7 para permitir que el mensaje sólo se envíe mientras se presiona el botón. (Mirar el código).

Código y qué hace

Primero vamos a usar un monitor serial en 9600 para ver qué valores envía nuestro mpu (descarga el sketch monitor_mpu6050.ino)

 


Captura de pantalla 2017-10-18 a las 18.44.51

 

Conecta tu arduino y si el código se subió correctamente, podríamos estar moviéndolo en estas posibilidades y ver cómo se van actualizando los valores.

 

 

MPU6050 y MIDI CC

 

El presente código toma dos valores del acelerómetro (ax & ay , me faltó implementar az pero está en el código)(mpu6050_MIDI_working.ino )nótese que hay varia información comentada (sobre todo la de ver la información del monitor serial para ver qué valores necesitaremos).

Líneas 34-41

Incluye las librerías que necesitaremos (también poner la librería MIDI por si no la tienes)

Líneas 47-51

definimos las variables que usaremos (cc1,cc2 y cc3) además de inicializar elMPU6050, además de los tres ejes del giroscopio. (ax, ay, az).

Void setup() y Void loop()

Inicializamos los botones en 6 y 7 (con resistencia interna pullup), así como la librería MIDI y la I2Cdev. No podemos enviar MIDI al mismo tiempo que al monitor serial, entonces debemos seleccionar MIDI.begin o Serial.begin en el caso de necesitar monitorear el comportamiento.

Escalar valores

según la documentación:

Captura de pantalla 2017-10-18 a las 18.27.59

yo puse los valores viendo la terminal serial, pero podemos usar los que queramos para el tipo de movimiento que queremos 🙂

Luego al final de mi código añado límites por si hicieran falta para mantener el parámetro entre 0 y 127 como un control change (CC) MIDI necesita.

Al final, si están presionados los botones envía información MIDI, de lo contrario no pasa nada:

Captura de pantalla 2017-10-18 a las 18.30.01

Lo que sigue

tomar los 9 valores y hacerlos funcionar todos. Pronto novedades.
Captura de pantalla 2017-10-18 a las 19.08.22