Come collegare insieme più di una porta seriale arduino
L'idea è di connettere più di 1 arduino slave al master come mostrato in schamatic

simula questo circuito - Schema creato usando CircuitLab Il problema è che lo slave TX non può semplicemente combinarsi con il master RX. È necessario eseguire alcuni trucchi come il buffer a tre stati per rendere lo slave TX uno alla volta. Ad ogni modo, la porta avr può essere configurata come buffer tristate. (Q1) Esiste una soluzione software per farlo? Secondo Se collego TX a RX per la comunicazione half-duplex (utilizzando 1 linea dati). Come fare in modo che Rx smetta di ascoltare se stesso durante la trasmissione dei dati?
Risposte
Puoi farlo con due diodi e un resistore:

simula questo circuito : schema creato utilizzando CircuitLab
Dovrai comunque implementare un sistema per prevenire le collisioni, ma elettricamente sarà valido.
Affinché questo schema funzioni, devi assicurarti che al massimo uno slave guidi il suo TX in un dato momento. Dovrai escogitare un protocollo in base al quale il master si rivolge a uno slave, e quindi solo quello slave risponde. Il problema è:
- entrambi gli slave devono avere le porte seriali attivate per poter notare quando vengono indirizzati dal master
- una porta seriale attiva mantiene il suo pin TX in uno stato di bassa impedenza, guidandolo attivamente ALTO quando non trasmette dati.
Il modo migliore per uscire da questo dilemma è modificare l'hardware, secondo la risposta di Majenko. Se, per qualsiasi motivo, non puoi fare quella modifica, potrebbe esserci una soluzione solo software, ma solo se l'hardware sottostante ti consente di spegnere i trasmettitori seriali degli slave, mantenendo attivi i ricevitori seriali.
L'API di Arduino non consente di mantenere attivo il trasmettitore seriale mentre il ricevitore è disabilitato: le funzioni Serial.begin()
e Serial.end()
controllano il trasmettitore e il ricevitore nel loro insieme. Potresti essere in grado di farlo accedendo all'hardware a un livello inferiore. Non hai specificato che tipo di Arduino stai usando. Supponendo che tu abbia qualcosa di simile a uno Uno, puoi disabilitare il trasmettitore con:
UCSR0B &= ~_BV(TXEN0);
e abilitalo di nuovo con:
UCSR0B |= _BV(TXEN0);
Se vuoi utilizzare l'API di Arduino per la comunicazione seriale, dovrai disabilitare il trasmettitore subito dopo Serial.begin()
:
const uint8_t TX_PIN = 1;
void setup() {
pinMode(TX_PIN, INPUT_PULLUP); // valid when transmitter is off
Serial.begin(9600); // enable serial port
UCSR0B &= ~_BV(TXEN0); // disable transmitter
}
Ma fai attenzione che poi verrà abilitato per un certo tempo (non più di pochi microsecondi), subito prima di disabilitarlo. Ciò potrebbe causare un cortocircuito se uno slave si avvia mentre l'altro sta trasmettendo dati.
Un problema con questo tipo di soluzione solo software è che i bug si verificano e con il tuo circuito, un bug nella gestione del protocollo può bruciare il tuo hardware. Se riesci ad aggiungere almeno alcuni resistori protettivi, come nella risposta di Gabriel Staples, questo dovrebbe tenerti al sicuro.
È possibile utilizzare un interruttore a doppia via unipolare. un semplice interruttore che può cambiare le linee tra più slave.
Limitazione: il salva non sarà in grado di creare una richiesta a meno che il master non abbia selezionato le linee corrispondenti. Il master deve richiedere attivamente i dati o inviare comandi agli slave. Gli slave potrebbero non essere in grado di avviare la comunicazione (se non selezionati)
