Salve a tutti,
spero di aver scelto la sezione giusta!
Sono abbastanza nuovo per quanto riguarda il forum e la programmazione, ma ho voglia di impratichirmi con questa piattaforma che permette di fare mille cose. Mi sto cimentando nell'utilizzo di una piattaforma inerziale(acc+ gyro) della drotek modello mpu6000 che comunica via SPI con la mia arduino v3 ed essendo un novizio, ho cercato esempi di codici online come base da cui partire. Il mio scopo sarà quello, una volta perfezionata l'imu, di aggiungere due servo e un ponte H, creando così una specie di segway che si autobilancia mantenedo l'equilibrio.
Riporto il link dal quale ho preso il codice che poi ho modificato, ma la parte sulla dmp memory, configurazione e verifica dei dati legata ad essa è rimasta identica, se non semplicemente per l'aver cambiato il pin del CS (spi) dal D4 al D10 (arduino uno v3). Non posso riportare tutto il codice a causa dell'eccessiva lunghezza, vi linko quello dal quale sono partito io:
A livello hardware ho utilizzato i pin digitali 10,11,12,13 e il pin D2 come pin di interrupt. Ho la certezza che i collegamenti siano corretti perchè ho un programmino che testa le connessioni su protocollo spi e fin qui tutto bene.
Non capisco proprio come risolvere il problema della lettura corretta dei dati:
############# MPU-6000 Data Acquisition #############
Initializing SPI Protocol...
...SPI Protocol initializing done.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Initializing Digital Motion Processor (DMP)...
Resetting MPU6000...
SPI (/CS40) reading 1 byte from register 0x6B... 0xFF (done)
SPI (/CS40) writing 1 byte to register 0x6B... 0xFF (done)
bit_7 set to 1
Disabling sleep mode...
SPI (/CS40) reading 1 byte from register 0x6B... 0xFF (done)
SPI (/CS40) writing 1 byte to register 0x6B... 0xBF (done)
bit_6 set to 0
Selecting user bank 16...
SPI (/CS40) writing 1 byte to register 0x6D... 0x70 (done)
Selecting memory byte 6...
SPI (/CS40) writing 1 byte to register 0x6E... 0x06 (done)
Checking hardware revision...
Revision @ user[16][6] = FF
Resetting memory bank selection to 0...
SPI (/CS40) writing 1 byte to register 0x6D... 0x00 (done)
Reading OTP bank valid flag...
SPI (/CS40) reading 1 byte from register 0x00... 0xFF (done)
bit_0 = 1
OTP bank is valid!
Reading gyro offset TC values...
SPI (/CS40) reading 1 byte from register 0x01... 0xFF (done)
SPI (/CS40) reading 1 byte from register 0x02... 0xFF (done)
SPI (/CS40) reading 1 byte from register 0x03... 0xFF (done)
X gyro offset = 63
Y gyro offset = 63
Z gyro offset = 63
########################### Writing DMP code to MPU memory banks (1929 bytes)
Writing DMP memory.......... @@@ write bank 0
SPI (/CS40) writing 1 byte to register 0x6D... 0x00 (done)
SPI (/CS40) writing 1 byte to register 0x6E... 0x00 (done)
...
...
@@@ write bank 1
SPI (/CS40) writing 1 byte to register 0x6D... 0x01 (done)
SPI (/CS40) writing 1 byte to register 0x6E... 0x00 (done)
...
...
>> read bank 6
SPI (/CS40) writing 1 byte to register 0x6D... 0x06 (done)
SPI (/CS40) writing 1 byte to register 0x6E... 0x00 (done)
$$ dmpMemory: byte verification error
FF
$$ dmpMemory: byte verification error
FF
$$ dmpMemory: byte verification error
FF
e continua con un'infinità di byte verification error.
Da quello che ho potuto capire la comunicazione spi avviene ma non nel modo corretto tra le due piattaforme: il codice scrive un sacco di valori (via SPI) sulla mpu ("writing byte to register (done)" - lines), poi comincia a leggere i valori che tornano dalla mpu e li verifica e il "$$$ dmpMemory: byte verification error" significa che qualcosa è andato storto in scrittura o lettura su/dalla mpu6000, o entrambe. =( =( =( =(
Avete qualche idea? :~