Com utilitzar el sensor IMU MPU9250 amb Arduino

  • El MPU9250 combina acceleròmetre, giroscopi i magnetòmetre en un sol mòdul.
  • Es comunica fàcilment amb Arduino usant el protocol I2C per obtenir lectures precises.
  • El calibratge del magnetòmetre és crucial per eliminar errors magnètics i millorar la precisió.
  • Filtres com el filtre complementari permeten millorar la precisió i eliminar el drift.

mpu9250

El món dels sensors inercials ha evolucionat ràpidament, i dispositius com el MPU9250, que combina acceleròmetre, giroscopi i magnetòmetre en un sol mòdul, han esdevingut una peça clau per a projectes de robòtica, drones i sistemes que requereixen capturar amb precisió petits i grans moviments. En aquest article, explorarem com utilitzar aquest sensor amb Arduino, quines són les seves característiques més destacades, així com alguns exemples de codi per començar a treballar-hi.

Utilitzar el MPU9250 no sols és útil per a aficionats, sinó també per a professionals que necessiten mesurar amb precisió l'orientació i el moviment. Aquesta solució permet desenvolupar sistemes d'estabilització, vehicles autònoms i robots que requereixen conèixer els seus moviments als diferents eixos. La versatilitat del sensor, juntament amb la precisió i el baix cost, li ha atorgat una sòlida reputació entre els desenvolupadors.

Què és el MPU9250?

El MPU9250 és un mòdul que inclou acceleròmetre, giroscopi i magnetòmetre en un sol dispositiu. Amb aquesta combinació, el sensor és capaç de mesurar tant l'acceleració lineal com la velocitat angular, i el camp magnètic del seu entorn. Aquest sensor d'Invensense és de 9 graus de llibertat, cosa que significa que pot mesurar en tres eixos diferents, tant l'acceleració, la rotació (giroscopi) com el camp magnètic (magnetòmetre), donant així la possibilitat de calcular l'orientació completa del dispositiu .

El mòdul està dissenyat per comunicar-se mitjançant SPI o I2C, la qual cosa permet connectar-ho fàcilment a plataformes de codi obert com Arduino o Raspberry Pi. A més, gràcies al Processador Digital de Moviment (DMP), és capaç de realitzar complexos càlculs per fusionar les dades obtingudes pels tres sensors i proporcionar mesures més precises.

Característiques principals del MPU9250

El MPU9250 sobresurt per tenir una gran quantitat de característiques que el converteixen en un mòdul molt interessant per a projectes que requereixen capturar moviments precisos, entre les quals es troben:

  • acceleròmetre: Rang d'acceleració ajustable entre ±2g, ±4g, ±8g i ±16g.
  • giroscopi: Rang programable de ±250°/s, ±500°/s, ±1000°/s, ±2000°/s.
  • magnetòmetre: Sensibilitat de 0.6µT/LSB i rang programable fins a 4800µT.
  • Consum energètic: Molt baix, ideal per a dispositius portàtils o que requereixin operació durant llargs períodes (3.5 mA en mode actiu).

Connectant el mòdul MPU9250 amb Arduino

mpu9250 arduí

Connectar el mòdul al teu Arduino és un procediment senzill gràcies al fet que treballa mitjançant el protocol I2C. El esquema típic de connexió entre un MPU9250 i un Arduino Uno és:

  • VCC: Connecta'l a 3.3V.
  • GND: A terra (GND).
  • SDA: Connecta'l al pin A4 de l'Arduino.
  • SCL: Connecta'l al pin A5 de l'Arduino.

Cal assegurar-se que l'alimentació sigui correcta perquè el sensor pugui funcionar de manera adequada. La majoria dels mòduls ja compten amb un regulador de voltatge per poder utilitzar els 5V de l'Arduino sense fer-lo malbé.

Exemples de codi per al MPU9250

A continuació, us mostrem com podeu començar a programar el MPU9250 a Arduino, llegint les dades de l'acceleròmetre, giroscopi i magnetòmetre. La biblioteca MPU9250.h és molt útil per facilitar la programació, i al nostre exemple detallem com fer la lectura de dades crues:

#include <Wire.h>
#include <MPU9250.h>
MPU9250 imu(Wire, 0x68);

void setup() {
    Wire.begin();
    Serial.begin(115200);
    if (imu.begin() != 0) {
        Serial.println("Error al iniciar MPU9250");
    } else {
        Serial.println("MPU9250 iniciado");
    }
}

