3 porte seriali in una con un multiplexer.

Ciao a tutti!

Vorrei trovare un modo efficace per permettere ad Arduino, e cioè all'ATMega328 (lo uso in modalità standalone) di comunicare attraverso 3 o più porte seriali con vari moduli, ciascuno dei quali riceve ed invia dati.
Ho avuto un sacco di problemi con SoftwareSerial, so che permette di ascoltare una porta alla volta e so anche che bisogna usare listen() e svariati while e if...il risultato finale non mi è piaciuto (è impreciso e poco affidabile e a livello software si complica un bel pò) e quindi ho deciso di risolvere la questione a livello hardware.
Prima che me lo suggerite :stuck_out_tongue: ..non voglio usare un Arduino Mega, come ho già detto ho solo un ATMega328 standalone con il bootloader di Arduino.

Non volendo usare SoftwareSerial, posso utilizzare 2 multiplexer comandati da alcuni pin digitali, uno per il canale RX ed uno per il canale TX? Riuscirebbero a stare dietro alla velocità di trasmissione dei dati?
In questo modo sfrutto per tutti i moduli solo la porta seriale hardware (pin 0 e 1)!
Se è fattibile....quale integrato mi consigliate?

Fatemi sapere, se conoscete altre soluzioni ditemi pure 8)

Ciao!!!

Potresti optare per una conversione da seriale RS232 a RS485 che supporta più slave.
Hai bisogno solamente di 2 o più convertitori, uno per l'arduino e uno per ciascun modulo.
Ad esempio:
--> http://www.robot-italy.com/it/sn75176bd-differential-bus-transceiver.html
Poi devi scrivere anche il protocollo di trasmissione.
--> Tinkering with Electronics...: Arduino and RS485 (ENGLISH VERSION)

Se hai l'Atmega in standalone non è necessario il bootloader. Potresti farne a meno. --> http://www.michelemenniti.it/VHD/Elettronica/GPAT_v4.pdf

C'è anche un'altra discussione sull'argomento
--> http://arduino.cc/forum/index.php/topic,146069.0.html

Grazie mille per il tuo intervento :slight_smile:
A dire il vero non conoscevo questo tipo di comunicazione, Master e Slave. Ho letto un pò di cose e mi sembrerebbe una cosa fattibile, ma mi servirà un pò per capire bene come agire!
Nel frattempo, che ne dici invece della mia idea? Ti sembra fattibile?

EDIT:
Ora che ci penso....forse mi sono spiegato male, o almeno in maniera incompleta: i moduli con cui deve parlare l'ATmega328 non sono altri microcontrollori, ma moduli GPS, GSM e sensori vari. Questi ricevono ed inviano sulla seriale i dati, e non possono essere istruiti ad un nuovo protocollo di trasmissione!

zeroG:
posso utilizzare 2 multiplexer comandati da alcuni pin digitali, uno per il canale RX ed uno per il canale TX? Riuscirebbero a stare dietro alla velocità di trasmissione dei dati?

Quello che vuoi fare è fattibile solo se devi parlare/ricevere con un dispositivo per volta, ovvero sei tu a decidere con quale device parlare e tutti gli altri non devono inviare informazioni nel frattempo altrimenti vanno perse.

Ciao Astrobeed e grazie per l'intervento.
Si, devo interrogare i moduli uno per volta, e non c'è nessun rischio che le informazioni vadano perse.
Credo proprio che farò un tentativo con questo cosino qui Intelligent Power and Sensing Technologies | onsemi
E' un multiplexer doppio che gestisce 4 input e 4 output: potrebbe andare?

Potresti usare un PCF8574 che è un port expander 8 bit pilotato in I2C,da ogni bit di uscita comandi il pilota di due buffer tri-state (74HC125)e rispettando il senso di comunicazione dei dati ottieni 8 seriali.
E' una possibile soluzione buttata giù alla veloce,se potrebbe tornarti utile fammi sapere e provo a spiegarti meglio.
Ciao.

