Componente · Sensore

MPU-6050 IMU

MPU-6050 è un IMU a 6 assi che misura inclinazione, rotazione e accelerazione via I²C: il robot conosce il proprio orientamento per bilanciarsi e girare.

Che cos’è

MPU-6050 è il modo in cui un robot percepisce il proprio movimento. È un’unità di misura inerziale a 6 assi, cioè un giroscopio e un accelerometro su un solo chip, che riporta l’inclinazione del robot, la rapidità con cui ruota e la sua accelerazione. Mentre un sensore ultrasonoro guarda il mondo esterno, un IMU guarda verso l’interno, verso il corpo stesso del robot: è ciò di cui hanno bisogno un robot autobilanciante o un navigatore basato sulla navigazione stimata.

Schema etichettato di una scheda di sviluppo IMU MPU-6050 (scheda GY-521): un PCB viola con il chip MPU-6050 e i componenti passivi al centro, un indicatore degli assi X/Y/Z che mostra le tre direzioni di rilevamento e un connettore a 8 pin (VCC, GND, SCL, SDA, XDA, XCL, AD0, INT) lungo il bordo inferiore.
Un giroscopio e un accelerometro su un solo chip misurano rotazione e inclinazione attorno a tutti e tre gli assi, letti tramite I²C. Scarica SVG

Come funziona

All’interno ci sono due sensori. L’accelerometro misura l’accelerazione lineare sugli assi X, Y e Z; a riposo corrisponde alla gravità, che indica al robot quale direzione è verso il basso, cioè la sua inclinazione. Il giroscopio misura la velocità con cui il robot ruota attorno a ciascun asse. Li leggi entrambi tramite I²C (SCL/SDA).

Nessuno dei due sensori basta da solo: se integri il giroscopio per ottenere un angolo, l’angolo deriva lentamente; se ti fidi dell’accelerometro, diventa rumoroso ogni volta che il robot si muove. La soluzione è la fusione dei sensori, che li combina in modo che l’accelerometro corregga la deriva del giroscopio e il giroscopio smorzi il rumore dell’accelerometro. Questa tecnica è trattata esattamente in rumore, bias e filtraggio dei sensori.

Quando usarlo

Scegli MPU-6050 quando un robot deve conoscere il proprio orientamento o movimento:

  • Robot autobilancianti — l’angolo di inclinazione che il ciclo di controllo combatte per mantenere a zero.
  • Direzione e navigazione stimata — rilevamento delle rotazioni per migliorare l’odometria tra una lettura e l’altra degli encoder.
  • Rilevamento del movimento / gesti — reazione quando il robot viene sollevato, ribaltato o scosso.

Per misurare la distanza dagli oggetti, come muri o ostacoli, usa invece un sensore di misura come HC-SR04 o VL53L0X: un IMU percepisce il robot, non il mondo.

Cablaggio e problemi comuni

  • I²C, 3.3–5 V. La maggior parte delle schede di sviluppo, come la GY-521 viola, ha un regolatore, quindi 5 V vanno bene; il chip nudo funziona soltanto a 3.3 V.
  • Combina gyro e accelerometro: non sterzare in base a una singola lettura grezza. Un unico campione dell’accelerometro durante il movimento non è utilizzabile come angolo di inclinazione.
  • La rotazione attorno all’asse verticale deriva senza un magnetometro; usa MPU-6050 per l’inclinazione avanti/indietro e laterale e per rotazioni a breve termine, non per una direzione assoluta da bussola.
  • Tienilo rigido e montato in piano; un sensore allentato aggiunge vibrazioni che il filtro non può eliminare.

Piedinatura

La scheda di sviluppo viola GY-521 è quella che quasi tutti intendono con «MPU-6050». Ha otto pin, di cui quattro restano normalmente scollegati.

