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.
No products found.
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.
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.
No products found.
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.
Citar este Artículo
¡Hola! Soy Sergio Andrés Castaño Giraldo. Bienvenidos a Control Automático Educación, un espacio dedicado a una de mis grandes pasiones: la Ingeniería de Control y la Automatización.
Mi objetivo aquí es tender un puente entre la teoría académica y la práctica profesional. Como profesor e investigador, he tenido la oportunidad de trabajar en proyectos complejos —desde sistemas de compresión en plataformas offshore hasta modelos de control avanzado— y todo ese aprendizaje lo vuelco en este sitio.
Aquí encontrarás material que crece constantemente: desde fundamentos de instrumentación hasta estrategias de control avanzado y programación profesional. Mi meta es que la información que comparto te sea de utilidad real en tu carrera o formación.
Te invito a que te suscribas, te unas a nuestro canal de YouTube y formemos una comunidad de aprendizaje continuo. ¡Gracias por estar aquí!



