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.
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.
- ProgettoCostruisci un Micromouse per labirinto con flood fill
- ProgettoCostruisci un robot autobilanciante con MPU6050 e PID
- ProgettoCostruisci un robot Mecanum che si muove lateralmente
- ProgettoCostruisci un rover GPS autonomo tra punti di passaggio
- PercorsoFondamenti di elettronica robotica: percorso di apprendimento
- PercorsoPianificazione dei percorsi e mappatura: dal flood fill a SLAM
- PercorsoTrazione olonomica: muoviti lateralmente senza girarti
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