Problema sensore MPU9150

Salve ragazzi sono nuovo del forum :slight_smile: …

Ho un problema con questo sensore di movimento:
http://www.ebay.it/itm/IMU-9DOF-MPU9150-Invensense-breakout-board-MPU6050-AK8975-/271135830629?pt=FR_YO_MaisonJardin_Bricolage_ElectroniqueComposants&hash=item3f20f47265

Possiedo un Arduino Leonardo, ho saldato il componente, scaricato lo sketch e le librerie consigliate nella descrizione del prodotto e collegato il tutto in questo modo attraverso breadboard:

Sensore - Leonardo
SCL <-> SCL
SDA <-> SDA
VDD <-> 3.3V
GND <-> GND

Il problema è che una volta che carico lo sketch “ArduinoAccel” e lo metto in funzione, nel monitor seriale, alla stessa frequenza (9600) non spunta NULLA… rimane BIANCO!

Ho controllato con lo sketch I2CScanner e il componente viene riconosciuto!!!

Potete aiutarmi? :frowning:

Aggiungi all'inizio del setup

void setup() { 
 //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

// il resto del codice del setup....

}

Niente da fare: ho provato ad aggiungere il while subito dopo begin, ma nulla. Cosa posso fare?!?

EDIT:

Ragazzi ho risolto il problema del monitor seriale (mi è bastato usare l'ambiente 1.5.8 in beta) :( :( :( Il problema adesso è che il monitor seriale stampa questo errore:

ArduinoIMU starting using device MPU-9150 Failed to init IMU: -1 No valid compass calibration data

Come posso risovere?

Per utilizzare la libreria i2cdev devi anche collegare il pin int della 9150 al pin 2 di arduino uno/mega2560 che sarebbe l’interrupt 0, è sulla Leonardo mi pare sia il pin 3 l’interrupt 0.

Ciao

Guarda la tabella --> http://arduino.cc/en/Reference/attachInterrupt

Ragazzi non cambia nulla, da sempre l'errore Failed to init IMU: -1 Vi prego sto sclerando, una settimana che provo a farlo riconoscere!

Ma tu questo passaggio lo hai fatto ? "Select the IMU in use by editing libraries/RTIMULib/RTIMULibDefs.h and uncommenting one of the supported IMUs like this: ..."

Si giĂ  fatto

EDIT:

Spulciando la libreria RTIMUMPU9150.cpp ho trovato da dove viene generato l’errore:

if (!I2Cdev::writeByte(m_slaveAddr, MPU9150_PWR_MGMT_1, 0x80))
return -1;

cosa significa?

Allora ti dico la procedura che ho fatto io.
Vai qui e scaricati la libreria: GitHub - jrowberg/i2cdevlib: I2C device library collection for AVR/Arduino or other C++-based MCUs

Una volta scaricata , vai nella nella directory scaricata “i2cdevlib-master” e troverai 3 directory di cui una è quella arduino, entra dentro quella e cerca la directory con il nome I2Cdev , ora questa copiala nella directory librerie di arduino.

Fatto questo copia l’intera directory “i2cdevlib-master” dentro la directory librerie di Arduino la solita di prima.
Adesso se apri arduino se vai in esempi librerie troverai i2cdevlib-master > arduino > mpu9150 , e fin qui ci siamo.

Per i collegamenti sono questi:
pin GND <-> GND
pin 3.3V <-> VCC
pin A4 <-> SDA
pin A5 <-> SCL
pin 3 <-> INT
Cosi a me funziona con la mpu6050.

Edit: ho trovato questo link di Arduino con mpu9150: http://forum.arduino.cc/index.phptopic=154023.0
che praticamente ti dice all’incirca quello che ti ho detto solo che loro usano una Uno,
e il pin interrupt è il pin2, ma se tu hai la Leonardo il pin che devi collegare è il pin 3.

Vespucci col tuo procedimento ottengo solo una sfilza di 0

Guarda non so che dirti, anche a me dava il tuo stesso problema di dispositivo non trovato e calibrazione fallita con una sfilza di zeri, ma una volta connesso il pin int della mpu a funzionato.

edit: Anche qui uno usa la Leonardo ma il suo problema erano le saldature http://forum.arduino.cc/index.php?topic=231687.0

Vespucci: Anche qui uno usa la Leonardo ma il suo problema erano le saldature

Si avevo giĂ  letto questo topic, anche se non credo sia il mio stesso problema....

Ho notato che collegando l'interrupt del sensore al PIN 3 di Leonardo, se carico I2CScanner, questo rimane fermo su "Scanning..."

Togliendo l'interrupt lo scanner lo rileva immediatamente (indirizzo 0x69)

Questo cosa può significare?

Ciao Dorian96,

dopo quello che hai scritto, mi sono messo un po a rileggere lo sketch contenuto nella lib I2Cdev questo : "MPU9150_raw", perché come standard l'indirizzo è "0x68" che equivale al pin in LOW ma se con I2CScanner ti da "0x69" ho visto questa cosa qua:

// class default I2C address is 0x68 // specific I2C addresses may be passed as a parameter here // AD0 low = 0x68 (default for InvenSense evaluation board) // AD0 high = 0x69 MPU9150 accelGyroMag;

quindi in teoria devi inserire l'indirizzo 0x69 , penso devi aggiungere una cosa tipo: MPU9150 mpu(0x69); non sono sicuro però della sintassi , se non funziona devi vedere la class reference I2Cdev Fammi sapere.

Ciao

Se lo schema che ha pubblicato il venditore: https://docs.google.com/file/d/0B3ASxBYiXsrDRTJpaW5tQ1BTZ00/edit?usp=sharing è corretto, il pin AD0 è collegato a VCC quindi l'impostazione di fabbrica del sensore è per l'indirizzo 0x69.

forse mi sono espresso male, ho visto che è corretto ,intendevo che lo sketch della lib. I2Cdev presume che il pin ad0, sia in low (0x68) dato chè lo stesso per le mpu6050 Invesense (tipo la mia).

Dorian96: Spulciando la libreria RTIMUMPU9150.cpp ho trovato da dove viene generato l'errore:

if (!I2Cdev::writeByte(m_slaveAddr, MPU9150_PWR_MGMT_1, 0x80)) return -1;

cosa significa?

significa che il tuo sensore non sta rispondendo alla chiamata. Se è la prima istruzione che chiama il sesnore allora il poblema è che proabilmente l'indirizzo del sensore è sbagliato.

Cerca "arduino i2c scanner", è uno sketch che ti restituisce tutti gli indirizzi trovati sul bus i2c. Posta i risultati.

Ciao Lesto, lui ha già fatto la scansione con I2CScanner e gli restituisce come ind. 0x69, quindi siamo sicuri dell'indirizzo, ma come ho detto prima se non modifica quella riga nello sketch "MPU9150_raw" mettendo l'indirizzo 0x69 in quella riga non funzionerà. Sono sicuro al 90% che quello è il suo problema.

Ciao

allora confermo appieno la tua analisi :D

Allora, ho modificato lo sketch di MPU9150_raw alla riga di dichiarazione in questo modo:

MPU9150 accelGyroMag(0x69);

In poche parole ho passato come paramentro l'indirizzo 0x69, ma IL NULLA TOTALE!

Tutta la solita sfilza di 0.......

EDIT: Centra il fatto che 0x69 viene riconosciuto e usato come AD0 HIGH?