Go Down

Topic: Interruzione TX con 2 MPU-6050 (Read 1 time) previous topic - next topic

woodstock

Ciao a tutti,
sto realizzando un sistema costituito da due sensori MPU-6050 (acc & gyro) in modo la rilevare gli spostamenti di due segmenti articolari.

Utilizzo il protocollo I2C e riesco a leggere un singolo sensore senza problemi. Nel momento in cui collego 2 sensori su di un BUS (SCL e SDA) comincio ad avere errori di FIFO-overflow e tutto ad un tratto (a random) la comunicazione si interrompe (il led TX si spegne).

I sensori hanno indirizzi diversi (uno 0x68 e l'altro 0x69).

Sto dietro a questo problema da un sacco di tempo e non riesco a trovarne una soluzione. Qualunque vostro consigli è ben accetto!

NOTE -- > In allegato: schema, script, MPU6050 datasheet e lo schematico del sensore

tonid

Ciao,prova ad abbassare il valore delle 2 resistenze di pull-up a 2k2,dovresti risolvere.

flz47655

Su breadboard hai delle capacità parassite dovute alla vicinanza delle piste.. con I2C hai dei segnali a 100KHz e questo effetto inizia a sentirsi.. hai provato ad usare una breadboard più piccola?

Prova ad abbassare la resistenza di pull-up (prova ad es. 1 o 2k invece delle resistenze da 4.4k)

Ti lascio un buon link (purtroppo in inglese) http://www.i2c-bus.org/i2c-primer/
Ciao
PS: Hai un oscilloscopio?

woodstock

@Tonid: ho provato a cambiare le R con 2K2 e ho ottenuto un miglioramento, ovvero che adesso la trasmissione rimane attiva per 1-2min e poi si spegne. Prima durava molto meno. I FIFO-Overflow sembrano spariti.

@Flz47655: Grazie del link! purtroppo non ho una breadboard più piccola, però vorrei provare in questi giorni a saldare il tutto, perché mi sono accorto che comunque basta muovere un filo che la trasmissione si interrompe. Ma, al di là di questo fatto, la TX si ferma comunque anche quando il sistema rimane immobile sul tavolo senza nessun spostamento.

Dite che devo provare con delle R ancora più piccole di 2K2?... tra l'altro sullo schematic del sensore sono presenti 2 R pari a 10K in uscita da SCL e SDA.

Qualcuno a mai provato ad usare 2 sensori su di un unico bus I2C?


cyclone

sai a che frequenza sta andando l' SCL ?
a 100Khz o a 400Khz.....

il problema potrebbe stare lì
ciao

woodstock

@cyclone: sul datasheet del sensore ho letto questo "400KHz Fast Mode I2C for communicating with all registers"... se fosse questo il problema, come faccio a variare questo valore? e a quanto dovrei portarlo indicativamente?

flz47655

Arduino viaggia a 100KHz, bisogna modificare un header nei sorgenti per cambiare la velocità

Ciao

lesto

il file da modificare è il twi.h all'interno della cartella utils della libreria Wire della cartella libraries di arduino, devi cambiare nel twi.h:

Code: [Select]
#ifndef TWI_FREQ
  #define TWI_FREQ 100000L
  #endif

in
Code: [Select]
#ifndef TWI_FREQ
  #define TWI_FREQ 400000L
  #endif


e, in twi.c conviene disattivare le pull-up di 10k che incasinano e basta; usa le 2.2k esterne e commenta nel twi.c:

Code: [Select]
// activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

woodstock

@flz47655  e @Lesto siete stati molto gentili... domattina proverò e vi farò sapere!

leo72

Se imposti il clock a 400 kHz abbassa le R di pull-up a 1K5 (con alimentazione a 5V) per fornire 3 mA di corrente di pull-up.

woodstock

@leo72: purtroppo sono obbligato ad usare una tensione da 3.3V... quindi secondo te dovrei usare una R = 1K1?

leo72

1K, valore commerciale più vicino per avere 3,3 mA, che, viste le tolleranze delle comuni R, ti assicurano così almeno i 3mA di cui hai bisogno.

astrobeed


@leo72: purtroppo sono obbligato ad usare una tensione da 3.3V... quindi secondo te dovrei usare una R = 1K1?


Con 3.3V usa una R da 1.2K, devi disattivare le pull up interne di Arduino.
Quanto sono lunghi i collegamenti tra i sensori ed Arduino ?
Che tipo di cavi hai usato ?
La I2C ha come unico limite la capacità complessiva della linea, 400 pf, che è data da quella dei sensori, nel tuo caso molto piccola, e quella dei cavi che può essere molto alta compromettendo l'integrità dei segnali SDA e SCL.
Come porti l'alimentazione ai due sensori ?
Potrebbe essere indispensabile utilizzare un traslatore di livelli (LLS) per la I2C, è vero che l'ATmega 328 riesce a lavorare sulla I2C con solo 3.3 V, però è al limite delle specifiche e questo riduce sensibilmente i limiti operativi.

woodstock

@astrobeed: come faccio a disattivare quelle interne di arduino? Facendo come mi ha suggerito @Lesto?

- Alcuni fili solo lunghi circa 10cm... non so se lo consideri tanto o nella norma :~
- L'alimentazione la porto dall'arduino al bus creato sulla breadboard (come imm allegata inizialmente)

Adesso provo sia ad abbassare le R di pullup e sia fare le modifiche consigliate da @Lesto. Vediamo cosa succede...

woodstock

Beh ragazzi... posso finalmente dire che dopo 15min di attività... la trasmissione non si è ancora interrotta!... i dati sono stabili tranne ogni tanto che uno dei sensori "sfarfalla" per poi ritornare stabile... questo è un punto che devo ancora risolvere!

Le modifiche effettuate sono state:
- R di pullup = 1K (una per SCL e una per SDA)
- Modifica dei file twi.h e twi.c seguendo le istruzioni di @Lesto

Poi penso che il tutto sarà ancora più stabile quando i componenti verranno saldati l'uno con l'altro e non più posizionati su basetta.

Ringrazio infinitamente tutti quanti!! Spero che tutto questo possa essere utile anche per altri.

Go Up