Consegna veloce
Condizioni di sconto per le aziende
Fino al 10% di sconto per alunni, studenti e istituti scolastici
Spedizione in tutta Europa a 4,90 €
Chiudi il filtro
Filtra per:

Il modulo MPU-6050: Giroscopio e accelerometro

Sono pochi i moduli sul mercato che hanno suscitato un tale clamore negli ultimi mesi come il modulo MPU-6050. La scheda due-in-uno combina due popolari funzioni di sensore: Il modulo può essere utilizzato sia come giroscopio che come sensore di accelerazione.

Come? Il sensore comprende un giroscopio a 3 assi e un accelerometro a 3 assi su uno stesso chip. Ciò significa che può richiamare tutti (!) i valori del sensore allo stesso tempo. Ciò significa che gli hobbisti sono sempre ben informati sulla posizione attuale del sensore. Questa caratteristica è particolarmente interessante per il modellismo, soprattutto per il bilanciamento di telai o droni.
Inoltre, è possibile accedere a magnetometri esterni o ad altri sensori tramite un bus I2C master aggiuntivo, in modo da poter registrare completamente anche i dati di questi sensori. 

I dati dei sensori della MPU-6050 (GY-521) in sintesi:

  • Chipset: MPU-6050 (noto anche come GY-521)
  • Alimentazione: 3,3 - 5V DC
  • Linea di libertà: 6*
  • Interfaccia: I2C
  • Spaziatura tra i pin: 2,54 mm

Ora veniamo alla parte più interessante: la pratica. Per darti una buona panoramica delle funzioni utili del modulo MPU-6050, abbiamo sviluppato per te uno schema di circuito di esempio. Il modulo MPU-6050 viene letto da una Funduino UNO R3 e i dati registrati vengono valutati.

Siamo interessati soprattutto ai dati del sensore del giroscopio. Vogliamo leggere i valori degli assi X, Y e Z e determinare se c'è stato un cambiamento nella posizione del sensore. La variazione di posizione deve essere visualizzata con dei LED colorati.

Schema del circuito MPU-6050 GY-521

Fin qui tutto bene: ma come possiamo implementare tutto questo?

Il codice di programma del modulo MPU-6050

Ora è il momento di passare ai dettagli, o meglio alla metà di essi. Per prima cosa dobbiamo scaricare la libreria appropriata per il modulo MPU6050 e integrarla nel nostro IDE Arduino. La libreria si chiama "<MPU6050_tockn.h>" e può essere trovata e installata direttamente tramite la gestione delle librerie dell'IDE di Arduino.

Dopo questo primo passo, iniziamo con il codice vero e proprio. Per prima cosa, definiamo i collegamenti per i nostri LED, che serviranno come indicatori della posizione dell'asse. Poi definiamo due variabili per la posizione dell'asse di ciascuno dei tre assi. 

Probabilmente ti starai chiedendo perché abbiamo bisogno di due variabili per asse. Poiché vogliamo determinare se la posizione del rispettivo asse è cambiata, dobbiamo prima determinare il valore che il sensore ha registrato per la posizione corrente. Salviamo questo valore del sensore dell'MPU-6050 per un breve periodo di tempo nella prima variabile.
Il valore della posizione dell'asse viene salvato nuovamente nella seconda variabile poco dopo. Ora possiamo confrontare i due valori misurati registrati tra loro. Se viene registrata una deviazione della posizione di un minimo precedentemente definito (+-3 nel nostro esempio di codice), possiamo supporre che il sensore abbia modificato la posizione. In questo caso, accendiamo il LED assegnato. 

Particolarmente interessante: i dati di misurazione acquisiti possono essere visualizzati nel plotter seriale dell'IDE di Arduino.

// Questo sketch confronta gli angoli degli assi X/Y/Z con i valori precedenti.
// Se differiscono di +/-3°, lo sketch commuta i LED. (ogni 1 per POS o per NEG)
// Attenzione: non si tratta di valori assoluti ma di valori RELATIVI rispetto alla misurazione precedente
#include <MPU6050_tockn.h> // Include librerie
#include <Wire.h> // <-
MPU6050 mpu6050(Wire, 0.1, 0.1); // Smorzamento dei valori. Più piccoli (direzione "0"), più nervosi sono i valori
                                // più grandi (direzione "1"), più lenti sono i valori
