domenica 4 ottobre 2015

IMU GY-521 accelerometro - giroscopio - termometro


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:
  1. Accelerometro [ (m/s2) o G-force ]
  2. 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?

  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)   
Niente paura, basterà commentare le righe che riportano il valore dell'accelerometro.


In verità sarebbe meglio cambiare anche il registro di lettura:

  Wire.write(0x41); // starting with register 0x3B (ACCEL_XOUT_H)   
  Wire.endTransmission(false);   
  Wire.requestFrom(MPU,8,true); // request a total of 14 registers  
Questo perchè non avrebbe senso richiede al nostro 521 dei valori che non andremo ad utilizzare!


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