En este tutorial, te mostraremos cómo utilizar un acelerómetro y giroscopio con un Arduino y MPU6050. Estos sensores te permitirán realizar mediciones de movimiento y orientación con precisión. ¡Sigue leyendo para descubrir cómo incorporar estas herramientas a tus proyectos electrónicos!
En este tutorial aprenderemos a utilizar el sensor de acelerómetro y giroscopio MPU6050 con Arduino. Primero explicaré cómo funciona el MPU6050 y cómo leer los datos del mismo, y luego haremos dos ejemplos prácticos.
Puede ver el vídeo a continuación o leer el tutorial escrito a continuación.
descripción general
En el primer ejemplo, creamos una visualización 3D de la alineación del sensor utilizando el entorno de desarrollo de Processing y en el segundo ejemplo creamos una plataforma autoestabilizadora simple o un cardán de bricolaje. Según la orientación del MPU6050 y sus datos combinados de acelerómetro y giroscopio, controlamos los tres servos que mantienen la plataforma nivelada.
Cómo funciona
La IMU MPU6050 cuenta con un acelerómetro de 3 ejes y un giroscopio de 3 ejes integrados en un solo chip.
El giroscopio mide la velocidad de rotación o la tasa de cambio de posición angular a lo largo del tiempo a lo largo de los ejes X, Y y Z. Utiliza tecnología MEMS y el efecto Coriolis para la medición, pero puedes encontrar más detalles al respecto en mi tutorial dedicado “Cómo funcionan los sensores MEMS”. Las salidas del giroscopio están en grados por segundo. Entonces, para obtener la posición angular solo necesitamos integrar la velocidad angular.
Por>
La IMU MPU6050 también se denomina dispositivo de seguimiento de movimiento de seis ejes o dispositivo 6-DoF (seis grados de libertad) debido a sus 6 salidas o 3 salidas de acelerómetro y 3 salidas de giroscopio.
Ver también
Cómo realizar un seguimiento de la orientación utilizando Arduino y el acelerómetro ADXL345
Arduino y MPU6050
Veamos cómo podemos conectar el sensor MPU6050 al Arduino y leer sus datos. Usamos el protocolo I2C para comunicarnos con el Arduino, por lo que solo necesitamos dos cables para la conexión y dos cables para la alimentación.
Puede>
- MPU6050 IMU………………………………..…. Amazonas / Banggood / AliExpress
- Placa Arduino………………………….….. Amazonas / Banggood / AliExpress
- Cables de puente y placa de pruebas………… Amazonas / Banggood / AliExpress
Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.
Código Arduino MPU6050
Aquí está el código Arduino para leer los datos del sensor MPU6050. Debajo del código encontrará una descripción detallada.
/*
Arduino and MPU6050 Accelerometer and Gyroscope Sensor Tutorial
by Dejan, https://howtomechatronics.com
*/
#include <Wire.h>
const int MPU = 0x68; // MPU6050 I2C address
float AccX, AccY, AccZ;
float GyroX, GyroY, GyroZ;
float accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ;
float roll, pitch, yaw;
float AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ;
float elapsedTime, currentTime, previousTime;
int c = 0;
void setup() {
Serial.begin(19200);
Wire.begin(); // Initialize comunication
Wire.beginTransmission(MPU); // Start communication with MPU6050 // MPU=0x68
Wire.write(0x6B); // Talk to the register 6B
Wire.write(0x00); // Make reset - place a 0 into the 6B register
Wire.endTransmission(true); //end the transmission
/*
// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
Wire.beginTransmission(MPU);
Wire.write(0x1C); //Talk to the ACCEL_CONFIG register (1C hex)
Wire.write(0x10); //Set the register bits as 00010000 (+/- 8g full scale range)
Wire.endTransmission(true);
// Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
Wire.beginTransmission(MPU);
Wire.write(0x1B); // Talk to the GYRO_CONFIG register (1B hex)
Wire.write(0x10); // Set the register bits as 00010000 (1000deg/s full scale)
Wire.endTransmission(true);
delay(20);
*/
// Call this function if you need to get the IMU error values for your module
calculate_IMU_error();
delay(20);
}
void loop() {
// === Read acceleromter data === //
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
//For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value
// Calculating Roll and Pitch from the accelerometer data
accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)
// === Read gyroscope data === //
previousTime = currentTime; // Previous time is stored before the actual time read
currentTime = millis(); // Current time actual time read
elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
Wire.beginTransmission(MPU);
Wire.write(0x43); // Gyro data first register address 0x43
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
// Correct the outputs with the calculated error values
GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
GyroY = GyroY - 2; // GyroErrorY ~(2)
GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
// Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
gyroAngleY = gyroAngleY + GyroY * elapsedTime;
yaw = yaw + GyroZ * elapsedTime;
// Complementary filter - combine acceleromter and gyro angle values
roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;
// Print the values on the serial monitor
Serial.print(roll);
Serial.print("/");
Serial.print(pitch);
Serial.print("/");
Serial.println(yaw);
}
void calculate_IMU_error() {
// We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
// Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
// Read accelerometer values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
// Sum all readings
AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
c++;
}
//Divide the sum by 200 to get the error value
AccErrorX = AccErrorX / 200;
AccErrorY = AccErrorY / 200;
c = 0;
// Read gyro values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
GyroX = Wire.read() << 8 | Wire.read();
GyroY = Wire.read() << 8 | Wire.read();
GyroZ = Wire.read() << 8 | Wire.read();
// Sum all readings
GyroErrorX = GyroErrorX + (GyroX / 131.0);
GyroErrorY = GyroErrorY + (GyroY / 131.0);
GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
c++;
}
//Divide the sum by 200 to get the error value
GyroErrorX = GyroErrorX / 200;
GyroErrorY = GyroErrorY / 200;
GyroErrorZ = GyroErrorZ / 200;
// Print the error values on the Serial Monitor
Serial.print("AccErrorX: ");
Serial.println(AccErrorX);
Serial.print("AccErrorY: ");
Serial.println(AccErrorY);
Serial.print("GyroErrorX: ");
Serial.println(GyroErrorX);
Serial.print("GyroErrorY: ");
Serial.println(GyroErrorY);
Serial.print("GyroErrorZ: ");
Serial.println(GyroErrorZ);
}
Code language: Arduino (arduino)
Descripción del código: Primero debemos incluir la biblioteca Wire.h que se usa para la comunicación I2C y definir algunas variables necesarias para almacenar los datos.
En la sección de configuración, debemos inicializar la biblioteca de cables y restablecer el sensor a través del registro de administración de energía. Para hacer esto tenemos que Hoja de datos del sensor desde donde podemos ver la dirección de registro.
Si>
// Configure Accelerometer Sensitivity - Full Scale Range (default +/- 2g)
Wire.beginTransmission(MPU);
Wire.write(0x1C); //Talk to the ACCEL_CONFIG register (1C hex)
Wire.write(0x10); //Set the register bits as 00010000 (+/- 8g full scale range)
Wire.endTransmission(true);
// Configure Gyro Sensitivity - Full Scale Range (default +/- 250deg/s)
Wire.beginTransmission(MPU);
Wire.write(0x1B); // Talk to the GYRO_CONFIG register (1B hex)
Wire.write(0x10); // Set the register bits as 00010000 (1000deg/s full scale)
Wire.endTransmission(true);
*/
Code language: Arduino (arduino)
En la sección de bucle, comenzamos a leer los datos del acelerómetro. Los datos de cada eje se almacenan en dos bytes o registros y podemos encontrar las direcciones de estos registros en la hoja de datos del sensor.
Para>
// === Read acceleromter data === //
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
//For a range of +-2g, we need to divide the raw values by 16384, according to the datasheet
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value
Code language: Arduino (arduino)
Para obtener valores de salida de -1g a +1g adecuados para el cálculo de ángulos, dividimos la salida por la sensibilidad previamente seleccionada.
Finalmente>estas dos fórmulasCalculamos el ángulo de balanceo y cabeceo a partir de los datos del acelerómetro.
// Calculating Roll and Pitch from the accelerometer data
accAngleX = (atan(AccY / sqrt(pow(AccX, 2) + pow(AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~(0.58) See the calculate_IMU_error()custom function for more details
accAngleY = (atan(-1 * AccX / sqrt(pow(AccY, 2) + pow(AccZ, 2))) * 180 / PI) + 1.58; // AccErrorY ~(-1.58)
Code language: Arduino (arduino)
A continuación, obtenemos los datos del giroscopio utilizando el mismo método.
Leemos>
// === Read gyroscope data === //
previousTime = currentTime; // Previous time is stored before the actual time read
currentTime = millis(); // Current time actual time read
elapsedTime = (currentTime - previousTime) / 1000; // Divide by 1000 to get seconds
Wire.beginTransmission(MPU);
Wire.write(0x43); // Gyro data first register address 0x43
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true); // Read 4 registers total, each axis value is stored in 2 registers
GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s range we have to divide first the raw value by 131.0, according to the datasheet
GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
Code language: Arduino (arduino)
Aquí>
// Correct the outputs with the calculated error values
GyroX = GyroX + 0.56; // GyroErrorX ~(-0.56)
GyroY = GyroY - 2; // GyroErrorY ~(2)
GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8)
// Currently the raw values are in degrees per seconds, deg/s, so we need to multiply by sendonds (s) to get the angle in degrees
gyroAngleX = gyroAngleX + GyroX * elapsedTime; // deg/s * s = deg
gyroAngleY = gyroAngleY + GyroY * elapsedTime;
yaw = yaw + GyroZ * elapsedTime;
Code language: Arduino (arduino)
Finalmente, combinamos los datos del acelerómetro y giroscopio usando un filtro complementario. Utilizamos el 96% de los datos del giroscopio porque son muy precisos y no se ven afectados por influencias externas. La desventaja del giroscopio es que se desvía o introduce errores en la salida con el tiempo. Por tanto, a largo plazo utilizamos los datos del acelerómetro, en este caso un 4%, que es suficiente para eliminar el error de deriva del giroscopio.
// Complementary filter - combine acceleromter and gyro angle values
roll = 0.96 * gyroAngleX + 0.04 * accAngleX;
pitch = 0.96 * gyroAngleY + 0.04 * accAngleY;
Code language: Arduino (arduino)
Sin embargo, dado que no podemos calcular la guiñada a partir de los datos del acelerómetro, no podemos implementar el filtro complementario.
Antes de ver los resultados, me gustaría explicar brevemente cómo obtener los valores de corrección de errores. Para calcular estos errores, podemos llamar a la función personalizada calcular_IMU_error() mientras el sensor está en una posición plana y quieta. Aquí tomamos 200 mediciones para todas las salidas, las sumamos y las dividimos por 200. Dado que mantenemos el sensor en una posición plana y quieta, los valores de salida esperados deben ser 0. Entonces con este cálculo podemos encontrar el error promedio que comete el sensor.
void calculate_IMU_error() {
// We can call this funtion in the setup section to calculate the accelerometer and gyro data error. From here we will get the error values used in the above equations printed on the Serial Monitor.
// Note that we should place the IMU flat in order to get the proper values, so that we then can the correct values
// Read accelerometer values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
AccX = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccY = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0 ;
// Sum all readings
AccErrorX = AccErrorX + ((atan((AccY) / sqrt(pow((AccX), 2) + pow((AccZ), 2))) * 180 / PI));
AccErrorY = AccErrorY + ((atan(-1 * (AccX) / sqrt(pow((AccY), 2) + pow((AccZ), 2))) * 180 / PI));
c++;
}
//Divide the sum by 200 to get the error value
AccErrorX = AccErrorX / 200;
AccErrorY = AccErrorY / 200;
c = 0;
// Read gyro values 200 times
while (c < 200) {
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
GyroX = Wire.read() << 8 | Wire.read();
GyroY = Wire.read() << 8 | Wire.read();
GyroZ = Wire.read() << 8 | Wire.read();
// Sum all readings
GyroErrorX = GyroErrorX + (GyroX / 131.0);
GyroErrorY = GyroErrorY + (GyroY / 131.0);
GyroErrorZ = GyroErrorZ + (GyroZ / 131.0);
c++;
}
//Divide the sum by 200 to get the error value
GyroErrorX = GyroErrorX / 200;
GyroErrorY = GyroErrorY / 200;
GyroErrorZ = GyroErrorZ / 200;
// Print the error values on the Serial Monitor
Serial.print("AccErrorX: ");
Serial.println(AccErrorX);
Serial.print("AccErrorY: ");
Serial.println(AccErrorY);
Serial.print("GyroErrorX: ");
Serial.println(GyroErrorX);
Serial.print("GyroErrorY: ");
Serial.println(GyroErrorY);
Serial.print("GyroErrorZ: ");
Serial.println(GyroErrorZ);
}
Code language: Arduino (arduino)
Simplemente imprimimos los valores en el monitor de serie y una vez que los conocemos podemos implementarlos en el código como se mostró anteriormente, tanto para el cálculo de balanceo y cabeceo como para las tres salidas del giroscopio.
Finalmente,>
Seguimiento de orientación MPU6050: visualización 3D
A continuación, para crear el ejemplo de visualización 3D, solo necesitamos aceptar estos datos que el Arduino envía a través del puerto serie en Entorno de desarrollo de procesamiento. Aquí está el código de procesamiento completo:
/*
Arduino and MPU6050 IMU - 3D Visualization Example
by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
size (2560, 1440, P3D);
myPort = new Serial(this, "COM7", 19200); // starts the serial communication
myPort.bufferUntil('n');
}
void draw() {
translate(width/2, height/2, 0);
background(233);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
// Rotate the object
rotateX(radians(-pitch));
rotateZ(radians(roll));
rotateY(radians(yaw));
// 3D 0bject
textSize(30);
fill(0, 76, 153);
box (386, 40, 200); // Draw box
textSize(25);
fill(255, 255, 255);
text("www.HowToMechatronics.com", -183, 10, 101);
//delay(10);
//println("ypr:t" + angleX + "t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) {
// reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
data = myPort.readStringUntil('n');
// if you got any bytes other than the linefeed:
if (data != null) {
data = trim(data);
// split the string at "/"
String items[] = split(data, '/');
if (items.length > 1) {
//--- Roll,Pitch in degrees
roll = float(items[0]);
pitch = float(items[1]);
yaw = float(items[2]);
}
}
}
Code language: Arduino (arduino)
Aquí leemos los datos entrantes del Arduino y los colocamos en las variables apropiadas de balanceo, cabeceo y guiñada. En el bucle principal usamos estos valores para rotar el objeto 3D. En este caso es un cuadro simple con un color determinado y algo de texto.
Si ejecutamos el boceto, podemos ver qué tan bien el sensor MPU6050 sigue la orientación. El objeto 3D sigue la orientación del sensor con bastante precisión y además reacciona muy rápidamente.
Como>
Aquí>Cuaterniones que se utilizan para representar orientaciones y rotaciones de objetos en tres dimensiones. En este ejemplo, en realidad usamos cuaterniones para representar la orientación, lo que tampoco sufre el bloqueo del cardán que ocurre cuando se usa ángulo de euler.
Aún>
El>Biblioteca i2cdevlib de Jeff Rowberg. Esta biblioteca se puede descargar desde GitHub e incluiré un enlace en el artículo del sitio.
Una vez que hayamos instalado la biblioteca, podemos abrir el ejemplo MPU6050_DMP6 desde la biblioteca. Este ejemplo está bien explicado con comentarios para cada línea.
Aquí>
/*
Arduino and MPU6050 IMU - 3D Visualization Example
by Dejan, https://howtomechatronics.com
*/
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String data="";
float roll, pitch,yaw;
void setup() {
size (2560, 1440, P3D);
myPort = new Serial(this, "COM7", 19200); // starts the serial communication
myPort.bufferUntil('n');
}
void draw() {
translate(width/2, height/2, 0);
background(233);
textSize(22);
text("Roll: " + int(roll) + " Pitch: " + int(pitch), -100, 265);
// Rotate the object
rotateX(radians(-pitch));
rotateZ(radians(roll));
rotateY(radians(yaw));
// 3D 0bject
textSize(30);
fill(0, 76, 153);
box (386, 40, 200); // Draw box
textSize(25);
fill(255, 255, 255);
text("www.HowToMechatronics.com", -183, 10, 101);
//delay(10);
//println("ypr:t" + angleX + "t" + angleY); // Print the values to check whether we are getting proper values
}
// Read data from the Serial Port
void serialEvent (Serial myPort) {
// reads the data from the Serial Port up to the character '.' and puts it into the String variable "data".
data = myPort.readStringUntil('n');
// if you got any bytes other than the linefeed:
if (data != null) {
data = trim(data);
// split the string at "/"
String items[] = split(data, '/');
if (items.length > 1) {
//--- Roll,Pitch in degrees
roll = float(items[0]);
pitch = float(items[1]);
yaw = float(items[2]);
}
}
}
Code language: Arduino (arduino)
Entonces aquí usamos la función serialEvent() para obtener los cuaterniones provenientes del Arduino y usarlos en el bucle principal para rotar el objeto 3D. Si ejecutamos el boceto, podemos ver qué tan adecuados son los cuaterniones para rotar objetos en tres dimensiones.
Para no saturar este tutorial, he puesto el segundo ejemplo, el DIY Arduino Gimbal o plataforma autoestabilizadora, en un artículo aparte.
No>
Tutorial de Acelerómetro y Giroscopio con Arduino y MPU6050
En este tutorial aprenderemos cómo utilizar el sensor MPU6050 Acelerómetro y Giroscopio con Arduino. Primero, explicaré cómo funciona el MPU6050 y cómo leer los datos de él, y luego haremos dos ejemplos prácticos. Puedes ver el siguiente video o leer el tutorial escrito a continuación.
Visión General
En el primer ejemplo, utilizando el entorno de desarrollo Processing, haremos una visualización en 3D de la orientación del sensor, y en el segundo ejemplo haremos una plataforma simple de autoestabilización o un Gimbal casero. Basándonos en la orientación del MPU6050 y sus datos fusionados de acelerómetro y giroscopio, controlamos los tres servos que mantienen la plataforma nivelada.
¿Cómo Funciona?
El MPU6050 IMU tiene tanto un acelerómetro de 3 ejes como un giroscopio de 3 ejes integrados en un solo chip. El giroscopio mide la velocidad de rotación o la tasa de cambio de la posición angular a lo largo de los ejes X, Y y Z. Utiliza la tecnología MEMS y el Efecto Coriolis para la medición. Los datos del giroscopio están en grados por segundo, por lo que para obtener la posición angular solo necesitamos integrar la velocidad angular.
Por otro lado, el acelerómetro MPU6050 mide la aceleración de la misma manera que se explicó en un tutorial anterior para el sensor acelerómetro ADXL345. Brevemente, puede medir la aceleración gravitacional a lo largo de los 3 ejes y, utilizando algunas matemáticas trigonométricas, podemos calcular el ángulo en el que está posicionado el sensor.
El MPU6050 IMU también se llama dispositivo de seguimiento de movimiento de seis ejes o dispositivo 6 DoF (seis grados de libertad) debido a sus 6 salidas o los 3 ejes de salida del acelerómetro y los 3 ejes de salida del giroscopio.
¿Cómo conectar el Arduino y el MPU6050?
Podemos ver cómo podemos conectar y leer los datos del sensor MPU6050 utilizando el Arduino. Estamos utilizando el protocolo I2C para la comunicación con el Arduino, por lo que solo necesitamos dos cables para conectarlo, además de los dos cables de alimentación.
Puedes ver los componentes necesarios para este Tutorial de Arduino en los siguientes enlaces:
- MPU6050 IMU …………………………..…. Amazon / Banggood / AliExpress
- Placa Arduino ………………………….….. Amazon / Banggood / AliExpress
- Breadboard y cables de puente ………… Amazon / Banggood / AliExpress
Código Arduino MPU6050
Aquí está el código Arduino para leer los datos del sensor MPU6050. A continuación del código puedes encontrar una descripción detallada del mismo.
[incluir código aquí]
Este código nos permite leer los datos del acelerómetro y el giroscopio del MPU6050 y calcular la orientación del sensor utilizando un filtro complementario.
Para obtener más detalles, puedes ver el tutorial completo y el vídeo en el enlace proporcionado.
Serialización MPU6050 – Visualización en 3D
Para la visualización en 3D, simplemente necesitamos aceptar los datos que Arduino envía a través del puerto serial en el entorno de desarrollo Processing. Aquí está el código de Processing que se utiliza para la visualización en 3D de la orientación del sensor.
[incluir código de Processing aquí]
Este código nos permite visualizar la orientación del sensor en un objeto 3D dentro de Processing, utilizando los datos recibidos del Arduino a través del puerto serial.
Si deseas profundizar en este tema, no dudes en realizar cualquier pregunta relacionada con este tutorial en la sección de comentarios. ¡Espero que encuentres útil esta información!
En este artículo hemos explorado cómo utilizar el acelerómetro y giroscopio MPU6050 con Arduino para el seguimiento de la orientación. Para obtener información detallada sobre cómo implementar diferentes aplicaciones prácticas con este sensor, visita nuestra página web.
¡Muy útil este tutorial! Me encanta lo fácil que lo explican todo. ¡Gracias!
¡Me encanta aprender cosas nuevas con estos tutoriales! Este artículo sobre el acelerómetro y giroscopio con Arduino y MPU6050 es genial, gracias por compartirlo. 🙌🏼
¡Gracias por compartir este tutorial! Me ayudó a entender mejor cómo funciona el acelerómetro y el giroscopio con Arduino y el MPU6050. ¡Genial explicación!
¡Me encantó este tutorial! Muy bien explicado y fácil de seguir. ¡Gracias por compartir! 🙌🏼