Wire.h e slave spenti

ciao a tutti oggi mi sono messo a fare qualche prova con la Wire.h e la comunicazione tramite i2c fra arduini.
funziona benissimo! sto facendo comunicare 3 arduini: 1 master e 2 slave, carico gli esempi e via di gran gusto :grin:

ad un certo punto però mi sono accorto che se un arduino slave è collegato con i cavi MA spento.. manda in crash tutta la comunicazione e il master crasha (ho un Serial.println("loop") all'inizio della loop() nel master e se uno slave è collegato con gnd, sda, slc MA spento questo print non compare più nel serial monitor).

come fare?

È vietato dal datasheet avere tensioni piú alte di quella di alimentazione sulle entrate (eccetto il pin di Reset). Se non hai alimentazione non puoi avre tensioni sui A4 e A5 attraverso il I2C. Ci sono diodi che proteggono le entrate che conducono in questo caso.
Non c'é soluzione perché é un uso impropio del componente elettronico (ATmega328 del Arduino).
Ciao Uwe

Oltre a quello che ha detto Uwe, hai messo le resistenze previste da i2c?

forse si può usare un transistor per disaccoppiare i pin i2c se il micro è spento. l'1 logico per attivare la comunicazione potresti prenderla dal pin reset per non perdere un pin... ma non ho idea se poi rischi di rendere instabile il reset

lesto:
forse si può usare un transistor per disaccoppiare i pin i2c se il micro è spento. l'1 logico per attivare la comunicazione potresti prenderla dal pin reset per non perdere un pin... ma non ho idea se poi rischi di rendere instabile il reset

Perché non dalla 3V3? Non funzionerebbe? Qual'è la soglia di tensione per attivare il transistor?

dipende dal transistor. il problema è che se resetti il micro, con questo sistema la rete non dovrebbe cadere, invece con i 3,3v (o i 5v direttamente) il transistor rimarrebbe attivo durante la programmazione, e il "breve" reset del micro potrebbe creare problemi. tutto dipende da come è strutturato il micro, e non è detto che i transistor siano abbastanza veloci ad isolare tutto., la mia è solo un idea che POTREBBE FUNZIONARE, poi magari funziona di fortuna, magari funziona perchè matematicamente è stabile, magari non funziona.

E' normale che se un arduino non è alimentato fa cadere la comunicazione su tutto il bus, ci sono passato tempo fa sperimentando con 7 arduino collegati insieme.
La soluzione c'è, basta soltanto un CD4066 per il tuo caso.
Questo mostra come funziona:

Ecco come puoi collegare il tutto:
Master:
5V sul pin 14 del CD4066;
pin A4 sui pin 2 e 4 del CD4066;
pin A5 sui pin 10 e 8 del CD4066;
Slave 1:
5V sui pin 13 e 12 del CD4066.
pin A4 sul pin 1 del CD4066;
pin A5 sul pin 11 del CD4066;
Slave 2:
5V sui pin 5 e 6 del CD4066.
pin A4 sul pin 3 del CD4066;
pin A5 sul pin 9 del CD4066;
I GND tutti insieme.
In questo modo il master alimenta il CD4066 che è composto da 4 interruttori bilaterali; segui lo schema: secondo i collegamenti se accendi lo slave1 i suoi 5V che vanno sui pin 13 e 12 chiuderanno i contatti sui pin 1-2 e 11-10 mettendo in comunicazione i pin A4 e A5 del master e dello slave1; A4 e A5 dello slave2 non daranno fastidio perchè non sono fisicamente collegati nel bus (se non è alimentato lo slave2 non arrivano 5V sui pin 5 e 6 quindi i contatti 3-4 e 8-9 rimangono aperti).
La stessa cosa accade se accendi soltanto lo slave2, quindi lo slave1 se spento non darà fastidio.
Se accendi tutti e due gli slave non hai comunque nessun problema.
A me ha funzionato benissimo questo metodo,comunque se non hai un CD4066 dovrebbe andar bene anche un 74HC125 (ricontrolla i collegamenti però).
Ciao

ciao grazie a tutti per le risposte, e scusate se i commenti che seguono sono un po' banali ma sto facendo queste cose per hobby (è la filosofia di arduino questa, riuscire a fare qualche progetto di elettronica senza avere 5 anni di studi alle spalle no? :blush: ) e questo è uno dei progetti più complessi che sto mettendo a punto!

@uwefed si lo immaginavo che da protocollo non è un funzionamento corretto am cercavo qualche trick nel caso qualcosa dovesse saltare

@flz47655 no ho seguito gli esempi di arduino cookbook e non ci sono le resistenze, penso che ci siano internal pullup resistor attivate da Wire.h (in realtà uso degli arduino leonardo dove ci sono i pin per sda e slc quindi penso siano previste visto che nei vari esempi non sono riportate..)

@lesto ma non è che abbia capito molto bene la cosa.. innanzitutto perdere un pin non è un problema gli slade devono fare cose molto semplici e ho molti pin liberi.. ma non capisco la cosa del reset.. e col transistor cosa si fa in pratica, si mettono l'1 logico (che sono i 5 volt, scusa l'ignoranza..) nell'sda per avere sempre l'ack? non capisco troppo bene..

@pelletta grande! così per curiosità che progetto era con 7 arduini? ho capito lo schema dello switch però c'è qualche problema.. gli slave non sono vicini fra di loro e ho scelto l'i2c proprio perchè ci sono pochi da dover tirare e la cosa è abbastanza modulare, se devo aggiungere moduli slave mi basta allungare i fili del bus e collegare i 2 fili.. con questo sistema dovrei aggiungere due fili (sia sda che slc) per ogni slave che voglio aggiungere.. o ho perso qualche passo? perderei gran parte della modularità.. o sbaglio? ma per usare 7 arduini cosa hai fatto? hai usato uno switch per ogni coppia di slave?

una precisazione: io in realtà sto usando per il bus comune dei pezzi di un cavo (trovato in garage) con 4 fili dentro, 2 per l'i2c e negli altri due ho messo gnd e 5v del master.. non si sa mai.. magari in futuro devo aggiungere un modulo che ha bisogno anche di alimentazione (per ora ogni arduino ha un alimentatore separato.. e hanno tutti gnd comune altrimenti non va nulla).. magari la cosa può aiutare? tipo con la storia del transistor..

mantissa00:
...
@pelletta grande! così per curiosità che progetto era con 7 arduini?

Niente di particolare, ci stavamo annoiando e abbiamo fatto una prova sulla comunicazione tra diversi arduino.

ho capito lo schema dello switch però c'è qualche problema.. gli slave non sono vicini fra di loro e ho scelto l'i2c proprio perchè ci sono pochi da dover tirare e la cosa è abbastanza modulare, se devo aggiungere moduli slave mi basta allungare i fili del bus e collegare i 2 fili.. con questo sistema dovrei aggiungere due fili (sia sda che slc) per ogni slave che voglio aggiungere.. o ho perso qualche passo? perderei gran parte della modularità.. o sbaglio?

Il collegamento I2C non è adatto per coprire grandi distanze, tienilo presente. Non credo puoi andare oltre il metro. Ti conviene comunicare attraverso la seriale se devi coprire distanze più lunghe.
Un pò di tempo fa ricordo che si è parlato di certi integrati per estendere la portata della comunicazione I2C, se ritrovo il topic lo posto.

ma per usare 7 arduini cosa hai fatto? hai usato uno switch per ogni coppia di slave?

Proprio così, bravo... hai capito il meccanismo. Un CD4066 ti permette di collegare al master al massimo 2 slave.

:~
ciao peleltta grazie per la risposta e per il consiglio.
ma che intendi per seriale?
perchè.. se intendi softwareSerial ci vogliono 2 pin (tx e rx) per ogni slave, e questo mi fa perdere la modularità (e comunque avevo provato velocissimamente gli esempi di software serial e non mi ero trovato così bene come con gli esempi di i2c)
se invece intendi il chip rs485 (che se ho capito bene è quello che tutti chiamano bus seriale).. mi richiede dell'hardware aggiuntivo.. i2c c'è già nell'atmega quindi mi è sembrata la soluzione più semplice.. per la distanza.. ho trovato sul forum inglese come abbassare il baud rate per far arrivare il segnale più pulito anche a distanze più lunghe e da quello che ho capito è un po' un trick non proprio bello ma funziona e la velocità per quanto mi riguarda va comunque bene..

il protocollo seriale di arduino (rs232) non permette più apparati, ma le sue evoluzioni (vedi rs422) lo permettono. esistono vari chip rs232<->rs422

bah vabeh in ogni caso c'è bisogno di hardware esterno.. con i2c no..

lesto ma scusa la cosa del transistor?

è la stessa identica cosa del CD4066 :grin:, anzi probabilmente il chip è fatto proprio con dei transistor.
quello che non mi torna, è che se statti uno degli slave quando sta parlando col il master la rete dovrebbe crashare,usando le librerie ufficali, perchè non ci sono i time-out

lesto:
se stacchi uno degli slave quando sta parlando col il master la rete dovrebbe crashare,usando le librerie ufficiali, perché non ci sono i time-out

Secondo me, l'I2C non è adatta in questi casi. Si dovrebbe usare solo per sensori (che difficilmente vengono spenti o staccati) ad una distanza massima di 10 cm; non con un altro Arduino.
In quel caso, e per lunghe distanze, la RS485 è più indicata.

Per approfondire --> Arduino Forum