Tabla de contenido:

MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p): 5 pasos
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p): 5 pasos

Video: MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p): 5 pasos

Video: MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p): 5 pasos
Video: ¿Cómo PROGRAMAR el MPU6050 con ARDUINO? ▶ ACELERÓMETRO y GIROSCOPIO en un MÓDULO 2024, Mes de julio
Anonim
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p)
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p)
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p)
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p)
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p)
MPU 6050 Gyro, comunicación del acelerómetro con Arduino (Atmega328p)

El MPU6050 IMU tiene 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 la posición angular a lo largo del tiempo, a lo largo de los ejes X, Y y Z.

Las salidas 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 midiendo la aceleración gravitacional a lo largo de los 3 ejes y usando algunas matemáticas de trigonometría podemos calcular el ángulo en el que está posicionado el sensor. Entonces, si fusionamos o combinamos los datos del acelerómetro y el giroscopio, podemos obtener información muy precisa sobre la orientación del sensor.

Giroscopio de 3 ejes El MPU-6050 consta de un giroscopio de 3 ejes que puede detectar la velocidad de rotación a lo largo de los ejes x, y, z con tecnología de sistema microelectromecánico (MEMS). Cuando el sensor se gira a lo largo de cualquier eje, se produce una vibración debido al efecto Coriolis que es detectado por el MEMS. El ADC de 16 bits se utiliza para digitalizar el voltaje para muestrear cada eje. + / - 250, +/- 500, +/- 1000, +/- 2000 son el rango de salida de escala completa. La velocidad angular se mide a lo largo de cada eje en grados por segundo.

Enlace útil: …………….

Placa Arduino:. ……….

MPU6050 IMU ……………

Paso 1: Módulo MPU-6050

Módulo MPU-6050
Módulo MPU-6050

El módulo MPU-6050 tiene 8 pines,

INT: Interrupción del pin de salida digital.

AD0: Pin LSB de dirección esclava I2C. Este es el bit 0 en la dirección esclava de 7 bits del dispositivo. Si está conectado a VCC, se lee como uno lógico y la dirección del esclavo cambia.

XCL: Pin de reloj serial auxiliar. Este pin se utiliza para conectar otro pin SCL de sensores habilitados para interfaz I2C al MPU-6050.

XDA: Pin de datos en serie auxiliar. Este pin se utiliza para conectar otro pin SDA de sensores habilitados para interfaz I2C al MPU-6050.

SCL: Pin de reloj serial. Conecte este pin al pin SCL de los microcontroladores. SDA: pin de datos en serie. Conecte este pin al pin SDA de los microcontroladores.

GND: Pin de tierra. Conecte este pin a la conexión a tierra.

VCC: Pin de la fuente de alimentación. Conecte este pin a una fuente de + 5V DC. El módulo MPU-6050 tiene una dirección esclava (cuando AD0 = 0, es decir, no está conectado a Vcc) como, Dirección de escritura esclava (SLA + W): 0xD0

Dirección de lectura esclava (SLA + R): 0xD1

Paso 2: cálculos

Cálculos
Cálculos

Los datos del sensor de giroscopio y acelerómetro del módulo MPU6050 consisten en datos sin procesar de 16 bits en forma de complemento a 2.

Los datos del sensor de temperatura del módulo MPU6050 constan de datos de 16 bits (no en forma de complemento a 2).

Ahora suponga que hemos seleccionado,

  • - Rango de escala completa del acelerómetro de +/- 2g con factor de escala de sensibilidad de 16, 384 LSB (recuento) / g.
  • - Rango de escala completa del giroscopio de +/- 250 ° / s con factor de escala de sensibilidad de 131 LSB (recuento) / ° / s. luego,

Para obtener los datos brutos del sensor, primero debemos realizar el complemento a 2 en los datos del sensor del acelerómetro y el giroscopio. Después de obtener los datos brutos del sensor, podemos calcular la aceleración y la velocidad angular dividiendo los datos brutos del sensor con su factor de escala de sensibilidad de la siguiente manera:

