In questa lezione si imparerà ad utilizzare il modulo GY-521, uno dei migliori sensori IMU (Inertia Measurement Unit – Sensore di misura dell’inerzia) compatibili con la board di Arduino.
Tali sensori sono utilizzati per robot capaci di stare in equilibrio, UAV, smartphone, nei dispositivi indossabili, nei controller e così via. I sensori IMU ci aiutano a stabilire la posizione di un oggetto e stabile le coordinate (l’unità di misura utilizzata molto spesso sono i gradi) nelle tre dimensioni.
Il sensore GY-521 è sviluppato dalla società InvenSense e contiene al suo interno accelerometri e giroscopi MEMS (Micro Electro-Mechanical System). Inoltre contiene anche un convertitore analogico digitale a 16 bit per ogni canale.
Per tal motivo rileva contemporaneamente l’inerzia sugli assi x,y e z. Per interfacciarsi con Arduino il sensore utilizza una connessione I2C-bus.
I sensori IMU sono composti da due o più componenti. Tra questi vi è l’accelerometro, il giroscopio, il magnetometro ed l’altimetro.
Il sensore GY-521 è in grado di fornire ben 6 valori come output. Tre di questi saranno ricavati dall’accelerometro e 3 dal giroscopio. Accelerometro e giroscopio, sono entrambi contenuti all’interno di un singolo chip.
Come funzione l’accelerometro
Un’accelerometro funziona sfruttando il principio dell’effetto piezoelettrico. Immagina una scatola di forma cubica con una piccola sferetta all’interno come nell’immagine sottostante. Le pareti di questa scatola sono fatte di materiale cristallino piezoelettrico. Quando ruoti il box la sferetta è forzata a muoversi, ad opera della forza di gravità, nella direzione in cui viene inclinata la scatola. Le pareti contro cui la sferetta collide, creano delle leggerissime scariche di piezoelettricità. La scatola è composta da un totale di 3 paia di pareti opposte. Ogni paio corrisponde ad un asse nello spazio tridimensionale: secondo le assi X, Y, Z. In base alla corrente piezoelettrica prodotta dalle pareti cristalline si può determinare la direzione dell’inclinazione.
Un’improvvisa accelerazione provoca uno shock e una compressione della struttura del cristallo piezoelettrico che reagisce generando un segnale elettrico ben preciso. Rilevando questo segnale elettrico ed elaborandolo adeguatamente, l’accelerometro è dunque in grado di determinare da quale direzione giunga la spinta acceleratrice e quale sia la sua forza.
I movimenti saranno registrati esclusivamente su un piano orizzontale (o verticale) e dunque bidimensionale.
Per la digitalizzare dei valori viene utilizzato un ADC a 16 bit, Gli intervalli di uscita a fondo scala possibili sono: +/- 2g, +/- 4g, +/- 8g, +/- 16g.
In posizione normale, cioè quando il dispositivo è posizionato su una superficie piana, i valori sono 0 g sull’asse x, 0 g sull’asse y e +1 sull’asse z.
Come funziona un giroscopio
Il giroscopio funziona sfruttando il principio di accelerazione di Coriolis. Immagina che ci sia una struttura simile ad una forca che compie un movimento costante, avanti ed indietro. Questa struttura è tenuta in posizione da un cristallo piezoelettrico. Ogni qualvolta la struttura viene mossa il cristallo subisce una forza nella direzione dell’inclinazione, questa forza è causata dal risultato della forza di inerzia applicata alla forca. Il cristallo in questo modo produce una corrente dovuta all’effetto piezoelettrico e tale corrente viene amplificata. Questi valori sono raffinati poi dal microcontrollore.
L’ADC a 16 bit viene utilizzato per digitalizzare la tensione per campionare ciascun asse. Gli intervalli di uscita a fondo scala sono : +/- 250, +/- 500, +/- 1000, +/- 2000. La velocità angolare viene misurata lungo ciascun asse in gradi al secondo unità.
I materiali da utilizzare sono i seguenti:
- (1) x Arduino UNO
- (1) x Modulo GY-521
- (4) x Connettori F-M
Il diagramma di collegamento è il seguente:
Il codice da utilizzare è il seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include<Wire.h> const int MPU_addr=0x68; // I2C address of the MPU-6050 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); // PWR_MGMT_1 register Wire.write(0); // set to zero (wakes up the MPU-6050) Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L) GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L) GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L) Serial.print(" | AcX = "); Serial.println(AcX); Serial.print(" | AcY = "); Serial.println(AcY); Serial.print(" | AcZ = "); Serial.println(AcZ); Serial.print(" | Tmp = "); Serial.println(Tmp/340.00+36.53); //equation for temperature in degrees C from datasheet Serial.print(" | GyX = "); Serial.println(GyX); Serial.print(" | GyY = "); Serial.println(GyY); Serial.print(" | GyZ = "); Serial.println(GyZ); Serial.println(); delay(333); } |
Il breve esempio ci mostra tutti i valori grezzi (accelerometro, giroscopio, temperatura).
Luigi Morelli aveva a suo tempo presentato un articolo in cui analizzava un sismografo utilizzando questo sensore. Per chi fosse interessato a realizzarne è disponibile un articolo nel seguente link.
Per acquistare il sensore clicca qui.
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano
Seguici per non perdere le prossime novità!
Ciao, ho montato il tutto, non avevo dubbi sul funzionamento, ma voglio farti una domanda… da profano: se il sensore è completamente immobile, perchè mi vengono restituiti valori diversi da zero? sia per il giroscopio che per l’accelerometro.
Prova ad utilizzare il plotter seriale anziché il serial print (come mostrato in questo articolo: https://www.moreware.org/wp/blog/2019/08/19/come-costruire-un-sismografo-con-arduino/ ).
Noterai che anche in quel caso la linea che rappresenta gli spostamenti non è perfettamente piatta, ma suscettibile di piccole variazioni nel tempo. Ciò è dovuto, tra le altre cose, al fatto che il GY-521 ha un ADC a 16 bit, mentre Arduino lavora a 8 bit, quindi parte della sensibilità del sistema viene “tagliata via”, e con essa la precisione. A questo aggiungi le micro-fluttuazioni nella tensione, che potrebbero modificare leggermente l’0assorbimento del sistema, le perdite e le resistenze indotte dai cavi e dal loro riscaldamento al passaggio della corrente.
Si tratta di flutuazioni minime, ma in un oggettino del valore di 2-3 euro fanno parte della tolleranza minima. Potresti comunque ovviare al problema, tarando lo strumento dividendo i risultati per un valore dinamico. Perderesti in precisione, ma elimineresti le fluttuazioni.
Buon divertimento!
Grazie
Ciao, scusami mi sfugge il discorso; GY-521 ha un ADC a 16 bit, mentre Arduino lavora a 8 bit
Ciao, onorato di aver suscitato il Vostro interesse. Perdonami: mI sfugge il senso della domanda…