Pin Nome Funzione Uso tipico
1 VCC Alimentazione. Il regolatore della scheda accetta 3.3–5 V; il chip nudo funziona soltanto a 3.3 V 5 V su Uno, 3.3 V su ESP32
2 GND Terra, condivisa con il microcontrollore Collegato
3 SCL Clock I²C A5 su Uno
4 SDA Dati I²C A4 su Uno
5 XDA Dati I²C ausiliari, per un magnetometro che MPU legge per tuo conto Lasciato aperto
6 XCL Clock I²C ausiliario Lasciato aperto
7 AD0 Selezione dell’indirizzo. LOW (predefinito) = 0x68, HIGH = 0x69 Lasciato aperto oppure collegato a HIGH per un secondo sensore
8 INT Uscita di interrupt, attivata per dati pronti, movimento o caduta libera Lasciato aperto finché non vuoi smettere di interrogare il chip

AD0 è il pin che rende possibili due MPU-6050 sullo stesso bus ed è il motivo per cui qui la collisione degli indirizzi ha una soluzione semplice che la maggior parte dei sensori non offre.

Collegamento a un Arduino

MPU-6050 Arduino Uno ESP32 Nota
VCC 5 V 3.3 V Il regolatore integrato gestisce entrambe
GND GND GND Deve essere comune a tutto il resto
SCL A5 GPIO 22 Non aggiungere resistori di pull-up esterni: la scheda ne ha già da 2.2 kΩ
SDA A4 GPIO 21 Idem
AD0 — — Collegalo a VCC soltanto per un secondo sensore

Su un Arduino a 5 V c’è una sfumatura da conoscere. I resistori di pull-up della GY-521 collegano le linee I²C alla sua tensione regolata a 3.3 V, quindi le linee I²C si trovano a riposo a 3.3 V, non a 5 V. Un ATmega328P considera alto un segnale sopra 0.6 × Vcc = 3.0 V, perciò 3.3 V supera la soglia, ma soltanto di 0.3 V. In pratica funziona affidabilmente ed è uno dei motivi per cui un collegamento I²C lungo o rumoroso si comporta male su questa scheda prima che su una a 5 V.

Lettura: i registri che contano

Puoi pilotare questo sensore con una libreria e non vedere mai un registro, ma quattro di essi spiegano quasi tutti i problemi che le persone incontrano.

Registro Indirizzo Perché conta
PWR_MGMT_1 0x6B Il chip si avvia in stato di sospensione. Scrivi 0 qui; ogni lettura sarà zero
WHO_AM_I 0x75 Restituisce 0x68, il modo più rapido per verificare che il cablaggio sia corretto
GYRO_CONFIG 0x1B Portata a fondo scala: ±250, ±500, ±1000, ±2000 °/s
ACCEL_CONFIG 0x1C Portata a fondo scala: ±2, ±4, ±8, ±16 g
ACCEL_XOUT_H 0x3B Inizio di 14 byte: 6 accel, 2 temperatura, 6 gyro; leggili in un’unica sequenza

I due registri di configurazione impostano il fattore di scala con cui dividi i conteggi grezzi, e sbagliarlo è la causa più comune di «i miei angoli sono quattro volte troppo grandi»:

Impostazione della portata LSB del gyro per °/s Impostazione della portata LSB dell’accel per g
±250 °/s (predefinita) 131 ±2 g (predefinita) 16384
±500 °/s 65.5 ±4 g 8192
±1000 °/s 32.8 ±8 g 4096
±2000 °/s 16.4 ±16 g 2048

Scegli la portata più piccola che non vada in saturazione. Un robot bilanciatore supera raramente ±250 °/s e la portata stretta offre quattro volte la risoluzione di ±1000 °/s senza alcun costo.

Codice minimo funzionante

Nessuna libreria: questo è tutto, e vale la pena eseguirlo una volta per capire che cosa fa la libreria al posto tuo.

#include <Wire.h>

const uint8_t MPU = 0x68;          // 0x69 if AD0 is tied high

void setup() {
  Serial.begin(115200);
  Wire.begin();

  Wire.beginTransmission(MPU);
  Wire.write(0x6B);                 // PWR_MGMT_1
  Wire.write(0);                    // wake up — the chip boots asleep
  Wire.endTransmission(true);
}