Valores del acelerómetro en g (fuerza g)

  • Aceleración a lo largo del eje X = (datos brutos del eje X del acelerómetro / 16384) g.
  • Aceleración a lo largo del eje Y = (Datos brutos del eje Y del acelerómetro / 16384) g.
  • Aceleración a lo largo del eje Z = (datos brutos del eje Z del acelerómetro / 16384) g.

Valores del giroscopio en ° / s (grados por segundo)

  • Velocidad angular a lo largo del eje X = (Datos brutos del eje X del giroscopio / 131) ° / s.
  • Velocidad angular a lo largo del eje Y = (Datos brutos del eje Y del giroscopio / 131) ° / s.
  • Velocidad angular a lo largo del eje Z = (Datos brutos del eje Z del giroscopio / 131) ° / s.

Valor de temperatura en ° / c (grados por centígrado)

Temperatura en grados C = ((datos del sensor de temperatura) / 340 + 36.53) ° / c.

Por ejemplo, Supongamos que después del complemento de 2 'obtenemos el valor bruto de los ejes X del acelerómetro = +15454

Entonces Ax = +15454/16384 = 0,94 g.

Más,

Entonces sabemos que estamos corriendo a una sensibilidad de +/- 2G y +/- 250deg / s, pero ¿cómo se corresponden nuestros valores con esas aceleraciones / ángulos?

Ambos son gráficos de línea recta y podemos calcular a partir de ellos que para 1G leeremos 16384 y para 1 grado / seg leeremos 131.07 (aunque el.07 se ignorará debido al binario) estos valores se calcularon simplemente dibujando el gráfico de línea recta con 2G en 32767 y -2G en -32768 y 250 / -250 en los mismos valores.

Entonces, ahora conocemos nuestros valores de sensibilidad (16384 y 131.07), solo necesitamos restar las compensaciones de nuestros valores y luego dividir por la sensibilidad.

Estos funcionarán bien para los valores X e Y, pero como el Z se registró en 1G y no en 0, necesitaremos menos 1G (16384) antes de dividir por nuestra sensibilidad.

Paso 3: Conexiones MPU6050-Atmega328p

Conexiones MPU6050-Atmega328p
Conexiones MPU6050-Atmega328p
Conexiones MPU6050-Atmega328p
Conexiones MPU6050-Atmega328p
Conexiones MPU6050-Atmega328p
Conexiones MPU6050-Atmega328p

Simplemente conecte todo como se indica en el diagrama…

Las conexiones se dan de la siguiente manera: -

MPU6050 Arduino Nano

Pin de salida VCC 5v

Pin de tierra GND

Pin SDA A4 // datos en serie

SCL A5 pin // reloj en serie

Cálculo de cabeceo y balanceo: el balanceo es la rotación alrededor del eje xy el cabeceo es la rotación a lo largo del eje y.

El resultado está en radianes. (convertir a grados multiplicando por 180 y dividiendo por pi)

Paso 4: Códigos y explicaciones

Códigos y explicaciones
Códigos y explicaciones

