IMU (Inertia Measurement Unit) sensors, questo il nome tecnico del nostro sensore GY-521.
Un dispositivo con questo appellativo, appunto IMU, è un dispositivo che ingloba 2 sensori:
- Accelerometro [ (m/s2) o G-force ]
- Giroscopio [ RPM o gradi su secondi]
che tramite un'apposita centralina di controllo ed elaborazione ( MPU-6050 ) calcola posizione, velocità e orientamento.
L'IMU rappresenta un gradissimo successo ed ha rappresentato un fondamentale aiuto per tutta la robotica e cinematica.
Questa breve e prima guida ci darà la possibilità di capire come le librerie apposite si interfacciano con il nostro GY-521 tramite l'I2C.
Vedremo come collegarlo correttamente e come richiedere ogni parametro, da noi richiesto, al nostro sensore.
Questo esempio molto istruttivo mostra passo dopo passo come l'Arduino va a richiedere alcuni specifici registri al nostro 521; lo troviamo qui http://goo.gl/n3M16f , copiamolo nel nostro IDE.
Schematico per i collegamenti:
Analizziamolo velocemente:
dalla riga 5-15 si va ad attivare il nostro 521, con il suo indirizzo 0x86 e la definizione delle costanti che andremo ad utilizzare. Indichiamo anche la velocità di trasmissione.
dalla riga 17-20 si indica il registro di partenza della lettura, 0x3B (ACCEL_XOUT_H) , e successivamente si chiede di leggere anche gli altri 14 consecutivi, (MPU,14,true) .
dalla riga 18-24 si legge i risultati inviati dal nostro 521, mettendoli nelle corrispettive variabili.
NOTE, con 14 registri abbiamo 7 variabili!
dalla riga 26-39 si pubblicano i risultati sulla seriale, con le opportune costanti per la conversione ai gradi centigradi.
Nel caso volessimo stampare solo i valori della temperatura e del giroscopio?
Niente paura, basterà commentare le righe che riportano il valore dell'accelerometro.Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU,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)
In verità sarebbe meglio cambiare anche il registro di lettura:
Questo perchè non avrebbe senso richiede al nostro 521 dei valori che non andremo ad utilizzare!Wire.write(
0x41
); // starting with register 0x3B (ACCEL_XOUT_H) Wire.endTransmission(false); Wire.requestFrom(MPU,
8
,true); // request a total of 14 registers
Note conclusive:
- Valori di ritorno dal sensore. Anche se lasciamo il sensore fermo per qualche secondo, l'uscita oscillerà inesorabilmente tra un certo range di valori.
- Questi valori sembrano, apparentemente, senza un senso. Il numero che viene stampato, XYZ d'ogni sensore, non è facilmente ricollegabile ad una posizione nello spazio ben precisa.
Di fatto stiamo solo leggendo i valori del sensore, senza alcuna elaborazione aggiuntiva.
Per visionare tutti i registri: https://goo.gl/HNPUJA
Vi lascio il link al datasheet del componente: http://goo.gl/1cxpfL
Nessun commento:
Posta un commento