[Risolto]Migliore I2C o TX-RX ?

Salve a tutti Ecco il mio problema :devo trasmettere dei dati da 2 Atmega 328 ad un Arduino Mega (Master) e vorrei sapere quale tipo di trasmissione seriale si adatta più alle mie esigenze.

Entrambi gli Atmega eseguono letture dei sensori (4 valori analogici per un Atmega ,4 Valori digitali per l'altro ,sono 13 sensori digitali e avevo pensato di trasmettere tutto in binario perché devo sapere quale è il sensore che ha ricevuto il segnale)

Alla richiesta del master gli slave devono trasmettere il segnale e possono anche ricominciare le letture da capo, ma cosa accade se sono nel mezzo di una lettura e il master chiede i dati ?

Visto che i 13 sensori cambiano abbastanza velocemente e vengono letti dal master molto di frequente (ogni loop), preferirei avere una comunicazione sufficientemente rapida.

Ho letto che lI2C è una trasmissione sincrona mentre la seriale TX-RX è asincrona , con l'I2C ho sicuramente meno cavi e impicci vari ma ho letto che è più lenta della TX-RX a trasmettere.

l'Arduino Mega ha 3 porte seriali oltre a quella che usa per essere programmato, ma gli ATmega ? dovrei usare la Software serial ?.

Ultima cosa, il mio professore dice che l'I2C si impalla (non so se sia vero) e che la seriale sia meglio
per questo motivo, parlava anche di un buffer che ha la seriale TX-RX.

Comunque scusate la quantità ingente di domande ma ho bisogno di chiarimenti, mi va bene anche se mi passate qualche pagina web che esalta le differenze tra questi due tipi di comunicazione

Grazie a tutti per la cortesia.

Effettivamente tu di che frequenza di lettura hai bisogno? Il sensore puo aggiornarsi anche 200 volte al secondo ma se a te bastano 5 letture al secondo la necessità di comunicazione cambiano notevolmente.

I2C ti da il vantaggio di avere un solo bus, la UART d'altro canto ti permette di ricevere e trasmettere allo stesso tempo, anche se questo non sembra necessario per il tuo progetto.

Per la velocità, l'I2C presenta una capacità massima in modalità fast di 400bit/s, l'UART ha una capacità notevolmente superiore.

Tutto dipende dalle tue necessità, cerca di spiegarci bene cosa ti serve, che sensori usi, a che scopo, ecc

Per la questione letture sensori e chiamate master; una volta ricevuta la richiesta dal master lo slave aspetta che i dati siano pronti e li invia, dovrai implementare un sistema di timeout sul master. Oppure tieni in memoria sempre l'ultima lettura completata e in caso la lettura attuale non sia pronta invii quella precedente.

Grazie mille per la risposta

Io uso per i 13 sensori digitali dei Vishay 4840 (http://www.farnell.com/datasheets/1734665.pdf) ai quali appiattisco l'uscita con un condensatore per leggerli in digitale, eseguo 250 letture di ogni sensore per poi scegliere il sensore che ha avuto piu letture Alte.

Per i 4 sensori analogici uso gli MB1010 LV-MaxSonar-EZ1 che hanno una frequenza di lettura di 20Hz (http://www.maxbotix.com/documents/MB1010_Datasheet.pdf)
Ho letto che poi è consigliato far leggere i sensori di distanza uno per volta anziche tutti contemporaneamente quindi la frequenza di lettura cala a 5Hz.

Sapendo ciò vale ancora la pena usare la UART ?

Un'altra cosa, l'I2C in modalità fast che resistenza di pull-up doveva avere ?

Per la parte dei sensori digitali quanti dati devi passare quindi dall'ATmega328 al Mega? Solo un dato al secondo che indica quale sensore ha ricevuto la lettura più alta?

In ogni caso 400khz mi sembrano piu che sufficienti per passare le letture dei sensori, sarebbe opportuno passare il dato gia elaborato al Mega cosi da avere un minor consumo di capacità del bus (Questo vale per i sensori digitali, i quali non ho capito bene come vuoi usarli)
e anche per distribuire il carico di elaborazione sulle 3 CPU.

La scelta del bus I2C ti permette inoltre di espandere il progetto con un altro AVR/sensore I2C se fosse necessario in futuro senza grandi modifiche.

Se invece noti che 400khz non sono sufficienti potresti optare per il SPI che è notevolmente più veloce, se pur mantenga la possibilità di collegare più dispositivi insieme, però cosi ritorniamo al discorso fatto per l'UART.

Le resistenze di pull-up si calcolano cosi (Vcc - 0,4V) / 3mA questo vale per tutte le velocità, bisogna però tener conto della capacità del bus, che a 400khz è più limitata, ma non credo che nel tuo caso sia un problema.

L'altra domanda è: a che distanze devi spedire i dati? L'I2C gira bene per integrati vicini, max una decina di cm. Con la seriale puoi andare un pochino più in là. Se poi la espandi sul bus RS485, arrivi a 1200 mt.

Anche l'I2C è allungabile con appositi expander. Ma non fanno miracoli.

PaoloP:
Ma non fanno miracoli.

Motivo per cui non l'ho consigliato, difatti :wink:

Una cosa è consigliarne l'uso. Un altra e dire che esistono. Poi sarà lui a decidere.

Le distanze tra gli integrati sono molto piccole, per farvi capire vi sto scrivendo per migliorare questo Robot (https://www.youtube.com/watch?v=grr9CvFmHWk&list=UUtOH8bqtvtktR-CmCK32eng)
con cui ho anche partecipato alla Robocup jr in Austria.

Questa era la vecchia edizione da rifare, che aveva tutto su un unico processore ed infatti potete ben vedere come il programma sia lento a rispondere.
(Per non parlare delle ruote che ormai abbiamo rimpiazzato con altre stampate 3D).

Quest'anno sono riuscito a farmi sponsorizzare dalla Robot Domestici e dalla MD srl, quindi posso farmi fare stampati da loro gratis.

Mi rimaneva solo il dubbio di come far comunicare gli integrati tra loro

Per la parte dei sensori digitali quanti dati devi passare quindi dall'ATmega328 al Mega? Solo un dato al secondo che indica quale sensore ha ricevuto la lettura più alta?

Si mando solo un dato che indica il sensore, le 250 letture e la scelta del sensore la fa lo slave.

Vorrei sapere altre differenze, il mio professore mi ha sconsigliato lI2C perchè afferma che si impalla, vorrei saperne di più, come mai si dovrebbe impallare? lui non è andato molto sullo specifico.

Si impalla perché la libreria ha all'interno un ciclo while senza timeout. Se i cavi si disconnettono o si perde comunque la comunicazione l'esecuzione si ferma in quel punto finché non interviene il watchdog, se programmato; altrimenti amen...

PaoloP:
Si impalla perché la libreria ha all'interno un ciclo while senza timeout. Se i cavi si disconnettono o si perde comunque la comunicazione l'esecuzione si ferma in quel punto finché non interviene il watchdog, se programmato; altrimenti amen...

Questo vale per la libreria standard di Arduino, basta fare una piccola modifica per ovviare al problema, in ogni caso dovrebbe essere un caso limite che si stacchi un componente, quindi anche se presenta questo limite nella stragrande maggior parte dei casi è trascurabile.

Grazie mille a tutti per le risposte ho deciso che monterò entrambi i protocolli (tanto 2 piste in più non mi danno fastidio) e li proverò entrambi , se con l I2C non noto differenze di rapidità allora lascio quello.

Metto risolto

Il I2C é un interfaccia a BUS che vuol dire che piú device possono essere attacati e funzionare. C'é un master che gestisce la comunicazione dando il clock e facendo richieste di dati ai device attacati. Ogni device (Slave) ha un suo numero che deve essere trasmesso ad ogni trasmissone/richiesta di dati. È sincona che vuol dire che hai un clock che definisce quando i stati logici dei dati sono validi. La distanza massima del bus é ca 2m ma dipende tanto dal cavo (capacitá del collegamento) e numero di slave attacati. Ci sono integrati che aumentano la distanza massima. la velocitá del bus é standard 100k, 400k e 1,2MHz. Arduino usa normalmente 400kHz.

La seriale é un collegamento punto a punto (tra 2 device). Ha un cavo per la trasmissione e uno per ricevere. Arduino ha un Circuito Hardvare che gestisce l'interfaccia e che ha un buffer per memorizzare temporaneamente un certo numero di dati prima che devi leggerli. Arduino Mega ha 4 interaccia (di cui una occupato per collegamento USB) Arduino UNO ne ha 1 occupato per USB. Arduino Leonardo e Arduino MICRO ha 2 di cui una per USB e una libera. Si puó emulare anche una seriale via Software ma non é cosí veloce come quelle hardware. questo interfaccia é asinchrona che vuol dire che non c'e´uno clock ma solo i dati sul collegamento dati. Ogni Byte trasmesso ha un segnale di start e di stop.
La trasmissione dei dati puó essere programmato in modo che i slave trasmettono quando vogliono o in modo che rispondono alle richieste del Arduino MEGA. La distanza massima sará su qualche centinaio di metri. Con un adattatore RS232 la distanza é ca 300m. Con RS485/S422 la distanza e´ca 1,2km.

In tutti i casi la distanza massima dipende dalla velocitá di trasmissione dei dati (BAUDrate). Piú alto é meno distanza copre l'interfaccia.

Ritonando alla domanda:
Migliore I2C o TX-RX ?

Dipende. Ogni interfaccia ha i suoi vantaggi e svantaggi.

Ciao Uwe