const int ledXpos =2; //***
const int ledXneg =3; // *
const int ledYpos =4; // * Imposta i collegamenti dei LED
const int ledYneg =5; //*
const int ledZpos =6; //*
const int ledZneg =7; //***
int xNowPos; // variabile CURRENT X-Pos
int yNowPos; // variabile CURRENT Y-Pos
int zNowPos; // Variabile CURRENT  Z-Pos
int xPrePos; // Variabile X-Pos PRECEDENTE
int yPrePos; // Variabile Y-Pos PRECEDENTE
int zPrePos; // Variabile Z-Pos PRECEDENTE
int difference = 3;
void setup() {                  // Beginn Setup-Funktion
Serial.begin(115200);         // Öffne serielle Übertragung (115200Baud) !!! Am Monitor ebenfalls einstellen !!!
pinMode(ledXpos, OUTPUT);     //***
pinMode(ledXneg, OUTPUT);     //  *
pinMode(ledYpos, OUTPUT);     //  * Festlegen dass LED-Anschlüsse Ausgänge sind
pinMode(ledYneg, OUTPUT);     //  *
pinMode(ledZpos, OUTPUT);     //  *
pinMode(ledZneg, OUTPUT);     //***
Wire.begin();                 // Beginn I2C Protokoll
mpu6050.begin();              // Start des Gyros
mpu6050.calcGyroOffsets();    // Gyro kalkuliert seine Offsets !!! Währenddessen ruhig liegen lassen !!!
// Benutze mpu6050.calcGyroOffsets(true), um es im seriellen Monitor zu verfolgen.
delay(1000);                    // Darauf warten wir...
}
void loop() { // inizio del ciclo di loop
mpu6050.update(); // crea un nuovo set di dati nel giroscopio
xNowPos=(mpu6050.getGyroAngleX()); // Richiedi un nuovo set di dati dal giroscopio, scrivi nella variabile X
yNowPos=(mpu6050.getGyroAngleY()); //  Richiedi un nuovo set di dati dal giroscopio, scrivi nella variabile Y
zNowPos=(mpu6050.getGyroAngleZ()); // Richiedi un nuovo set di dati dal giroscopio, scrivi nella variabile Z
if (xNowPos < xPrePos-(difference)) // Confronta il vecchio set di dati con quello nuovo. Differenza < -3 ?
{digitalWrite(ledXpos, LOW); digitalWrite(ledXneg, HIGH);} // Allora cambia i LED di conseguenza
else if (xNowPos > xVorPos+(differenza)) // Confronta i dati vecchi con quelli nuovi. Differenza < +3 ?
{digitalWrite(ledXpos, HIGH); digitalWrite(ledXneg, LOW);} // Allora commuta i LED di conseguenza
else // Oppure spegni tutti i LED X...
{digitalWrite(ledXpos, LOW); digitalWrite(ledXneg, LOW);} // Allora cambia i LED di conseguenza
if (yNowPos < yPrePos-(difference)) // Confronta il vecchio set di dati con quello nuovo. Differenza < -3 ?
{digitalWrite(ledYpos, LOW); digitalWrite(ledYneg, HIGH);} // Allora commuta i LED di conseguenza
else if (yNowPos > yVorPos+(differenza)) // Confronta il vecchio set di dati con quello nuovo. Differenza < +3 ?
{digitalWrite(ledYpos, HIGH); digitalWrite(ledYneg, LOW);} // Allora commuta i LED di conseguenza
else // Oppure spegni tutti i LED Y...
{digitalWrite(ledYpos, LOW); digitalWrite(ledYneg, LOW);} // Allora commuta i LED di conseguenza
if (zNowPos < zPrePos-(difference)) // Confronta il vecchio set di dati con quello nuovo. Differenza < -3 ?
{digitalWrite(ledZpos, LOW); digitalWrite(ledZneg, HIGH);} // Allora commuta i LED di conseguenza
else if (zNowPos > zPrePos+(differenza)) // Confronta il vecchio set di dati con quello nuovo. Differenza < +3 ?
{digitalWrite(ledZpos, HIGH); digitalWrite(ledZneg, LOW);} // Allora commuta i LED di conseguenza
else // Oppure spegni tutti i LED Z...
{digitalWrite(ledZpos, LOW); digitalWrite(ledZneg, LOW);} // Allora commuta i LED di conseguenza
xVorPos=xJetztPos; // Aggiorna il vecchio set di dati (finora)
yVorPos=yJetztPos; // aggiorna il vecchio set di dati (finora)
zVorPos=zJetztPos; // Aggiorna il vecchio record (finora)
// Poi, nell'esecuzione successiva, può essere confrontato di nuovo con "prima"
Serial.print(xNowPos); // >> plotter seriale<< ortografico [output X]
Serial.print(" ");Serial.print(yJetztPos); // (" ") = (\t) = Nuovo colore[output  Y]
Serial.print(" ");Serial.println(zNowPos); // (" ") = (\t) = Nuovo colore[uscita  Z]
delay(15); // (un ritardo minimo calma l'uscita seriale)
} // fine del ciclo
// Sentiti libero di sperimentare un po' con lo smorzamento nella terza riga del programma
//-> MPU6050 mpu6050(Wire, 0.3, 0.3);
// o con il delay() alla fine. Osserva poi i valori nel PLOTTER >>seriale <<
Inserisci questi caratteri nel seguente campo di testo.

I campi contrassegnati con * sono obbligatori.

Prodotti correlati
Microcontrollore Funduino UNO R3 - compatibile con Arduino Microcontrollore Funduino UNO R3 - compatibile...
Contenuto 1 Stück
15,90 € *
Numero d'ordine: F23107480
Aggiungi al carrello
Modulo MPU-6050 - sensore di accelerazione triassiale e giroscopio Modulo MPU-6050 - sensore di accelerazione...
Contenuto 1 Stück
3,62 € *
Numero d'ordine: F23107397
Aggiungi al carrello
100 pezzi - LED con diametro di 5 mm (5 colori) 100 pezzi - LED con diametro di 5 mm (5 colori)
Contenuto 1 Stück
1,97 € *
Numero d'ordine: F23107316
Aggiungi al carrello
100 resistenze - 20x ciascuna 100 Ohm, 200 Ohm, 330 Ohm, 1K Ohm, 10K Ohm 100 resistenze - 20x ciascuna 100 Ohm, 200 Ohm,...
Contenuto 1 Stück
1,72 € *
Numero d'ordine: F23107216
Aggiungi al carrello