void loop() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);                 // ACCEL_XOUT_H
  Wire.endTransmission(false);      // repeated start, do not release the bus
  Wire.requestFrom(MPU, (uint8_t)14);

  int16_t ax = Wire.read() << 8 | Wire.read();
  int16_t ay = Wire.read() << 8 | Wire.read();
  int16_t az = Wire.read() << 8 | Wire.read();
  Wire.read(); Wire.read();         // temperature, discarded here
  int16_t gx = Wire.read() << 8 | Wire.read();
  int16_t gy = Wire.read() << 8 | Wire.read();
  int16_t gz = Wire.read() << 8 | Wire.read();

  // Default ranges: +/-2 g and +/-250 deg/s
  float pitch = atan2(ax, sqrt((float)ay * ay + (float)az * az)) * 57.2958f;
  float rateY = gy / 131.0f;        // deg/s

  Serial.print(pitch); Serial.print(' '); Serial.println(rateY);
  delay(20);
}

Due cose che questo codice deliberatamente non fa: non unisce i due sensori e non sottrae il bias. Sono entrambe le prossime.

Calibrazione: le venti righe più importanti

A riposo un giroscopio non legge zero. Legge un piccolo scostamento abbastanza costante e, poiché integri il giroscopio per ottenere un angolo, quello scostamento diventa un errore che cresce continuamente. Un bias di soli 2 °/s non corretto produce 120° di deriva dopo un minuto.

Calcola la media di qualche centinaio di campioni con il sensore completamente fermo, poi sottrai:

long sum = 0;
for (int i = 0; i < 500; i++) { sum += readGyroY(); delay(3); }
const float gyroBias = sum / 500.0f;   // subtract from every later reading

Tre note pratiche che il datasheet non ti darà:

  • Fallo a ogni accensione, non una sola volta. Il bias del giroscopio cambia con la temperatura e un robot che ha funzionato per dieci minuti non è più quello che hai calibrato quando era freddo.
  • «Fermo» significa fermo. Una calibrazione eseguita mentre qualcuno si appoggia al tavolo incorpora quel movimento nel bias in modo permanente.
  • L’accelerometro richiede un riferimento di livello, non uno zero. Deve leggere 1 g sull’asse rivolto verso il basso. Se legge 0.97 g, quello è il tuo errore di scala e si manifesta come un angolo di inclinazione costantemente sbagliato di qualche grado.

Perché un solo sensore non basta mai

I due sensori falliscono in modi esattamente opposti ed è questo che rende così efficace la loro unione.

Accelerometro Giroscopio
Misura Accelerazione lineare: a riposo, gravità Velocità di rotazione
Fornisce l’inclinazione con Trigonometria applicata al vettore di gravità Integrazione della velocità nel tempo
Breve termine Rumoroso: ogni urto e vibrazione è anch’essa accelerazione Eccellente, fluido, reattivo
Lungo termine Corretto in media: la gravità non deriva Deriva senza limite man mano che il bias si integra
Fallisce quando Il robot accelera, quindi «giù» non è più verso il basso Sempre, lentamente

Un filtro complementare prende la parte buona di ciascuno: si fida del giroscopio nel breve termine e lascia che l’accelerometro riporti lentamente la stima verso la verità:

angle = 0.98f * (angle + rate * dt) + 0.02f * accelAngle;

Il valore 0.98 determina il passaggio. Un valore maggiore si fida del giroscopio più a lungo, producendo un risultato più fluido ma con maggiore deriva; uno minore rende la stima più sensibile al rumore dell’accelerometro. Il tutorial sul filtro complementare spiega come sceglierlo deliberatamente anziché a istinto.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
Ogni lettura è esattamente 0 Il chip è ancora in sospensione Scrivi 0 in PWR_MGMT_1 (0x6B) dopo Wire.begin()
Lo scanner del bus non trova nulla Indirizzo a 8 bit riportato nel datasheet 0xD0 del datasheet è 0x68 spostato a sinistra: usa 0x68
Ci sono due sensori, ma ne compare uno solo Entrambi usano l’indirizzo predefinito Collega AD0 di una scheda a VCC, così risponde su 0x69
Gli angoli sono 4× o 8× troppo grandi Il fattore di scala non corrisponde alla portata configurata Abbina il divisore a GYRO_CONFIG/ACCEL_CONFIG
L’angolo deriva costantemente anche a riposo Bias del giroscopio non calibrato Calcola la media di 500 campioni fermi all’avvio e sottrai
L’inclinazione salta durante la marcia Stai usando l’angolo grezzo dell’accelerometro Uniscilo al giroscopio; per un robot in movimento «giù» non è verso il basso
Le letture si bloccano dopo un po’ Bus I²C bloccato Controlla i pull-up; aggiungi una routine di ripristino che generi nove clock su SCL
La direzione ruota lentamente all’infinito La rotazione attorno all’asse verticale non ha un riferimento assoluto Previsto: richiede un magnetometro o un’altra fonte assoluta
Rumoroso sopra circa 1 kHz di vibrazione Montaggio rigido che trasmette le vibrazioni dei motori Monta il sensore su supporti morbidi; abilita il DLPF integrato tramite CONFIG (0x1A)