/*

Tutorial del sensor de giroscopio y acelerómetro MPU6050 y Arduino por Dejan, https://howtomechatronics.com * / #include const int MPU = 0x68; // MPU6050 I2C dirección flotante AccX, AccY, AccZ; flotar GyroX, GyroY, GyroZ; flotar accAngleX, accAngleY, gyroAngleX, gyroAngleY, gyroAngleZ; balanceo flotante, cabeceo, guiñada; flotar AccErrorX, AccErrorY, GyroErrorX, GyroErrorY, GyroErrorZ; float elapsedTime, currentTime, previousTime; int c = 0; configuración vacía () {Serial.begin (19200); Wire.begin (); // Inicializar la comunicación Wire.beginTransmission (MPU); // Iniciar la comunicación con MPU6050 // MPU = 0x68 Wire.write (0x6B); // Habla con el registro 6B Wire.write (0x00); // Hacer reinicio - colocar un 0 en el registro 6B Wire.endTransmission (verdadero); // finalizar la transmisión / * // Configurar la sensibilidad del acelerómetro - Rango de escala completa (predeterminado +/- 2g) Wire.beginTransmission (MPU); Wire.write (0x1C); // Habla con el registro ACCEL_CONFIG (1C hex) Wire.write (0x10); // Establezca los bits de registro como 00010000 (rango de escala completa de +/- 8g) Wire.endTransmission (true); // Configurar la sensibilidad del giróscopo - Rango de escala completa (predeterminado +/- 250deg / s) Wire.beginTransmission (MPU); Wire.write (0x1B); // Habla con el registro GYRO_CONFIG (1B hex) Wire.write (0x10); // Establezca los bits de registro como 00010000 (escala completa de 1000deg / s) Wire.endTransmission (true); retraso (20); * / // Llame a esta función si necesita obtener los valores de error de IMU para su módulo calculate_IMU_error (); retraso (20); } void loop () {// === Leer datos del acelerómetro === // Wire.beginTransmission (MPU); Wire.write (0x3B); // Comience con el registro 0x3B (ACCEL_XOUT_H) Wire.endTransmission (false); Wire.requestFrom (MPU, 6, verdadero); // Leer 6 registros en total, cada valor de eje se almacena en 2 registros // Para un rango de + -2g, necesitamos dividir los valores brutos por 16384, de acuerdo con la hoja de datos AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Valor del eje X AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Valor del eje Y AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Valor del eje Z // Cálculo de balanceo y inclinación a partir de los datos del acelerómetro accAngleX = (atan (AccY / sqrt (pow (AccX, 2) + pow (AccZ, 2))) * 180 / PI) - 0.58; // AccErrorX ~ (0.58) Consulte la función personalizada calculate_IMU_error () para obtener más detalles accAngleY = (atan (-1 * AccX / sqrt (pow (AccY, 2) + pow (AccZ, 2))) * 180 / PI) + 1,58; // AccErrorY ~ (-1.58) // === Leer datos del giroscopio === // previousTime = currentTime; // El tiempo anterior se almacena antes del tiempo real read currentTime = millis (); // Hora actual tiempo real leído elapsedTime = (currentTime - previousTime) / 1000; // Dividir por 1000 para obtener segundos Wire.beginTransmission (MPU); Wire.write (0x43); // Dirección del primer registro de datos del giróscopo 0x43 Wire.endTransmission (false); Wire.requestFrom (MPU, 6, verdadero); // Leer 4 registros en total, cada valor de eje se almacena en 2 registros GyroX = (Wire.read () << 8 | Wire.read ()) / 131.0; // Para un rango de 250 grados / s tenemos que dividir primero el valor bruto por 131.0, de acuerdo con la hoja de datos GyroY = (Wire.read () << 8 | Wire.read ()) / 131.0; GyroZ = (Wire.read () << 8 | Wire.read ()) / 131.0; // Corrija las salidas con los valores de error calculados GyroX = GyroX + 0.56; // GyroErrorX ~ (-0.56) GyroY = GyroY - 2; // GyroErrorY ~ (2) GyroZ = GyroZ + 0.79; // GyroErrorZ ~ (-0.8) // Actualmente los valores brutos están en grados por segundo, grados / s, por lo que necesitamos multiplicar por sendonds (s) para obtener el ángulo en grados gyroAngleX = gyroAngleX + GyroX * elapsedTime; // grados / s * s = grados gyroAngleY = gyroAngleY + GyroY * elapsedTime; guiñada = guiñada + GyroZ * tiempo transcurrido; // Filtro complementario: combina los valores del acelerómetro y del ángulo del giroscopio roll = 0.96 * gyroAngleX + 0.04 * accAngleX; paso = 0.96 * gyroAngleY + 0.04 * accAngleY; // Imprime los valores en el monitor serial Serial.print (roll); Serial.print ("/"); Serial.print (paso); Serial.print ("/"); Serial.println (guiñada); } void calculate_IMU_error () {// Podemos llamar a esta función en la sección de configuración para calcular el error de datos del acelerómetro y del giróscopo. A partir de aquí obtendremos los valores de error utilizados en las ecuaciones anteriores impresas en el Monitor serial. // Tenga en cuenta que debemos colocar la IMU plana para obtener los valores adecuados, de modo que podamos obtener los valores correctos // Leer los valores del acelerómetro 200 veces while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x3B); Wire.endTransmission (falso); Wire.requestFrom (MPU, 6, verdadero); AccX = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccY = (Wire.read () << 8 | Wire.read ()) / 16384.0; AccZ = (Wire.read () << 8 | Wire.read ()) / 16384.0; // Sumar todas las lecturas 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 ++; } // Divida la suma por 200 para obtener el valor de error AccErrorX = AccErrorX / 200; AccErrorY = AccErrorY / 200; c = 0; // Leer valores de giroscopio 200 veces while (c <200) {Wire.beginTransmission (MPU); Wire.write (0x43); Wire.endTransmission (falso); Wire.requestFrom (MPU, 6, verdadero); GyroX = Wire.read () << 8 | Wire.read (); GyroY = Wire.read () << 8 | Wire.read (); GyroZ = Wire.read () << 8 | Wire.read (); // Suma todas las lecturas GyroErrorX = GyroErrorX + (GyroX / 131.0); GyroErrorY = GyroErrorY + (GyroY / 131.0); GyroErrorZ = GyroErrorZ + (GyroZ / 131.0); c ++; } // Divida la suma por 200 para obtener el valor de error GyroErrorX = GyroErrorX / 200; GyroErrorY = GyroErrorY / 200; GyroErrorZ = GyroErrorZ / 200; // Imprime los valores de error en el 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); } ------------------------------------------------- ---------------------------------------------- Resultados: - X = Y = Z = --------------------------------------------- ----------------------------------------------- Nota IMPORTANTE: - ----------------

En la sección de bucle, comenzamos leyendo los datos del acelerómetro. Los datos de cada eje se almacenan en 2 bytes o registros y podemos ver las direcciones de estos registros en la hoja de datos del sensor.

Para leerlos todos, comenzamos con el primer registro, y usando la función requiestFrom () solicitamos leer los 6 registros para los ejes X, Y y Z. Luego leemos los datos de cada registro, y debido a que las salidas son en complemento a dos, las combinamos apropiadamente para obtener los valores correctos.

Paso 5: Comprensión del ángulo de inclinación

Acelerómetro

La gravedad de la Tierra es una aceleración constante donde la fuerza siempre apunta hacia el centro de la Tierra.

Cuando el acelerómetro está paralelo a la gravedad, la aceleración medida será 1G, cuando el acelerómetro es perpendicular a la gravedad, medirá 0G.

El ángulo de inclinación se puede calcular a partir de la aceleración medida utilizando esta ecuación:

θ = sin-1 (Aceleración medida / Aceleración por gravedad)

GyroGyro (también conocido como sensor de velocidad) se utiliza para medir la velocidad angular (ω).

Para obtener el ángulo de inclinación de un robot, necesitamos integrar los datos del giroscopio como se muestra en la siguiente ecuación:

ω = dθ / dt, θ = ∫ ω dt

Fusión del sensor de giroscopio y acelerómetro Después de estudiar las características tanto del giroscopio como del acelerómetro, sabemos que tienen sus propias fortalezas y debilidades. El ángulo de inclinación calculado a partir de los datos del acelerómetro tiene un tiempo de respuesta lento, mientras que el ángulo de inclinación integrado de los datos del giróscopo está sujeto a variaciones durante un período de tiempo. En otras palabras, podemos decir que los datos del acelerómetro son útiles a largo plazo, mientras que los datos del giroscopio son útiles a corto plazo.

Enlace para una mejor comprensión: haga clic aquí

Recomendado: