Motion tracking IMU MCP-6050 (6 DOF) e Arduino Micro - problema interfacciamento

Salve a tutti,
non so se ho scelto la sezione adeguata del forum, in caso contrario mi scuso in anticipo :grin:

Vorrei realizzare un sistema low cost di motion tracking per analizzare il movimento degli arti inferiori. Per darvi un’idea si tratterebbe di qualcosa di simile alle tute prodotte da questa azienda olandese: http://www.xsens.com/en/mvn-awinda

In diversi articoli scientifici viene riportato che i sensori utilizzati per queste applicazioni dovrebbero essere in grado di acquisire dati a circa 100 Hz. Vi cito uno di questi articoli:
A wearable gait analysis system using inertial sensors Part I: Evaluation of measures of gait symmetry and normality against 3D kinematic data http://hh.diva-portal.org/smash/record.jsf?pid=diva2:516201. Dovrebbero occorrermi 7 IMU, e dato che la frequenza di campionamento per ognuno di questi sensori è piuttosto bassa, le distanze sono nell’ordine di decine di centimetri, e il tutto dovrebbe essere alimentato a batteria, pensavo di usare il protocollo I2C. Arduino Micro sarebbe il master I2C e i vari sensori gli slave.

Prima di tutto mi sono documentato sulle varie IMU (Inertial Measuring Unit) disponibili, e ne ho scelta una che mi sembra molto supportata sia dalla community di Arduino che da altre (Sparkfun e DIYdrones per esempio). Si tratta della MPU-6050 di InvenSense. Nello stesso sensore sono presenti sia un accelerometro triassiale che un giroscopio triassiale. So che avrei bisogno anche di un magnetometro per evitare il problema del gimbal lock ma per questa applicazione credo che potrebbero bastarmi i 6 GdL di questo sensore, e poi comunque c’è la possibilità di integrare un magnetometro esterno in un secondo momento.

Ho trovato innumerevoli breakout boards con questo sensore, e ne ho acquistata una per un prezzo davvero irrisorio, la GY-521. E’ dotata sia di regolatore di tensione che di resistenze di pull-up sui pin SDA e SCL.

Vi metto qui il link di Arduino Playground con le informazioni su questa IMU e con lo sketch di test:
http://playground.arduino.cc/Main/MPU-6050

Ho appena iniziato a lavorare a questo progetto, quindi tanto per cominciare vorrei ricavare una qualche forma di output dal sensore (quaternioni, angoli di Eulero, accelerazioni, etc) ma non riesco a rilevare il sensore come dispositivo I2C. Per ricavare i dati grezzi di accelerometro e giroscopio credo basti il circuito che ho allegato al post, mentre per sfruttare gli algoritmi di sensor fusion di InvenSense e ricavare i quaternioni occorre che il sensore segnali ad Arduino quando il suo buffer FIFO è pronto a trasmettere. Per ricavare posizione e orientazione potrei utilizzare le MotionApps di InvenSense (http://www.invensense.com/developers/) oppure la libreria I2Cdevlib (MPU-6050 6-axis accelerometer/gyroscope | I2C Device Library).

Il problema è che non riesco a interfacciare Arduino Micro con la IMU… =(

Ho provato lo sketch I2Cscanner trovato su arduinoplayground ma il serial monitor mi dice “No I2C devices found”, mentre mi aspetterei il messaggio: “I2C device found at address 0x68”. Questo è lo sketch I2Cscanner: http://playground.arduino.cc/Main/I2cScanner

Il mio setup attuale è:

  • Windows 7 64 bit (potrei provare anche su Fedora eventualmente…)
  • Arduino IDE 1.0.5
  • Arduino Micro

In allegato il circuito fatto con Fritzing.

JackalJack: Ho trovato innumerevoli breakout boards con questo sensore, e ne ho acquistata una per un prezzo davvero irrisorio, la GY-521. E' dotata sia di regolatore di tensione che di resistenze di pull-up sui pin SDA e SCL.

Ovvero hai acquistato una cineseria che non vale quello che costa, il solo MPU6050 costa circa 10 Euro se ne compri 10.000, li produce esclusivamente InvenSense, pertanto non è possibile pagare tutta la board circa 6$ (prezzo medio di mercato). Per la tua applicazione ti consiglio caldamente di acquistare solo bord con chip originali, queste cineserie montano cloni o scarti di produzione, in entrambe i casi sia la qualità che le prestazioni sono inferiori a quelle dei chip originali, va da se che per fare qualche prova va bene anche il clone low cost :) Dando per scontato che hai fatto i collegamenti corretti, in particolare verifica di aver connesso SDA con SDA e SCL con SCL, se I2C scanner non trova l'address vuol dire che o il chip non funziona correttamente oppure i cavi sono troppo lunghi, non ultimo la possibilità che il chip non sia un vero MPU6050. Verifica con un multimetro che su SDA e SCL di Arduino, con la board collegata, il tutto alimentato e senza nessuno scketch caricato che usa la I2C, sia presente una tensione di circa 3.3 V, se non è così controlla le connessioni, le prime prove falle con non più di 15-20 cm di cavo. Tieni presente che su una singola linea I2C al massimo puoi collegare solo due MPU6050 perché non possono esistere due device con lo stesso indirizzo, dato che gli MPU6050 consentono di scegliere un adress alternativo a quello principale di conseguenza ne puoi usare solo due sul ATmega328.

grazie mille per la risposta. :D

Ho caricato lo sketch blink e su SDA/SCL misuro circa 0.3V, sia sulla scheda Gy-521 sia su Arduino Micro. Se carico I2C_scanner leggo 4.9V sia su SDA sia su SCL.

Il problema lunghezza cavi (per evitare capacità parassite troppo elevate, giusto?) lo escluderei perché sto testando il circuito su una breadboard e uso dei cavi molto corti. Però non vorrei che avesse dei problemi la breadboard visto che è vecchiotta. Domani provo con un'altra.

Come si vede dall'immagine questa breakout board ha già le 2 resistenze di pull-up (222) per il bus I2C. Ho letto che 2.2k sono un po' pochi...

JackalJack: Ho caricato lo sketch blink e su SDA/SCL misuro circa 0.3V, sia sulla scheda Gy-521 sia su Arduino Micro. Se carico I2C_scanner leggo 4.9V sia su SDA sia su SCL.

Non va bene, vuol dire che le pull up sulla board non sono collegate oppure che i cavi non fanno contatto, sia con il blink che con l'I2C scanner devi misurare circa 3.3V, qualcosa in più con lo scanner perché la libreria wire attiva le pull up interne del micro su i pin SDA/SCL, sono da circa 20k e collegate al +5V pertanto alzano leggermente la tensione sugli ingressi.

Come si vede dall'immagine questa breakout board ha già le 2 resistenze di pull-up (222) per il bus I2C. Ho letto che 2.2k sono un po' pochi...

2.2k vanno bene come pull up, sono nel range ammesso.

Come sospettavo il problema era la breadboard. Prima non rilevavo nessun dispositivo I2C e lo sketch di esempio della libreria i2cdevlib mi restituiva nel serial monitor un messaggio di questo tipo:

MPU-6050 Read accel, temp and gyro, error = 2 accel x,y,z: -5374, 2, 305 temperature: 37.212 degrees Celsius gyro x,y,z : 2050, -13039, -29695,

Ho scoperto che il codice error=2 significa che il componente GY-521 non ha la sufficiente alimentazione. Ho rimontato il circuito su un'altra breadboard e adesso funziona. Con I2C-scanner vedo il sensore all'indirizzo 0x68 e grazie a una breve guida sul forum di i2cdevlib sono riuscito a visualizzare l'esempio con l'aeroplano in Processing.

Adesso mi metto a leggere per bene il codice...

Grazie ancora :grin:

Per quanto riguarda il fatto di non poter collegare più di 2 MPU-6050 (0x68 e 0x69) ho trovato questo post su Stack Exchange: http://electronics.stackexchange.com/questions/72927/how-to-add-additional-i2c-sensor-module-on-arduino Sembra che ci siano diverse soluzioni per ovviare a questa limitazione, a patto che la frequenza di campionamento dei segnali da acquisire sia sufficientemente bassa immagino...