Progetto #77 • Sensori e movimento

MPU6050 con Arduino: leggere accelerazione su X, Y e Z

Impariamo a collegare il sensore MPU6050 ad Arduino e a leggere nel monitor seriale i valori dell’accelerometro sui tre assi.

Difficoltà ★★☆☆☆ Facile
Tempo 25–35 minuti
Concetti I2C • Accelerometro • Assi XYZ

🧭 Introduzione

In questo progetto utilizzeremo il modulo MPU6050, un sensore molto diffuso nei progetti Arduino dedicati al rilevamento del movimento e dell’orientamento.

L’MPU6050 integra al suo interno:

📐 Accelerometro a 3 assi
Misura l’accelerazione lungo gli assi X, Y e Z.
🔄 Giroscopio a 3 assi
Misura la velocità di rotazione attorno agli assi X, Y e Z.

Nel nostro primo esempio utilizzeremo soltanto la parte accelerometro e visualizzeremo i valori grezzi nel monitor seriale.

Concetto chiave: l’accelerometro non misura direttamente un angolo, ma l’accelerazione lungo ciascun asse. Quando il sensore è fermo, anche la gravità terrestre contribuisce alla misura.

🎯 Cosa imparerai

  • come collegare un MPU6050 ad Arduino;
  • come funziona la comunicazione I2C;
  • come inizializzare il sensore;
  • come leggere gli assi X, Y e Z;
  • come visualizzare i valori nel monitor seriale;
  • come riconoscere variazioni dovute a movimento e inclinazione;
  • come verificare che il sensore comunichi correttamente con Arduino.

🧰 Materiale necessario

1× Arduino UNO o compatibile
1× modulo MPU6050
1× breadboard
Cavi jumper

🛒 Non hai ancora i componenti?

Un kit Arduino per principianti contiene molti dei componenti utili per realizzare questo e numerosi altri progetti.

Kit Arduino consigliato → Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

📘 Vuoi imparare Arduino passo dopo passo?

Scopri i miei libri → Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

🔌 Schema di collegamento

Il modulo MPU6050 comunica con Arduino tramite protocollo I2C.

MPU6050 Arduino UNO
VCC 5V
GND GND
SDA A4
SCL A5
Schema collegamento MPU6050 con Arduino UNO
Nota: sui moduli breakout MPU6050 più comuni è normalmente presente un circuito di regolazione dell’alimentazione. Se utilizzi una scheda diversa, verifica sempre la tensione ammessa dal modulo specifico.

🔗 Come funziona I2C

La comunicazione I2C utilizza soltanto due linee principali.

SDA
Trasporta i dati tra Arduino e il sensore.
SCL
Trasporta il segnale di clock che sincronizza la comunicazione.

Su Arduino UNO:

  • SDA → A4
  • SCL → A5

Il vantaggio di I2C è che più dispositivi possono condividere le stesse linee SDA e SCL utilizzando indirizzi differenti.

📚 Librerie necessarie

Il progetto utilizza:

  • Wire
  • MPU6050

La libreria Wire è già inclusa nell’IDE Arduino.

Per la libreria MPU6050 apri:

Sketch
→ Include Library
→ Manage Libraries

e installa una libreria compatibile con l’MPU6050.

Il nome e le funzioni disponibili possono variare tra le diverse librerie MPU6050. Il codice seguente utilizza l’interfaccia con initialize() e getAcceleration().

💻 Codice Arduino completo

Progetto #77 — MPU6050 con Arduino
// ============================================
// Progetto #77
// Accelerometro MPU6050 con Arduino
//
// Legge i valori grezzi di accelerazione
// sugli assi X, Y e Z
// ============================================

#include <Wire.h>
#include <MPU6050.h>

MPU6050 mpu;

void setup() {

  Serial.begin(9600);

  // Avvia la comunicazione I2C
  Wire.begin();

  // Inizializza il sensore MPU6050
  mpu.initialize();

  Serial.println("MPU6050 inizializzato");

  // Verifica la comunicazione con il sensore
  if (mpu.testConnection()) {

    Serial.println("Connessione MPU6050 OK");

  } else {

    Serial.println("Errore connessione MPU6050");

  }
}

void loop() {

  int16_t ax;
  int16_t ay;
  int16_t az;

  // Legge l'accelerazione sui tre assi
  mpu.getAcceleration(&ax, &ay, &az);

  Serial.print("X: ");
  Serial.print(ax);

  Serial.print(" | Y: ");
  Serial.print(ay);

  Serial.print(" | Z: ");
  Serial.println(az);

  delay(500);
}

⚙️ Come funziona il programma

Per prima cosa viene inizializzata la comunicazione I2C:

Wire.begin();

Poi inizializziamo il sensore:

mpu.initialize();

La funzione:

mpu.testConnection()

permette di controllare se Arduino riesce a comunicare con il sensore.

Infine:

mpu.getAcceleration(&ax, &ay, &az);

legge contemporaneamente i valori di accelerazione sui tre assi.

📐 Cosa rappresentano X, Y e Z

L’MPU6050 misura l’accelerazione lungo tre direzioni perpendicolari tra loro.

