Salve ragazzi, il mio setup attuale è composto da un arduino 2009 più 6 atmega standalone collegati tramite protocollo i2c, la domanda è semplice ma la risposta no.... In pratica l'arduino 2009 che fa da master sta collegato al pc e dovrà comunicare via seriale con un'applicazioncina scritta in processing e si occuperà soltanto di trasmettere al pc delle variabili. Gli altri standalone sono configurati come slave e dovranno comunicare in qualche modo con il master sempre sotto protocollo i2c. Sugli standalone c'è collegato di tutto, sensori, relè, display ecc e dovranno ricevere istruzioni dal master e fin qui tutto ok, ma dovranno anche trasmettere al master delle variabili come ad esempio i dati restituiti dai sensori. Siccome i dati da inviare sono diversi (integer, float, char) e di diversa lunghezza non credo sia opportuno usare la funzione wire.onRequest e wire.requestFrom ho pertanto provato ad usare le funzioni wire.onReceive anche sul master visto che in rete si dice che il protocollo I2C supporta anche il multimaster ma risultato fin'ora zero...
Ho fatto soltanto delle prove e magari non è proprio possibile farlo comunque ogni arduino ha un proprio indirizzo (anche il master) e gli slave inviano tutti dei byte con il comando wire.send all'indirizzo del master. Tutti gli arduino si vedono in rete, per verificarlo ho caricato su un altro arduino lo sketch i2c_scanner e mi trova tutti gli indirizzi.
Ricapitolando ho 6 arduino standalone che devono inviare delle variabili di tipo e lunghezza differente ad un 2009 sotto protocollo i2c, qual'è secondo voi l'istruzione migliore? Occorre per forza usare wire.requestFrom sul master per ottenere informazioni dagli slave?
Intanto continuo a provare e se dovessi trovare una soluzione la posto casomai servisse a qualcuno; scusate per il post lungo.
Sto cercando di capire meglio il bus I2C che ultimamente mi sta dando parecchie noie, ad esempio non riuscendo a fare il multimaster solo per gestire l'rtc mi fa diventare pazzo: il ds1307 è fisicamente collegato sul pcb di uno slave e per poterlo usare mi tocca interrogarlo dal master, convertire i dati restituiti da integer in char, inviarli allo slave e riconvertirli in int.... è assurda sta cosa.... In rete la documentazione per la libreria wire lascia molto a desiderare, avete qualche buon link dove ci sono più informazioni? Un'altra cosa, ho diversi slave collegati ma il progetto prevede che non tutti gli slave siano sempre alimentati, e possibile che se anche solo uno slave è spento mi si interrompe tutta la comunicazione I2C o sto sbagliando qualcosa? I collegamenti li ho fatti bene, le rsesistenze sui pin 4 e 5 le ho messe e quando tutti gli slave sono accesi la comunicazione funziona benissimo. Come prova per rimediare proverò ad abilitare la connessione I2C usando dei 4066 in modo da abilitare i fili soltanto quando gli slave sono alimentati, non sapete che sconforto....
La prossima volta impari!!! e ti limiti ad accendere solo dei led colorati con tanta soddisfazione
Avrei potuto imparare tutto sin dalla prima volta ma se avessi avuto uno straccio di documentazione decente (non una riga per funzione che non spiega nulla e senza esempi basilari) sarebbe stato molto migliore. I2C è un protocollo multimaster, sulla guida non se ne parla affatto e credo nemmeno sia implementato in arduino, non è per fare una critica ma penalizza molto. La memoria di arduino non è illimitata, se per far comunicare tutte le schede bisogna fare conversioni, passaggi, giri assurdi (da me si dice la strada dell'orto) sfido a fare ciò che si dice "si possono collegare più di 100 arduino in rete" se poi per farli comunicare puoi farlo solo passando attraverso il primo.... Quanta memoria deve avere il master se da solo deve pensare a gestire tutta la comunicazione? Sarebbe come se in un condominio per sapere l'ora dal vicino di porta devi rivolgerti all'amministratore sull'attico, il quale scende, lo domanda al tuo vicino e poi te lo dice. Anche il fatto che se una scheda collegata sul bus I2C sta spenta fa interrompere la comunicazione di tutto il resto non l'ho trovato scritto da nessuna parte....
La prossima volta impari!!!
Certo imparo a forza di provare e fare tentativi e soprattutto ti accorgi di certi limiti solo quando hai finito di cablare tutto e testi ciò che hai fatto ma trovato l'errore è già troppo tardi, tocca sfasciare tutto e ricominciare.
Non è un bel modo di lavorare.
Sono sicuro che il buon Banzi appena torna dai caraibi ti rassicurerà.
Nel frattempo mandagli un PM..oppure agli admin stranieri, credoc heuna cosa del genere interessi pure loro.
Ciao