MPU-6050 o qualcosa di più recente?

MPU-6050 non è più prodotto dal produttore, ma resta l’IMU più diffuso nella robotica hobbistica perché è economico, documentato ovunque e supportato da ogni libreria.

Componente Assi Differenza importante Sceglilo quando
MPU-6050 6 La scelta standard; enorme quantità di codice di esempio Per imparare, bilanciare, per il primo progetto con un IMU
MPU-9250 9 Aggiunge un magnetometro, quindi la rotazione attorno all’asse verticale ha un riferimento assoluto Ti serve una direzione da bussola, non soltanto la velocità di rotazione
ICM-20948 9 Il successore attuale del MPU-9250 Nuovi progetti che richiedono 9 assi e disponibilità a lungo termine
BNO055 9 Esegue la fusione sul chip e riporta direttamente l’orientamento Vuoi un angolo senza scrivere un filtro, al prezzo di diverse volte tanto
LSM6DS3 6 Moderno, in produzione, meno rumoroso Sostituto immediato quando finisce la disponibilità di MPU-6050

Per riassumere con onestà: se il tuo robot ha bisogno di inclinazione avanti/indietro e laterale, ciò che serve al bilanciamento, MPU-6050 è più che sufficiente e scrivere la fusione è un’ottima cosa da fare. Se serve la direzione assoluta, nessun filtraggio la ricaverà da sei assi: serve un magnetometro.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono MPU-6050 IMU.

Domande

FAQ su MPU-6050 IMU

Che cos'è il sensore MPU-6050?

MPU-6050 è un'unità di misura inerziale (IMU) a 6 assi su una piccola scheda di sviluppo. Combina un giroscopio a 3 assi e un accelerometro a 3 assi, così un robot può percepire la propria inclinazione, la rapidità di rotazione e l'accelerazione, tutte lette tramite il bus I²C.

Come funziona MPU-6050?

All'interno ci sono due sensori. L'accelerometro misura l'accelerazione lineare, che a riposo corrisponde soltanto alla gravità e indica al robot quale direzione è verso il basso, cioè la sua inclinazione. Il giroscopio misura la velocità di rotazione attorno a ciascun asse. Li leggi entrambi tramite I²C, poi li unisci per ottenere un orientamento stabile che nessuno dei due fornisce da solo.

A cosa serve MPU-6050?

A rilevare il movimento del robot: mantenere in piedi un robot autobilanciante, stimare la direzione e migliorare l'odometria tra una lettura e l'altra degli encoder e rilevare che il robot è stato ribaltato, sollevato o scosso. Percepisce il robot stesso, non il mondo circostante, quindi completa un sensore di misura anziché sostituirlo.

Come calibri un MPU-6050?

A riposo il giroscopio e l'accelerometro leggono piccoli scostamenti diversi da zero. Calibra calcolando la media di qualche centinaio di campioni mentre il sensore è perfettamente fermo, poi sottrai questi scostamenti da ogni lettura. Soprattutto il giroscopio ne ha bisogno: il bias non calibrato è ciò che fa derivare più rapidamente l'angolo stimato.

Come colleghi MPU-6050 a un ESP32 o Arduino?

Tramite I²C: collega SDA e SCL ai pin I²C della scheda di sviluppo, oltre ad alimentazione e terra. La scheda di sviluppo viola GY-521 ha un regolatore, quindi funziona a 3.3 V su ESP32 oppure a 5 V su Arduino Uno. Una libreria si occupa poi di leggere i registri del giroscopio e dell'accelerometro.

Per approfondire

Fonti