MCP23017 con resistenze sul bus

Buona sera a tutti, sto creando un circuito con arduino nel quale come da titolo ho integrato l'MCP23017.
Ora i vari esperimenti che sto svolgendo stanno dando piano piano, ma molto piano :blush:, i loro frutti, però volevo capire una cosa in merito a questo integrato, in alcuni siti sul bus I2C vengono messe due resistenze da 4,7K, su altri non compaiono. Io ho eseguito prove con entrambe le configurazioni e sinceramente problemi non ne ho avuti né con le resistenze né senza, mi piacerebbe capire le varie opinioni in merito all'utilizzo o meno delle suddette, inoltre per chi consiglia di metterle capire il loro perché!

Grazie

Meluino

Le uscite degli integrati che vengono collegate al bus hanno come circuito di uscita solo un transistore Open Collector o Open Drain. Possono per questo portare la linea solo a massa (LOW). Per avere un segnale positivo (HIGH) si usano delle resistenze collegate a +5V.
A seconda della lunghezza dei cavi (capacitá) e numero di dispositivi collegati serve una corrente piú o meno grande per portare il segnale in tempo utile a HIGH.

Nelle immagini sotto vedi che la tensione ritorna lentamente su. Sulla sinistra in modo accettabile e sulla destra non ritornadel tutto e percui il dispositivi potrebbero non rilevarlo o solo qualche volta rilevarlo come HIGH.


sinistra pullup interno e 4,7kOhm esterno; destra solo pullup interno.

La libreria Wire attiva le resistenze pullup di quei pin. Quelli sono tra 20k e 50 kOhm. Per 1 integrato collegato a breve distanza (parliamo di cm) dal Arduino bastano ma a distanze piú grandi (sopra 10-20cm) servono resistenze con valore piú piccoli.

Nel Tuo caso il bus funziona giá con le resistenze pullup interne. Aggiungendo le resistenze migliori la sicureza di funzionamento del I2C.

Ciao Uwe

Grazie UWE per la risposta, chiare ed esaustiva.
Per cui dal ragionamento posso dire che durante le varie prove, quando arduino e l'integrato sono a pochi cm di distanza posso anche permettermi di non metterle, ma in linea comunque generale è sempre meglio averle.

Meluino

sí

Scusate se mi intrometto, e scusate la mia ignoranza in elettronica.
Stò cercando di realizzare un progetto con 3 integrati MCP23017 che devono essere collegati a diverse distanze. Ho realizzato il circuito testando un solo integrato.
In principio ho collegato l'integrato a breve distanza senza utilizzare le resitenze. Il sistema funzionava.
Ho provato poi, tramite cavo di rete ad allungare le distanze. Nel cavo di rete utilizzo 4 cavi, alimentazione, gnd, e le due uscite analogiche A4 e A5.
Come prima prova ho messo un caso di rete lungo circa 2 metri. Il circuito non funzionava. Allora come da articolo ho inserito lato integrato le 2 resistenze da 4K7, ed il circuito funzionava alla grande.

Infine ho allungato ulteriormente i cavi, utilizzando un cavo di rete di 15metri. L'integrato a questo punto non funziona più nemmeno con le 2 resistenze.

Come posso fare? Posso provare ad utilizzare resistenze più piccole? oppure posso utilizzare un secondo alimentatore?
Cosa mi consigliate di fare?

L'I2C non è fatto per coprire distanze così lunghe, è nato per lavorare sull'ordine dei cm, non dei metri.
Prova usando un I2C bus extender, tipo il P82B715: dovresti arrivare sui 50 metri.

morriluca:
Infine ho allungato ulteriormente i cavi, utilizzando un cavo di rete di 15metri. L'integrato a questo punto non funziona più nemmeno con le 2 resistenze.

E cosa ti aspettavi ? ? ? :o :o :o

Il bus I2C NON è fatto per raggiungere distanze di METRI, è fatto per collegamenti a distanze di cm. Se hai bisogno di maggiori distanze puoi provare ad utilizzare dei i2C bus externder tipo il P82B715 ed anche in quel caso ... attenzione che ci sono dei limiti (vd. capacità del cavo).

