Pages: [1] 2   Go Down
Author Topic: Interruzione TX con 2 MPU-6050  (Read 1184 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* Schema.pdf (243.87 KB - downloaded 27 times.)
* script.txt (9.67 KB - downloaded 16 times.)
* MPU-6050.pdf (1635.51 KB - downloaded 14 times.)
* MPU-6050_Breakout V11.pdf (51.54 KB - downloaded 10 times.)
Logged

Torino
Offline Offline
God Member
*****
Karma: 2
Posts: 753
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Parma
Offline Offline
Edison Member
*
Karma: 19
Posts: 2315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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?

Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

il problema potrebbe stare lì
ciao
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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?
Logged

Parma
Offline Offline
Edison Member
*
Karma: 19
Posts: 2315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ciao
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#ifndef TWI_FREQ
  #define TWI_FREQ 100000L
  #endif
in
Code:
#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:
// activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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 smiley-confuse
- 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...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1] 2   Go Up
Jump to: