Saludos controleros y controleras, en esta entrada aprenderemos a utilizar un acelerómetro y Giroscópio en Arduino. En particular para esta práctica usaremos el BMI160 pero tu puedes utilizar cualquier otro que exista en el mercado.
Antes de comenzar, te invito para que le des un vistazo a nuestro CURSO GRATUITO DE ARDUINO DESDE CERO.
Y que te suscríbas al canal si te gusta la programación, los microcontroladroes y la teoría de control:
BMI 160
El sensor BMI-160 es un sensor de movimiento inercial de 6 ejes baso en MEMS (sistemas microelectromecánicos o microelectromechanical systems). El BMI160 integra un acelerómetro de 3 ejes de 16 bits con un giroscopio de 3 ejes de ultrabaja potencia.
Es importante destacar que sobre nuestra placa desarrollada con el BMI 160 se encuentra marcada la dirección de los ejes, para tener el punto de referencia cuando deseamos obtener datos de aceleración lineal. Vemos que tenemos la dirección del eje x que apunta hacia al frente de la placa, la dirección y apunta hacia arriba de la placa y finalmente la dirección z apunta de abajo para arriba, atravesando el integrado BMI 160.
A continuación se detalla el empleo de un giróscopo y acelerometro en arduino.
Acelerómetro MEMS
Comenzando con la primera característica del BMI160, veremos que un acelerómetro es un dispositivo que permite medir la aceleración inercial que sufre dicho componente. Esta aceleración podemos representarla como el cambio de la velocidad en el tiempo:
a = \dfrac{dv}{dt}
O utilizando la segunda ley de Newton
F = m.a
Partiendo de estas definiciones, si deseamos determinar la dirección del dispositivo, podemos utilizar una fuerza (inclusive la gravedad) sobre una pequeña masa conformada por pequeñas placas de silicio estacionarias y resortes mecánicos que responden a fuerzas.
Es decir que, en el sensor internamente usando componentes MEMS tenemos un cuerpo sólido, en cuyo interior suspendemos una masa sujeta por muelles al cuerpo exterior. Como observado en la siguiente animación:
Entonces, al momento de aplicar una aceleración en el dispositivo en una dirección en particular, evidencie que la masa comenzará a moverse. Ese movimiento va a generar una capacitancia variable entre las placas (la fija y la suspendida). Este cambio de capacitancia será medido, procesado y corresponderá a un valor de aceleración particular en esa dirección.
Giroscópio MEMS
El sensor giroscopio de arduino empleado como ejemplo para esta entrada es el mismo BMI160 pero puedes emplear cualquier otro acelerómetro y giroscopio para arduino que venden en el mercado.
Un giroscopio es un dispositivo de medición capaz de detectar la velocidad angular a la cual está siendo sometido utilizando el efecto Coriolis.
A manera de ejemplo, cuando una masa sufre un movimiento en una dirección en particular particular con una determinada velocidad cualquiera y cuando se una rotación angular externa sobre la masa (flecha verde), se producirá una fuerza, provocando un desplazamiento perpendicular de la masa (Fuerza azul). Del mismo modo que el acelerómetro, dicho desplazamiento va a generar un cambio en la capacitancia que será medida, procesada y corresponderá a una velocidad angular en particular.
A continuación vemos el gráfico de un giroscopio de tres ejes:
La microestructura del giroscopio se parece a esto. Una masa que se mueve constantemente u oscila, y cuando se aplica una velocidad angular externa, la parte flexible de la masa realizará un desplazamiento perpendicular, generando el cambio de capacitancia.
Con el giroscópio tenemos entonces la posibilidad de medir la velocidad de rotación sobre los ejes X, Y Z en grados por segundo.
Control PID con microcontrolador PIC
Sensor de Flujo YF-S201: Medición de Caudal con Arduino
Configuración de Clock y Oscilador en PIC con CCS C
Sistemas de Coordenadas
La información importante que se obtiene a partir de este tipo de dispositivos es conseguir determinar los ángulos de movimientos generados con relación a una posición inicial.
Dicho esto, necesitamos conocer los nombres que se le asignan a dichos movimientos rotacionales que también se describen con estos mismos ejes utilizando la regla de coordenadas de la mano derecha para definir la dirección de la rotación positiva. Al describir el movimiento de rotación, los ejes X, Y y Z se renombran Roll , Pitch y Yaw
Los movimientos son Pitch, Roll y Yaw.
Las rotaciones de la aeronave en el sistema definido por estos ejes se denominan cabeceo o inclinación (pitch); alabeo (rotación lateral) (roll) y guiñada (rotación intrínseca alrededor del eje vertical) (yaw);. Estas rotaciones se usan para describir maniobras, y deben especificarse exactamente en ese orden: cabeceo, alabeo y guiñada.
Giróscopo y Acelerómetro en Arduino – Ejemplo
En el siguiente ejemplo, veremos como leer la información del giróscopio y acelerometro para mostrar los resultados en el Serial Plotter del Arduino.
Código
//***************************************************// //***************************************************// //***** ACELERÓMETRO Y GIROSCÓPIO BMI160 *****// //***** *****// //***** by: Sergio Andres Castaño Giraldo *****// //***** https://controlautomaticoeducacion.com/ *****// //***** *****// //***************************************************// //***************************************************// #include <DFRobot_BMI160.h> DFRobot_BMI160 bmi160; const int8_t i2c_addr = 0x69; void setup() { Serial.begin(115200); delay(2000); //init the hardware bmin160 if (bmi160.softReset() != BMI160_OK){ Serial.println("reset false"); while(1); } //set and init the bmi160 i2c address if (bmi160.I2cInit(i2c_addr) != BMI160_OK){ Serial.println("init false"); while(1); } } void loop() { int i, ini, fin; int rslt; int16_t accelGyro[6]={0}; // Modo 0: Acelerometro y Giroscopio // Modo 1: Solo Giroscopio // Modo 2: Solo Acelerometro int modo = 2; rslt = bmi160.getAccelGyroData(accelGyro); switch(modo){ case 0: ini = 0; fin = 6;break; case 1: ini = 0; fin = 3;break; case 2: ini = 3; fin = 6;break; default: Serial.println("Modo incorrecto"); break; } //Imprime resultados if(rslt == 0){ for(i=ini; i<fin; i++){ if (i<3){ //Los 3 primeros datos son del Giroscopio Serial.print(accelGyro[i]*3.14/180.0); Serial.print("\t"); }else{ //Los siguientes 3 datos son del acelerometro Serial.print(accelGyro[i]/16384.0); Serial.print("\t"); } } Serial.println(); }else{ Serial.println("Error de lectura"); } delay(100); }
Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:
👉 Invitar a Sergio a un Café ☕️
Que esten muy bien, nos vemos en la siguiente entrada.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.