Guglielmo

*@Leo ... hahahahaha telepatia sincronizzata ... pure lo stesso chip gli abbiamo consigliato * :smiley: :smiley: :smiley:

Grazie tante per le risposte.
Come già detto sono abbastanza ingnorante in elettronica.

Se ho capito questo i2C bus externder va collegato come riportato in questa immagine. (Parte superiore)

Ovvero lo collego vicino ad arduino, poi facciamo partire il cavo lungo ed all'altra estremità, rimetto un altro inegrato i2c e infine ci collego il mio integrato MCP23017. Giusto?

Sì, un chip ad inizio ed uno a fine. Occhio che tu però hai anche altri dispositivi su quella linea, ti servirebbe un chip per ogni utenza agganciata.

Perfetto, grazie tante. Avento 3 MCP23017 dovrei rimediare 4 i2C bus externder.
Vedo dove posso comprare P82B715, perchè ho visto che non è facile da trovare ed ha dei costi molto elevati.

Quando ho fatto tuttu vi faccio sapere.

Anche il P82B715 non copre in modo sicuro i 15m. Dipende tanto dai cavi utilizzati.
Ciao Uwe

Provo con l'utilizzo dei cavi di rete Cablati.

gpb01:
attenzione che ci sono dei limiti (vd. capacità del cavo).

Mi sono arrivati i cip. Gli ho montati e funzionano alla grande.
Le connessioni fra i vari integrati P82B715 le ho testate con cavo di rete cablato di categoria 5.

Se a qualcuno può interessare La lunghezza massima da me testata è di 40 metri.
Per il montaggio dei cip ho utilizzato questo schema Link Schema.

Grazie a tutti per i suggerimenti

Un'ultima informazione.
Se volessi alimentate il nuovo circuito composto dai CIP MCP23017 e P82B715 senza utilizzare i 5v e gnd di arduino, potrei alimentarli con un alimentatore esterno? Io per caso mi trovo ad avere un Alimentatore da 5V/1.2A. Se lo aggancio direttamente posso fare qualche danno ai CIP?

NO, non puoi, almeno il GND deve essere comune con tutto ... altrimenti ... che valore di "riferimento" sarebbe ? ? ? :o

E comunque occhio ad avere due alimentazioni separate ... che sui suoi pin in ingresso, l'ATMega accetta al massimo VCC +0.5V :roll_eyes:

Guglielmo

Ok, con la massa in comune, come mostrato nel seguente schema
Schema
invece di collecarci il secondo arduino, ci collego il cip P82B715.

Il mio quesito è che alimentatore dovrei avere per alimentare il secondo circuito?

Visto che in arduino viene utilizzato il pin die 5v, pensavo che per alimentare il tutto bastasse un alimentatore da 5v collegando la massa in comune.
Avendone uno in casa da 5v/1,3A pensavo fosse ok.

Se separi le due alimentazioni, mettendo le masse in comune, DEVI verificare che i segnali che arrivano ad Arduino, quando sono a livello HIGH, NON superino MAI il Vcc + 0.5V dove Vcc è il valore dell'alimentazione di Arduino.

Scusa, ma a questo punto ... ma non ti conviene usare un UNICO alimentatore per tutto ?
Se sei CERTO che è un alimentatore stabilizzato a 5V ... entri con i 5v sul pin 5V di Arduino (... occhio perché se superi i 6V distruggi l'ATmega) e da li alimenti Arduino, contemporaneamente li mandi sul cavo con i repeater ed alimenti puri quelli :wink:

Guglielmo

Il problema è che io ho collegato i cavi a parecchia disatanza (30mt), sul cip secondario demo mettere un buzz collegato al cip MCP23017, e se uso l'alimetazione di arduino, che passa attraverso i 30mt di cavo il buz suona pianissimo.
Allora ho pensato di alimentare il secondo circuito con un alimentatore di supporto per risolvere il problema.

Posto lo schema che avevo pensato

Ti ho spiegato qui sopra tutto quello che c'è da verificare ... a te quindi controllare cosa da l'alimentatore ed accertarti che sia adatto.

Guglielmo