void loop() {
    imu.readSensor();
    Serial.print("Aceleracion: ");
    Serial.print(imu.getAccelX_mss());
    Serial.print(", ");
    Serial.print(imu.getAccelY_mss());
    Serial.print(", ");
    Serial.print(imu.getAccelZ_mss());
    Serial.println();
    delay(1000);
}

Aquest codi llegeix tres components de l'acceleració. Les lectures de giroscopi i magnetòmetre es poden fer de manera similar utilitzant els mètodes getGyroX_rads() y getMagX_uT() respectivament.

aplicacions pràctiques

Hi ha múltiples aplicacions on el MPU9250 es converteix en una eina indispensable. Explorem algunes de les més importants:

  • Drons i robòtica: Un dels usos més comuns del MPU9250 és en sistemes d'estabilització de vol i robòtica, on és fonamental obtenir l'orientació en temps real.
  • Realitat virtual: En capturar amb precisió l'orientació i el moviment, el sensor es pot utilitzar per al seguiment en aplicacions de videojocs o simuladors de realitat virtual.
  • Sistemes de navegació: En combinació amb altres sensors, com el GPS, el MPU9250 s'utilitza en navegació inercial per conèixer els moviments i detectar l'orientació.

Calibratge del magnetòmetre

Un dels passos més importants en fer servir el MPU9250 és la calibratge del magnetòmetre. El magnetòmetre és indispensable per eliminar errors generats per l'entorn magnètic (com el metratge d'edificis o la interferència d'altres equips electrònics), per la qual cosa fer un calibratge adequat és crucial per obtenir mesures precises.

Per calibrar correctament el magnetòmetre, podem fer servir la llibreria RTIMULib-Arduino. A continuació, us mostrem un programa simple de calibratge:

#include <RTIMULib.h>
RTIMU *imu;
RTIMUSettings settings;

void setup() {
    Wire.begin();
    Serial.begin(115200);
    imu = RTIMU::createIMU(&settings);
    imu->IMUInit();
    imu->setCalibrationMode(true);
}

void loop() {
    if (imu->IMURead()) {
        RTVector3 mag = imu->getCompass();
        Serial.print("Magnetómetro: ");
        Serial.print(mag.x());
        Serial.print(", ");
        Serial.print(mag.y());
        Serial.print(", ");
        Serial.print(mag.z());
        Serial.println();
    }
}

El codi anterior llegeix les dades del magnetòmetre perquè puguis fer moviments als eixos i cobrir el rang complet de possibles lectures. Això ajuda a identificar les distorsions del camp magnètic i millorar els càlculs dorientació.

Filtres per millorar la precisió

Per millorar la precisió de les lectures del MPU9250, un dels enfocaments més comuns és la implementació de filtres que combinin les dades obtingudes del giroscopi, acceleròmetre i magnetòmetre.

El filtre complementari és una solució eficaç i senzilla dimplementar. Aquest filtre confia en el giroscopi per obtenir resultats ràpids, mentre que l'acceleròmetre i el magnetòmetre corregeixen les desviacions a llarg termini del giroscopi (conegut com a drift). Un codi simple que implementa aquest filtre es pot veure en el següent exemple:

#include <ComplementaryFilter.h>
ComplementaryFilter cf;

void setup() {
    cf.setAccelerometerGain(0.02);
    cf.setMagnetometerGain(0.98);
}

void loop() {
    // Integrar lecturas de acelerómetro y giroscopio
    cf.update(sensorData.accelX, sensorData.gyroX);
    float pitch = cf.getPitch();
    float roll = cf.getRoll();
    Serial.print("Pitch: ");
    Serial.print(pitch);
    Serial.print(" Roll: ");
    Serial.println(roll);
}

Aquest filtre és essencial per eliminar el drift del giroscopi i permet generar una orientació més estable. A més, és molt més ràpid dexecutar en microcontroladors com lArduino que altres mètodes més complexos com el filtre Kalman, que consumeix més recursos.

El MPU9250 és una solució increïblement versàtil per a una gran varietat de projectes que requereixen mesurar lorientació i el moviment amb precisió. Connectar-lo a un Arduino i obtenir lectures bàsiques és relativament senzill, i amb la implementació d'alguns filtres, es poden obtenir resultats molt precisos i útils per a una àmplia gamma d'aplicacions.