Come collego più dispositivi I2C?

Ciao a tutti, avrei necessità di collegare più dispositivi I2C e da quello che so, vengono gestiti come un bus.
Ho già fatto progetti che prevedevano più dispositivi i2c, però questi avevano un ingresso e un uscita dove collegare in cascata i dispositivi successivi, mentre in questo caso, ho solo l'ingresso (4 contatti [VDD, GND, SDA, SCL]) ma non ho l'uscita per i successivi dispositivi.
Come posso fare? Posso collegarli in parallelo?
Grazie.
Ciao.

Certamente, li colleghi in parallelo ovviamente scl con scl e sda con sda; ricorda inoltre di avere massa e alimentazione dei dispositivi in comune. Funzionano perchè ogni dispositivo i2c ha assegnato (o devi assegnare) un indirizzo univoco per distinguerli.

Servono inoltre resistenze di pull-up su entrambe le linee SDA e SCL, il cui valore varia in base alla frequenza di lavoro del bus stesso. Comunque su molti datasheet è specificato il valore di esse.

Pelletta:
Certamente, li colleghi in parallelo ovviamente scl con scl e sda con sda; ricorda inoltre di avere massa e alimentazione dei dispositivi in comune. Funzionano perchè ogni dispositivo i2c ha assegnato (o devi assegnare) un indirizzo univoco per distinguerli.

ah! grazie!
Pensavo che quelli che hanno l'ingresso e l'uscita avessero anche una gestione particolare dei segnali, invece è una cosa più banale di quello che pensavo :slight_smile:

leo72:
Servono inoltre resistenze di pull-up su entrambe le linee SDA e SCL, il cui valore varia in base alla frequenza di lavoro del bus stesso. Comunque su molti datasheet è specificato il valore di esse.

Credo tu parlassi di questi: http://www.robot-italy.com/product_info.php?products_id=917
Ne ho presi uno per ogni dispositivo da collegare.
Ma non ne può bastare uno a monte?
Da quello che ho intuito però, mi sembra che uno di questi aggeggi che ho preso, possa gestire 2 dispositivi (vedi le due parti estreme) mentre quella centrale credo sia per rendere compatibile l'alimentazione e quindi forse ne basta una per alimentare 2 dispositivi.
Giusto?

Stefanoxjx:
Ma non ne può bastare uno a monte?

Quelli sono traslatori di livelli, ne serve uno solo per trasformare la linea I2C a 5V in una linea I2C a 3.3V, devi collegare SDA e SCL agli ingressi marcati come TXn da ambo i lati rispettando il livello di tensione, devi collegare HV al +V e HL a 3.3V.
Alla fine ottieni due linee I2C tra loro comuni come segnali, ma con diversi livelli di tensionie, una a 5V, lato HV del traslatore, e una a 3.3V, lato LV del traslatore.
Se devi usare solo dispositivi I2C a 3.3V non ti serve nessun traslatore di livello, colleghi direttamente SDA e SCL alle rispettive linee di Arduino e le due pullup, rigorosamente da 1.5k, le colleghi al +3.3V.
Le linee I2C sono del tipo open drain il che permette di usare diversi livelli di tensioni, purché nel range ammesso, a piacere.

Avevo gia' visto quel prodotto on line ma non avevo mai compreso a cosa potesse servirmi. Questa spiegazione e' stata utile! F

Quindi, a parte che non mi serve in questo caso, perchè arduino già gestirebbe correttamente (penso però alimentandolo a 3.3 e non a 5 come sullo schema) ma se dovessi utilizzarlo il collegamento andrebbe effettuato come l'ho disegnato nello schema. Giusto?

P.S. Scusate la mia scarsità artistica :frowning:

Non capisco una cosa: perché questi passaggi da 3,3 a 5V e viceversa?
Il bus I2C lavora benissimo a 5V, quindi si può usare questa tensione.

leo72:
Non capisco una cosa: perché questi passaggi da 3,3 a 5V e viceversa?

Il problema non è il bus I2C, sono i device che gli colleghi, mica tutti funzionano a 5V, anzi ormai lo standard sta diventando 3.3V se non 1.8V, se devi mischiare device che lavorano tensioni diverse ti serve il traslatore di livelli.

Stefanoxjx:
Quindi, a parte che non mi serve in questo caso, perchè arduino già gestirebbe correttamente (penso però alimentandolo a 3.3 e non a 5 come sullo schema)

No, Arduino lo alimenti regolarmente a 5V, quello che cambia è la tensione per l'uno logico del bus I2C che viene determinata dalle resistenze di pull up, se le colleghi a 3.3 V e usi solo device I2C che lavorano con questa tensione non ti serve nessun traslatore di livello.
SDA e SCL dell'ATmega 328, ma vale anche per molti altri modelli di micro non necessariamente Atmel, funzionano senza problemi anche con questi livelli di tensione, attenzione a non scendere sotto i 3V come tensione per le pull up perchè sotto questo livello cominciano problemi di riconoscimento delle soglie che non sono le stesse usate dagli ingressi digitali.

Stefanoxjx:
Quindi, a parte che non mi serve in questo caso, perchè arduino già gestirebbe correttamente (penso però alimentandolo a 3.3 e non a 5 come sullo schema) ...

Non puoi alimentare un Arduino da 5V con 3,3V. Se abbassi la tensione di alimentazione devi anche abbassare la frequenza di clock.
http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf figura 28-1 a pagina 316
Le versioni Arduino per 3,3V vanno a 8MHz. (Arduino pro e Arduino mini pro).
Ciao Uwe

uwefed:

Stefanoxjx:
Quindi, a parte che non mi serve in questo caso, perchè arduino già gestirebbe correttamente (penso però alimentandolo a 3.3 e non a 5 come sullo schema) ...

Non puoi alimentare un Arduino da 5V con 3,3V. Se abbassi la tensione di alimentazione devi anche abbassare la frequenza di clock.
http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf figura 28-1 a pagina 316
Le versioni Arduino per 3,3V vanno a 8MHz. (Arduino pro e Arduino mini pro).
Ciao Uwe

No infatti, io intendevo dire di alimentare i sensori i2c a 3.3 anzichè 5 volt.
Arduino lo alimento sempre a circa 12V.

Ciao Stefanoxjx
Se i sensori sono per 5V non puoi alimentarli a 3,3V
Se colleghi dispositivi I2C che funzionano solo a 3,3 V e le cui entrate non reggono 5V devi mettere un adattatore di livello come detto sopra.
Se i dispositivi I2C sono per 5V non serve nessun adattatore di livello.

Comunque come lo hai disegnato sull immagine allegata nel reply #7 é sbagliato.
devi collegare:
HV a5V Arduino ,
GND a GND Arduino,
LV a 3,3V Arduino,
TX_HV Chan 1 a SDA Arduino,
TX_HV Chan 2 a SCK Arduino,
TX_LV Chan 1 a SDA dispositivo I2C da 3,3V,
TX_LV Chan 2 a SCK dispositivo I2C da 3,3V,
3,3V Arduino alla alimentazione dispositivo I2C da 3,3V
GND Arduino a GND dispositivo I2C da 3,3V
Devi aggiungere 2 resistenze che vanno da TX_LV Chan 1 e da TX_LV Chan 2 a +3,3V. Il valore é tra 10kOhm e 1,8kOhm a secondo della lunghezza dei collegamenti e il numero di dispositivi collegati (piú dispositivi e piú lungo il collegamnto piú piccola la resistenza).
Ciao Uwe

Grazie uwe, avrei quindi fatto un bel disastro se avessi seguito la mia idea :slight_smile:
Che casinista che sono :fearful:

uwefed:
Se colleghi dispositivi I2C che funzionano solo a 3,3 V e le cui entrate non reggono 5V devi mettere un adattatore di livello come detto sopra.

Se colleghi solo device I2C a 3.3V, cioè sul bus non ci sono device a 5V, non serve nessun adattatore di livello, basta collegare le due pull up a 3.3V invece che a 5V, ti rammento che i due pin per l'I2C sono degli open drain come tipologia OUT.

astrobeed:
Se colleghi solo device I2C a 3.3V, cioè sul bus non ci sono device a 5V, non serve nessun adattatore di livello, basta collegare le due pull up a 3.3V invece che a 5V, ti rammento che i due pin per l'I2C sono degli open drain come tipologia OUT.

Ciao astrobeed
Ok, sono d'accordo in questo, ma allora nei ATmega devi disattivare le due resistenze pullup interne che vengono messe in automatico (dalla libreria??).
Questo é possibile? o é automatico quando attivi la I2C? o devi solo modificare la libreria?
Ciao Uwe

Le pull up sugli input non sono attive di default, vanno attivate esplicitamente in questo modo:

pinMode(pin, INPUT); // set pin to input
digitalWrite(pin, HIGH); // turn on pullup resistors

In tutti i casi quando attivi il modo I2C i relativi pin vengono utilizzati in una modalità diversa da tutte le altre viste che devono funzionare in multidrop (più out in parallelo tra loro) e al tempo stesso sono bidirezionali (possono sia ricevere che trasmettere).
Inoltre le pull up integrate dell'ATmega, circa 20k, sono troppo alte come valore per consentire un corretto funzionamento del bus I2C che richiede come minimo una corrente di 1.5 mA, meglio se 3 mA, quando le linee vengono chiuse verso lo 0 logico, lo stato di idle prevede tutte e due le linee a 1 logico.

A parte le due linee di segnale SDA/SCL, che vabbè, resistenza PullUP ecc. ecc.
Ma quello che chiedevo qualche post fa è se l'alimentazione a questi aggeggi i2c devo darla dal pin di arduino +5V o +3.3.
Deduco 3.3 visto che parlano di voltaggi da 1.8 a 3.6.
Gracias!

Ovviamente li devi alimentare a 3.3V, dove prenderli dipende da che modello di Arduino usi e da quanta corrente ti serve.
Se usi la 2009 i 3.3 V sono messi a disposizione dal FTDI e disponi di una manciata di mA, meglio non superare i 20-30 mA, se il device, o la somma della corrente richiesta da tutti i device I2C, è inferiore al limite massimo puoi alimentarli da Arduino, in caso contrario deve usare un regolatore di tensione esterno.
Se usi Arduino UNO non hai problemi perché i 3.3V sono resi disponibili da un regolatore dedicato e disponi di qualche centinaio di mA.