Si desidera utilizzare USB per le comunicazioni con il computer. Se si dispone di un numero di microcontrollori, probabilmente si collegherà solo uno dei microcontrollori direttamente al computer. Gli altri microcontrollori dovranno ottenere i loro comandi dal microcontrollore principale.
La comunicazione scelta dipenderà da una serie di fattori:
- larghezza di banda richiesta (supponiamo che tu li stia eseguendo a 16 MHz)
- complessità (cablaggio e codifica)
- bidirezionale o master-slave
Quasi tutte le opzioni hanno il supporto integrato sul microcontrollore AVR. Non esiste alcuna opzione che potresti ragionevolmente preferire rispetto alle opzioni integrate che richiederebbero hardware aggiuntivo. Poiché hanno il supporto integrato, la complessità del software è simile, in quanto basta configurare la porta (usando i registri), mettere i dati per trasmettere in un altro registro, quindi innescare la trasmissione impostando un bit in un altro registro. Tutti i dati ricevuti vengono trovati in un altro registro e viene attivato un interrupt in modo da poterli gestire. Qualunque opzione scegliate, l'unica differenza è la modifica delle posizioni dei registri e alcune modifiche ai registri di configurazione.
Un loop USART ha le seguenti caratteristiche:
- Baud rate massimo di CLK / 16 = 1MHz (con clock a 16MHz) che è una velocità di trasferimento di circa 90KB / s
- comunicazioni completamente bidirezionali (nessuna designazione master o slave)
- richiede fili separati tra ciascuna coppia di microcontrollori: Atmega32u4 supporta due porte USART in modo nativo, limitando il numero di microcontrollori che è possibile collegare in una rete in pratica (oppure si finisce con una lunga serie di microcontrollori - ovvero collegati in un elenco collegato maniera)
Nota: questo è anche ciò che useresti per ottenere la comunicazione RS232, tranne per il fatto che RS232 richiede 10 V, richiede un driver per ottenere quei livelli di tensione. Per la comunicazione tra microcontrollori, questo non è utile (vengono modificati solo i livelli di tensione).
RS485:
- In sostanza, si utilizza la porta USART in una modalità diversa: non vi è alcun vantaggio in termini di larghezza di banda e può solo semplificare leggermente il cablaggio, ma anche complicarlo. Questo non è raccomandato
Interfaccia a due fili:
Questo è anche indicato come I2C. Ciò significa che tutti i dispositivi condividono gli stessi due fili.
È necessaria una resistenza di pull-up su entrambi i fili
È lento (poiché i resistori di pull-up hanno un valore limitato e vi è una capacità crescente all'aumentare del numero di dispositivi e alla lunghezza del filo). Per questo microcontrollore AVR, la velocità è fino a 400 kHz - più lenta di USART (ma questa velocità dipende dalla limitazione della capacità). Il motivo è che sebbene un dispositivo spinga il filo dati in basso, la transizione opposta si ottiene lasciando il filo fluttuare nuovamente in alto (la resistenza di pull-up).
È ancora più lento se si considera che TUTTE le comunicazioni condividono la stessa larghezza di banda limitata. Poiché tutte le comunicazioni condividono la stessa larghezza di banda limitata, potrebbero esserci ritardi nella comunicazione in cui i dati devono attendere fino a quando la rete non è inattiva prima di poter essere inviata. Se altri dati vengono costantemente inviati, è possibile che i dati non vengano mai inviati.
Si basa su un protocollo master-slave, in cui un master si rivolge a uno slave, quindi invia un comando / richiesta e lo slave risponde in seguito. Solo un dispositivo può comunicare alla volta, quindi lo slave deve attendere il completamento del master.
Qualsiasi dispositivo può agire sia come master che / o come slave, rendendolo abbastanza flessibile.
SPI
Questo è ciò che consiglierei / utilizzerei per la comunicazione generale tra i microcontrollori.
È ad alta velocità - fino a CLK / 2 = 8 MHz (per CLK a 16 MHz), rendendolo il metodo più veloce. Ciò è possibile grazie al suo filo separato esclusivamente per l'orologio.
I fili MOSI, MISO e clock SCK sono condivisi su tutta la rete, il che significa che ha un cablaggio più semplice.
È un formato master-slave, ma qualsiasi dispositivo può essere un master e / o uno slave. Tuttavia, a causa delle complicazioni della selezione dello slave, per il cablaggio condiviso (all'interno della rete), è necessario utilizzarlo solo in modo gerarchico (a differenza dell'interfaccia a due fili). IE. se organizzi tutti i dispositivi in un albero, un dispositivo dovrebbe essere solo padrone dei suoi figli e solo uno schiavo del suo genitore. Ciò significa che in modalità slave, un dispositivo avrà sempre lo stesso master. Inoltre, per farlo correttamente, è necessario aggiungere resistori a MISO / MOSI / SCK al master upstream, in modo che se il dispositivo sta comunicando a valle (quando non è selezionato come slave), le comunicazioni non influenzeranno le comunicazioni in altre parti di la rete (notare che il numero di livelli che è possibile eseguire utilizzando resistori è limitato, vedere di seguito per una soluzione migliore utilizzando entrambe le porte SPI).
Il microcontrollore AVR può automaticamente tri-state il segnale MOSI quando è selezionato slave e passare alla modalità slave (se nel master).
Anche se potrebbe richiedere una rete gerarchica, la maggior parte delle reti può essere organizzata in modo ad albero, quindi di solito non è una limitazione importante
Quanto sopra può essere leggermente rilassato, poiché ciascun microcontrollore AVR supporta due porte SPI separate, quindi ogni dispositivo può avere posizioni diverse in due reti diverse.
Detto questo, se hai bisogno di molti livelli nel tuo albero / gerarchia (più di 2), la soluzione sopra usando i resistori diventa troppo complicata per funzionare. In questo caso, è necessario modificare la rete SPI tra ciascun livello dell'albero. Ciò significa che ogni dispositivo si connetterà ai propri figli su una rete SPI e ai suoi genitori sull'altra rete SPI. Sebbene significhi che hai solo un singolo albero di connessioni, il vantaggio è che un dispositivo può comunicare sia con uno dei suoi figli che con il suo genitore allo stesso tempo e non hai resistori complicati (sempre difficile scegliere i giusti valori) .
Poiché ha fili MOSI e MISO separati, sia il master che lo slave possono comunicare contemporaneamente, dando un potenziale fattore di due aumenti di velocità. È necessario un pin aggiuntivo per la selezione slave per ogni slave aggiuntivo, ma questo non è un grosso carico, anche 10 diversi slave richiedono solo 10 pin extra, che possono essere facilmente alloggiati su un tipico microcontrollore AVR.
CAN non è supportato dal microcontrollore AVR specificato. Dato che ci sono altre buone opzioni, probabilmente non è comunque importante in questo caso.
La raccomandazione è SPI , perché è veloce, il cablaggio non è troppo complesso e non richiede resistenze pull-up complicate. Nel raro caso in cui SPI non soddisfi pienamente le tue esigenze (probabilmente in reti più complicate), puoi utilizzare più opzioni (ad es. Utilizzare entrambe le porte SPI, insieme all'interfaccia a due fili, nonché accoppiare alcuni dei microcontrollori usando un loop USART!)
Nel tuo caso, l'utilizzo di SPI significa che, naturalmente, il microcontrollore con la connessione USB al computer può essere il master e può semplicemente inoltrare i comandi pertinenti dal computer a ciascun dispositivo slave. Può anche leggere gli aggiornamenti / misurazioni da ogni slave e inviarli al computer.
A 8 MHz e 0,5 m di lunghezza del filo, non credo che diventerà un problema. In tal caso, provare a prestare maggiore attenzione alla capacità (tenere troppo vicini i fili di terra e del segnale e prestare attenzione anche ai collegamenti tra conduttori diversi), nonché alla terminazione del segnale. Nel caso improbabile che rimanga un problema, è possibile ridurre la frequenza di clock, ma non credo sia necessario.