Código de búsqueda

Código del acelerómetro, giroscopio y magnetómetro MPU-9250

Código del acelerómetro, giroscopio y magnetómetro MPU-9250

En este tutorial, exploraremos cómo utilizar el sensor MPU-9250, que combina un acelerómetro, giroscopio y magnetómetro en un módulo compacto. Al final de esta guía, podrás leer datos del sensor e interpretar su significado en tus proyectos. Este sensor es particularmente útil para aplicaciones como la robótica y los drones, donde la orientación y el seguimiento del movimiento son críticos. Puedes consultar el video para obtener aclaraciones adicionales sobre la configuración y el código (en el video a las 00:20).

ELE_MPU6050_208
ELE_MPU6050_208

Hardware Explicado

El módulo MPU-9250 integra tres sensores: un acelerómetro, un giroscopio y un magnetómetro. El acelerómetro mide las fuerzas de aceleración, lo que te permite determinar la velocidad y la orientación. El giroscopio proporciona velocidad angular, ayudándote a entender el cambio de orientación en el tiempo. Por último, el magnetómetro actúa como una brújula, proporcionando datos del campo magnético que ayudan en la navegación.

Esta combinación de sensores es particularmente beneficiosa en aplicaciones donde se requiere un seguimiento de movimiento preciso, como en drones o teléfonos inteligentes. El MPU-9250 se comunica a través de I2C o SPI, lo que lo hace versátil para diferentes configuraciones de microcontroladores.

Detalles de la hoja de datos

Fabricante InvenSense
Número de parte MPU-9250
Voltaje lógico/IO 1.8 V (E/S), 3.3 V (suministro)
Tensión de alimentación 2.4 - 3.6 V
Corriente de salida (por canal) 3.2 mA (operación normal)
Corriente de pico (por canal) 19.8 mA (máx)
Orientación sobre la frecuencia PWM N/A
Umbrales de lógica de entrada 0.3 * VDD(bajo), 0.7 * VDDalto
Caída de tensión / RDS(on)saturación N/A
Límites térmicos -40 a 85 °C
Paquete QFN
Notas / variantes Incluye regulador de voltaje interno
  • Asegure un suministro de voltaje adecuado (2.4 - 3.6 V) para evitar dañar el módulo.
  • Utiliza una resistencia de pull-up para las líneas SDA y SCL si no está ya incluida en tu placa de expansión.
  • Verifique la dirección I2C (el valor predeterminado es 0x68) y ajuste el pin ADO de acuerdo con las direcciones alternativas.
  • Verifique las conexiones para asegurar la estabilidad y prevenir lecturas erróneas.
  • Calibre los sensores regularmente para obtener mediciones precisas.

Instrucciones de cableado

Cableado de Arduino para MPU6050 utilizando A4 y A4 para SDA y SCL
Cableado de Arduino para MPU6050 usando A4 y A5 para SDA y SCL.
Arduino Wiring for MPU-6050
Arduino Wiring for MPU-6050
Arduino wiring for  MPU6050 using A4 and A4 for SDA and SCL
Arduino wiring for MPU6050 using A4 and A4 for SDA and SCL

Para conectar el MPU-9250 a tu Arduino, comienza conectando el pin VCC del MPU-9250 al pin de 5V del Arduino. El módulo tiene un regulador interno, así que es seguro alimentarlo con 5V. Luego, conecta el pin GND a la tierra (GND) del Arduino. Para la comunicación de datos, conecta el pin SDA al pin A4 del Arduino y el pin SCL al pin A5. Esta configuración es estándar para muchas placas de Arduino.

Si estás utilizando un Arduino Mega, los pines SDA y SCL se encuentran en los pines 20 y 21, respectivamente. Asegúrate de que las conexiones estén seguras para evitar errores de comunicación. Si necesitas cambiar la dirección I2C del MPU-9250, conecta el pin ADO a 5V para establecerlo en 0x69. Desconectarlo revertirá su configuración a 0x68.

Esquema de Arduino para MPU6050 usando A4 y A4 para SDA y SCL
Esquema de Arduino para MPU6050 usando A4 y A5 para SDA y SCL

Ejemplos de código y guía paso a paso

En el sketch de Arduino, comenzamos incluyendo la biblioteca MPU9250 y creando una instancia del sensor:

#include "MPU9250.h"
MPU9250 IMU(Wire,0x68);

El código inicializa el sensor y comienza la comunicación en elsetup()función:

void setup() {
  Serial.begin(115200);
  status = IMU.begin();
  if (status < 0) {
    Serial.println("IMU initialization unsuccessful");
    while(1) {}
  }
}

Dentro delloop()función, estamos leyendo y imprimiendo continuamente los datos del sensor:

void loop() {
  IMU.readSensor();
  Serial.print("AccelX: ");
  Serial.print(IMU.getAccelX_mss(),6);
  // More print statements for other axes
}

Esta sección lee los valores del acelerómetro, giroscopio y magnetómetro, mostrándolos en el Monitor Serie. Asegúrate de revisar el código completo cargado debajo del artículo para la implementación completa.

Demostración / Qué Esperar

Cuando ejecutas el código, deberías ver los valores del sensor actualizándose en tiempo real en el Monitor Serial. Los valores del acelerómetro fluctuarán mientras mueves el sensor, mientras que los valores del giroscopio mostrarán la tasa de rotación. El magnetómetro te dará la intensidad del campo magnético en tres ejes, lo que se puede usar para determinar la orientación. Ten cuidado con las entradas flotantes, ya que pueden llevar a lecturas inexactas (en el video a las 12:30).

Capítulos

  • Introducción (00:00)
  • Hardware Explicado (01:30)
  • Instrucciones de cableado (04:00)
  • Ejemplos de Código y Guía (06:00)
  • Demostración (10:00)

Imágenes

ELE_MPU6050_208
ELE_MPU6050_208
Arduino Wiring for MPU-6050
Arduino Wiring for MPU-6050
Arduino Schematic for  MPU6050 using A4 and A4 for SDA and SCL
Arduino Schematic for MPU6050 using A4 and A4 for SDA and SCL
Arduino wiring for  MPU6050 using A4 and A4 for SDA and SCL
Arduino wiring for MPU6050 using A4 and A4 for SDA and SCL
126-Arduino code for an MPU-9250 accelerometer, gyroscope, and magnetometer
Idioma: C++
/*
 * Library: https://github.com/bolderflight/MPU9250
Basic_I2C.ino
Brian R Taylor
brian.taylor@bolderflight.com

Copyright (c) 2017 Bolder Flight Systems

Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
and associated documentation files (the "Software"), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, publish, distribute, 
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or 
substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
 * Updated by Ahmad Shamshiri on July 9, 2018 for Robojax.com
 * in Ajax, Ontario, Canada
 * Watch instruction video for this code: 
For this sketch you need to connect:
VCC to 5V and GND to GND of Arduino
SDA to A4 and SCL to A5

S20A is 3.3V voltage regulator MIC5205-3.3BM5
*/

#include "MPU9250.h"

// An MPU9250 object with the MPU-9250 sensor on I2C bus 0 with address 0x68
MPU9250 IMU(Wire,0x68);
int status;

void setup() {
  // Serial to display data
  Serial.begin(115200);
  while(!Serial) {}

  // Start communication with IMU 
  status = IMU.begin();
  if (status < 0) {
    Serial.println("IMU initialization unsuccessful");
    Serial.println("Check IMU wiring or try cycling power");
    Serial.print("Status: ");
    Serial.println(status);
    while(1) {}
  }
}

void loop() {
  // Read the sensor
  IMU.readSensor();
  // Display the data
  Serial.print("AccelX: ");
  Serial.print(IMU.getAccelX_mss(),6);
  Serial.print("\t");
  Serial.print("AccelY: ");  
  Serial.print(IMU.getAccelY_mss(),6);
  Serial.print("\t");
  Serial.print("AccelZ: ");  
  Serial.println(IMU.getAccelZ_mss(),6);
  
  Serial.print("GyroX: ");
  Serial.print(IMU.getGyroX_rads(),6);
  Serial.print("\t");
  Serial.print("GyroY: ");  
  Serial.print(IMU.getGyroY_rads(),6);
  Serial.print("\t");
  Serial.print("GyroZ: ");  
  Serial.println(IMU.getGyroZ_rads(),6);

  Serial.print("MagX: ");  
  Serial.print(IMU.getMagX_uT(),6);
  Serial.print("\t");  
  Serial.print("MagY: ");
  Serial.print(IMU.getMagY_uT(),6);
  Serial.print("\t");
  Serial.print("MagZ: ");  
  Serial.println(IMU.getMagZ_uT(),6);
  
  Serial.print("Temperature in C: ");
  Serial.println(IMU.getTemperature_C(),6);
  Serial.println();
  delay(200);
}

Recursos y referencias

Archivos📁

No hay archivos disponibles.