Asse X
Accelerazione lungo l’asse X del sensore.
Asse Y
Accelerazione lungo l’asse Y del sensore.
Asse Z
Accelerazione lungo l’asse Z del sensore.
Gravità
Anche quando il sensore è fermo, un asse rileva l’accelerazione gravitazionale.
Importante: i valori X, Y e Z dipendono dall’orientamento fisico del modulo. Non corrispondono automaticamente a “destra”, “avanti” o “alto”: dipende da come il sensore viene montato.

🔢 Perché i valori non sono espressi direttamente in g?

La funzione getAcceleration() restituisce valori grezzi provenienti dal convertitore interno dell’MPU6050.

Questi numeri devono essere convertiti se vogliamo ottenere valori fisici come:

  • g
  • m/s²

Con il fondo scala standard di ±2 g, il valore corrispondente a circa 1 g è tipicamente vicino a:

16384

Per esempio:

float ax_g = ax / 16384.0;

permette di ottenere l’accelerazione dell’asse X espressa approssimativamente in g.

🌍 Cosa succede quando il sensore è fermo

Un accelerometro non misura solamente i movimenti.

Quando il sensore è fermo sulla scrivania, rileva comunque l’effetto della gravità terrestre.

Per questo motivo potresti osservare qualcosa simile a:

X: 150
Y: -260
Z: 16420

Se il modulo è appoggiato in piano, generalmente l’asse orientato verticalmente registra un valore vicino a 1 g, mentre gli altri due restano vicini allo zero.

📊 Monitor seriale

Apri il monitor seriale dell’IDE Arduino e imposta:

9600 baud

Vedrai dati simili a:

X: 124 | Y: -318 | Z: 16390
X: 131 | Y: -325 | Z: 16375
X: 1940 | Y: -840 | Z: 15810

Muovendo o inclinando il sensore noterai immediatamente cambiare i valori.

🌀 E il giroscopio?

L’MPU6050 non contiene soltanto un accelerometro.

Integra anche un giroscopio a tre assi, che permette di misurare la velocità di rotazione.

Accelerometro
Misura accelerazioni lineari e gravità.
Giroscopio
Misura la velocità di rotazione.

Combinando i dati dei due sensori è possibile stimare in modo molto più efficace l’orientamento del dispositivo.

⚠️ Problemi comuni

MPU6050 non rilevato
Controlla SDA, SCL, VCC e GND.
Valori sempre uguali
Verifica che il sensore sia inizializzato correttamente.
Valori diversi da zero a riposo
È normale: intervengono gravità, offset e rumore.
Valori molto instabili
Può essere necessario effettuare una calibrazione.
Errore di compilazione
Controlla di aver installato la stessa libreria utilizzata dal codice.
Assi apparentemente invertiti
Dipende dall’orientamento fisico del modulo.

🎯 Calibrazione del sensore

Ogni MPU6050 presenta piccoli errori e offset.

Per applicazioni più precise è quindi utile effettuare una calibrazione.

La calibrazione permette di compensare:

  • offset dell’accelerometro;
  • offset del giroscopio;
  • piccole differenze tra un sensore e l’altro.
Per questo primo progetto non è indispensabile: lo scopo è imparare a comunicare con il modulo e osservare come cambiano i valori sui tre assi.

🔄 Varianti possibili

📐 Livella digitale
Calcola l’inclinazione del sensore.
🤖 Controllo robot
Muove un servo in base all’inclinazione.
🎮 Controller gestuale
Usa il movimento come comando.
💥 Rilevatore urti
Rileva accelerazioni improvvise.
📟 Display OLED
Visualizza i valori senza computer.
📡 ESP32
Invia i dati del movimento tramite Wi-Fi.

🚀 Progetto successivo: calcolare l’inclinazione

Ora che sappiamo leggere X, Y e Z, possiamo utilizzare questi valori per calcolare l’orientamento del sensore.

Per esempio possiamo ricavare:

  • roll;
  • pitch;
  • variazioni di inclinazione;
  • movimenti improvvisi.
L’MPU6050 diventa molto più interessante quando accelerometro e giroscopio vengono combinati tramite algoritmi come il filtro complementare.

🧠 Cosa impari con questo progetto

  • cos’è un accelerometro;
  • cos’è un giroscopio;
  • come funziona il protocollo I2C;
  • come collegare SDA e SCL;
  • come inizializzare un MPU6050;
  • come leggere X, Y e Z;
  • come interpretare i dati grezzi;
  • perché la gravità influenza le misure;
  • perché può essere necessaria una calibrazione.

✅ Cosa devi ricordare

  • l’MPU6050 contiene accelerometro e giroscopio;
  • utilizza la comunicazione I2C;
  • su Arduino UNO SDA = A4;
  • su Arduino UNO SCL = A5;
  • Wire.begin() avvia I2C;
  • mpu.initialize() inizializza il sensore;
  • getAcceleration() legge X, Y e Z;
  • i valori restituiti sono inizialmente grezzi;
  • la gravità viene rilevata anche quando il modulo è fermo;
  • l’orientamento fisico del modulo determina il significato pratico degli assi.