tonid:
Potresti usare un PCF8574 che è un port expander 8 bit pilotato in I2C,da ogni bit di uscita comandi il pilota di due buffer tri-state (74HC125)e rispettando il senso di comunicazione dei dati ottieni 8 seriali.

No, il PCF8574 è un " 8-bit quasi-bidirectional port and an I2C-bus interface", non hai un collegamento diretto tra una coppia di pin, come servirebbe, semplicemente puoi leggere, o settare lo stato out, degli otto bit tramite comandi I2C, è pensato per aumentare il numero di GPIO generici non per i bus di comunicazione, la soluzione è usare i CD4066, o similari.

No, il PCF8574 è un " 8-bit quasi-bidirectional port and an I2C-bus interface", non hai un collegamento diretto tra una coppia di pin, come servirebbe, semplicemente puoi leggere, o settare lo stato out, degli otto bit tramite comandi I2C, è pensato per aumentare il numero di GPIO generici non per i bus di comunicazione, la soluzione è usare i CD4066, o similari.

Si astro,l'idea era quella di utilizzare il PCF8574 per risparmiare pin e poi ogni uscita dell'integrato,quando posta ad 1,deve abilitare due buffer tri-state contenuti nel 74HC125,uno per il tx ed uno per l'rx.
Ho fatto la stessa cosa per indirizzare il protocollo SPI ma utilizzando come buffer gli SN74LS244 che hanno 8 buffer composti da due banchi a 4 bit.....Bisogna solo fare attenzione a rispettare la direzione dei dati.

il 74hct4052 dovrebbe andare bene,
http://www.nxp.com/documents/data_sheet/74HC_HCT4052.pdf
guarda come lo usano quelli di atlas scientific per le loro sonde seriali :
https://www.atlas-scientific.com/_files/code/serial-port-connector-Sample-code.pdf
e guarda il loro prodotto:
https://www.atlas-scientific.com/product_pages/embedded/serial-port-connector.html
magari prendi spunto da loro e poi.... :wink:

tonid:
Si astro,l'idea era quella di utilizzare il PCF8574 per risparmiare pin e poi ogni uscita dell'integrato,quando posta ad 1,deve abilitare due buffer tri-state contenuti nel 74HC125,

Ma perché ti devi complicare la vita quando risolvi tutto con due economicissimi CD4066, ottieni fino 4 seriali multiplexate.

astro secondo te fino a quale baudrate si può usare un cd4066?

BrainBooster:
astro secondo te fino a quale baudrate si può usare un cd4066?

Io lo uso sulla Luigino 328 per commutare tra Pin Tx e Rx del connettore con quelli del FTDI, quindi due seriali multiplexate, testato fino 1 Mbps senza problemi, in teoria può arrivare fino a oltre 5 Mbps.

ottimo! io avevo consigliato il 74hct proprio pensando alla velocità..

BrainBooster:
il 74hct4052 dovrebbe andare bene,
http://www.nxp.com/documents/data_sheet/74HC_HCT4052.pdf
guarda come lo usano quelli di atlas scientific per le loro sonde seriali :
https://www.atlas-scientific.com/_files/code/serial-port-connector-Sample-code.pdf
e guarda il loro prodotto:
https://www.atlas-scientific.com/product_pages/embedded/serial-port-connector.html
magari prendi spunto da loro e poi.... :wink:

Ma è fantastico! 8) E' proprio quello che avevo in mente di fare! Ho trovato in giro un 74HCT4052 con la pedinatura per breadboard (non smd), appena ho gli attrezzi sotto mano (fine settimana) faccio un pò di test.
Per il resto, il tipo di progetto che vorrei realizzare per ora va benissimo con 4 porte TX e RX, e visto che i pin digitali non mi servono per altre applicazioni, direi che è più che sufficiente.

Ci tengo a dire che secondo me questo tipo di soluzione è notevole. Fino ad ora ho letto in giro di disperati come me che cercavano di risolvere il problema con SoftwareSerial, con risultati poco soddisfacenti, soprattutto a livello di programmazione....chissà magari qualcuno più esperto di me può mettere due righe sul playground per diffondere il verbo! Dopotutto questo integrato è facilmente reperibile. :slight_smile: