- Differenza tra comunicazione UART e RS485
- Componenti richiesti
- Schema del circuito per comunicazioni cablate a lunga distanza
- Modulo convertitore MAX485 UART-RS485
- Cavo Ethernet CAT-6E
- Spiegazione del codice Arduino
- Conclusione
Da tempo utilizziamo schede di sviluppo per microcontrollori come Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430, ecc. Nei nostri piccoli progetti in cui la maggior parte delle volte la distanza tra i sensori e la scheda non supera i pochi centimetri al massimo e a queste distanze, la comunicazione tra i diversi moduli sensore, relè, attuatori e controller può essere facilmente eseguita tramite semplici cavi jumper senza che ci preoccupiamo della distorsione del segnale nel mezzo e dei rumori elettrici che si insinuano in esso. Ma se stai costruendo un sistema di controllo con queste schede di sviluppo su una distanza maggiore di 10-15 metri, dovresti prendere in considerazione il rumore e la potenza del segnale perché se vuoi che il tuo sistema funzioni in modo affidabile, non puoi permetterti di perdere il dati durante il trasferimento.
Esistono molti tipi diversi di protocolli di comunicazione seriale come I2C e SPI che possono essere facilmente implementati con Arduino e oggi esamineremo un altro protocollo più comunemente usato chiamato RS485 che è molto comunemente usato in ambienti industriali ad alto rumore per trasferire i dati una lunga distanza. In questo tutorial, impareremo a conoscere il protocollo di comunicazione RS485 e come implementarlo con i due Arduino Nano che abbiamo con noi e come utilizzare il modulo di conversione MAX485 da RS485 a UART. In precedenza abbiamo anche eseguito la comunicazione MAX485 con Arduino e anche la comunicazione MAX485 con Raspberry pi, puoi anche verificarle se interessati.
Differenza tra comunicazione UART e RS485
La maggior parte dei sensori a basso costo e altri moduli come GPS, Bluetooth, RFID, ESP8266, ecc. Che sono comunemente usati con Arduino, Raspberry Pi nel mercato utilizza la comunicazione basata su UART TTL perché richiede solo 2 fili TX (trasmettitore) e RX (Ricevitore). Non è un protocollo di comunicazione standard, ma è un circuito fisico con il quale è possibile trasmettere e ricevere dati seriali con altre periferiche. Può solo trasmettere / ricevere dati in modo seriale, quindi converte prima i dati paralleli in dati seriali e poi trasmette i dati.
UART è un dispositivo di trasmissione asincrono, quindi non c'è segnale di clock per sincronizzare i dati tra i due dispositivi, invece utilizza i bit di inizio e fine rispettivamente all'inizio e alla fine di ciascun pacchetto di dati per contrassegnare le estremità dei dati trasferiti. I dati trasmessi dalla UART sono organizzati in pacchetti. Ogni pacchetto contiene 1 bit di inizio, da 5 a 9 bit di dati (a seconda dell'UART), un bit di parità opzionale e 1 o 2 bit di arresto. È molto ben documentato e ampiamente utilizzato e ha anche un bit di parità per consentire il controllo degli errori. Ma ci sono alcune limitazioni in quanto non può supportare più slave e più master e il frame di dati massimo è limitato a 9 bit. Per il trasferimento dei dati, i baud rate di Master e Slave devono essere tra il 10% l'uno dell'altro. Di seguito è mostrato l'esempio di come un personaggio è un trasmettitore su una linea dati UART. Il segnale alto e basso viene misurato rispetto al livello GND, quindi lo spostamento del livello GND avrà un effetto disastroso sul trasferimento dei dati.
D'altra parte, RS485 è una comunicazione più basata sul settore che è stata sviluppata per una rete di più dispositivi che possono essere utilizzati su lunghe distanze e anche a velocità maggiori. Funziona su un metodo di misurazione di segnalazione differenziale piuttosto che sulla misurazione della tensione rispetto al pin GND. I segnali RS485 sono flottanti e ogni segnale viene trasmesso su una linea Sig + e una linea Sig.
Il ricevitore RS485 confronta la differenza di tensione tra le due linee, invece del livello di tensione assoluto su una linea di segnale. Funziona bene e impedisce l'esistenza di loop di massa, una fonte comune di problemi di comunicazione. I migliori risultati si ottengono se le linee Sig + e Sig- sono attorcigliate in quanto la torsione annulla l'effetto del rumore elettromagnetico indotto in un cavo e fornisce un'immunità molto migliore contro il rumore che consente all'RS485 di trasmettere i dati fino a 1200 m di portata. Il doppino intrecciato consente inoltre che le velocità di trasmissione siano molto più elevate di quanto sia possibile con cavi diritti. A piccole distanze di trasmissione è possibile ottenere velocità fino a 35 Mbps con RS485 sebbene la velocità di trasmissione diminuirà con la distanza. A 1200 m di velocità di trasmissione, è possibile utilizzare solo 100 kbps di velocità di trasmissione. È necessario un cavo Ethernet speciale per realizzare questo protocollo di comunicazione. Esistono molte categorie di cavi Ethernet che possiamo utilizzare come CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A, ecc. Nel nostro tutorial, utilizzeremo il cavo CAT-6E che ha 4 doppini intrecciati di cavi 24AWG e può supportare fino a 600 MHz. È terminato ad entrambe le estremità da un connettore RJ45. I livelli tipici di tensione di linea dai driver di linea vanno da un minimo di ± 1,5 V a un massimo di circa ± 6 V. La sensibilità di ingresso del ricevitore è ± 200 mV. Il rumore nella gamma di ± 200 mV è essenzialmente bloccato a causa della cancellazione del rumore di modo comune. Un esempio di come un byte (0x3E) viene trasferito sulle due linee di comunicazione RS485.
Componenti richiesti
- Modulo convertitore 2 × MAX485
- 2 × Arduino Nano
- LCD alfanumerico 2 × 16 * 2
- Potenziometri tergicristallo 2 × 10k
- Cavo Ethernet Cat-6E
- Breadboard
- Cavi per ponticelli
Schema del circuito per comunicazioni cablate a lunga distanza
L'immagine sotto mostra lo schema del circuito del trasmettitore e del ricevitore per la comunicazione cablata a lunga distanza di Arduino. Nota che entrambi i circuiti del trasmettitore e del ricevitore sembrano identici, l'unica cosa che differisce è il codice scritto in esso. Anche per la dimostrazione, stiamo usando una scheda come trasmettitore e una scheda come ricevitore, ma possiamo facilmente programmare le schede per funzionare sia come trasmettitore che come ricevitore con la stessa configurazione
Di seguito è riportato anche lo schema di collegamento per il circuito di cui sopra.
Come puoi vedere sopra, ci sono due coppie di circuiti quasi identiche, ciascuna con un Arduino nano, un LCD alfanumerico 16 * 2 e un IC convertitore da UART a RS485 MAX485 collegati a ciascuna estremità di un cavo Ethernet Cat-6E tramite un connettore RJ45. Il cavo che ho utilizzato nel tutorial è lungo 25 m. Invieremo alcuni dati dal lato trasmettitore tramite il cavo dal Nano che viene convertito in segnali RS485 tramite il modulo MAX RS485 che funziona in modalità Master.
All'estremità ricevente, il modulo convertitore MAX485 funziona come uno Slave, e ascoltando la trasmissione dal Master converte nuovamente i Dati RS485 ricevuti nei segnali UART 5V TTL standard per essere letti dal Nano ricevente e visualizzati su 16 * 2 LCD alfanumerici ad esso collegati.
Modulo convertitore MAX485 UART-RS485
Questo modulo convertitore UART-RS485 ha un chip MAX485 integrato che è un ricetrasmettitore a bassa potenza e con velocità di variazione limitata utilizzato per la comunicazione RS-485. Funziona con un singolo alimentatore + 5V e la corrente nominale è di 300 μA. Funziona sulla comunicazione half-duplex per implementare la funzione di conversione del livello TTL in livello RS-485, il che significa che può trasmettere o ricevere in qualsiasi momento, non entrambi, può raggiungere una velocità di trasmissione massima di 2,5 Mbps. Il ricetrasmettitore MAX485 assorbe una corrente di alimentazione compresa tra 120μA e 500μA in condizioni di vuoto o pieno carico quando il driver è disabilitato. Il driver è limitato per la corrente di cortocircuito e le uscite del driver possono essere poste in uno stato di alta impedenza attraverso il circuito di arresto termico. L'ingresso del ricevitore ha una funzione di sicurezza che garantisce un'uscita logica elevata se l'ingresso è a circuito aperto.Inoltre, ha una forte prestazione anti-interferenza. Dispone inoltre di LED integrati per visualizzare lo stato corrente del chip, ovvero se il chip è alimentato o se sta trasmettendo o ricevendo dati, rendendo più facile il debug e l'uso.
Lo schema del circuito riportato sopra spiega come il circuito integrato MAX485 è collegato a vari componenti e fornisce intestazioni di spaziatura standard da 0,1 pollici da utilizzare con breadboard, se lo desideri.
Cavo Ethernet CAT-6E
Quando pensiamo al trasferimento di dati a lunga distanza, pensiamo immediatamente alla connessione a Internet tramite cavi Ethernet. Al giorno d'oggi, utilizziamo principalmente il Wi-Fi per la connettività Internet, ma in precedenza usavamo cavi Ethernet che andavano a ciascun personal computer per collegarlo a Internet. Il motivo principale alla base dell'utilizzo di questi cavi Ethernet su fili normali è che forniscono una protezione molto migliore contro il rumore che si insinua e la distorsione del segnale su alte distanze. Hanno una guaina schermante sullo strato isolante per proteggere dall'interferenza elettromagnetica e inoltre ogni coppia di fili è attorcigliata per evitare la formazione di loop di corrente e quindi una protezione molto migliore contro il rumore. Sono spesso terminati con connettori RJ45 a 8 pin alle due estremità. Esistono molte categorie di cavi Ethernet che possiamo utilizzare come CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A, ecc. Nel nostro tutorial, utilizzeremo un cavo CAT-6E che ha 4 doppini intrecciati di cavi 24AWG e può supportare fino a 600MHz.
Immagine che mostra come una coppia di fili è attorcigliata all'interno dello strato isolante del cavo CAT-6E
Connettore RJ-45 per cavo Ethernet CAT-6E
Spiegazione del codice Arduino
In questo progetto, stiamo usando due Arduino Nano, uno come trasmettitore e uno come ricevitore, ciascuno pilotato da un LCD alfanumerico 16 * 2 per visualizzare i risultati. Quindi, nel codice Arduino, ci concentreremo sull'invio dei dati e visualizzeremo i dati inviati o ricevuti sullo schermo LCD.
Per il lato del trasmettitore:
Iniziamo includendo la libreria standard per pilotare l'LCD e dichiariamo il pin D8 di Arduino Nano come pin di uscita che utilizzeremo in seguito per dichiarare il modulo MAX485 come trasmettitore o ricevitore.
int enablePin = 8; int potval = 0; #includere
Ora veniamo alla parte di installazione. Tireremo il pin di abilitazione in alto per mettere il modulo MAX485 in modalità trasmettitore. Poiché si tratta di un circuito integrato half-duplex, non può trasmettere e ricevere contemporaneamente. Qui inizializzeremo anche il display LCD e stamperemo un messaggio di benvenuto.
Serial.begin (9600); // inizializza seriale a baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Transmitter Nano"); ritardo (3000); lcd.clear ();
Ora nel ciclo, scriviamo un valore intero in continuo aumento sulle linee Seriali che viene poi trasmesso all'altro nano. Questo valore viene stampato anche sull'LCD per la visualizzazione e il debug.
Serial.print ("Valore inviato ="); Serial.println (potval); // Seriale scrive POTval sul bus RS-485 lcd.setCursor (0,0); lcd.print ("Valore inviato"); lcd.setCursor (0,1); lcd.print (potval); ritardo (1000); lcd.clear (); potval + = 1;
Lato ricevitore:
Anche in questo caso, iniziamo includendo la libreria standard per pilotare l'LCD e dichiariamo il pin D8 di Arduino Nano come pin di uscita che utilizzeremo in seguito per dichiarare il modulo MAX485 come trasmettitore o ricevitore.
int enablePin = 8; #includere
Ora veniamo alla parte di installazione. Tireremo il pin di abilitazione in alto per mettere il modulo MAX485 in modalità ricevitore. Poiché si tratta di un circuito integrato half-duplex, non può trasmettere e ricevere contemporaneamente. Qui inizializzeremo anche il display LCD e stamperemo un messaggio di benvenuto.
Serial.begin (9600); // inizializza seriale a baudrate 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Receiver Nano"); ritardo (3000); digitalWrite (enablePin, LOW); // (Pin 8 sempre BASSO per ricevere valore dal Master)
Ora nel ciclo, controlliamo se c'è qualcosa disponibile sulla porta seriale e poi leggiamo i dati e poiché i dati in arrivo sono un numero intero, li analizziamo e li visualizziamo sull'LCD collegato.
int pwmval = Serial.parseInt (); // Ricevi il valore INTEGER dal Master tramite RS-485 Serial.print ("I got value"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Valore ricevuto"); lcd.setCursor (0,1); lcd.print (pwmval); ritardo (1000); lcd.clear ();
Conclusione
Di seguito è possibile trovare la configurazione di prova che abbiamo utilizzato per questo progetto.
Il funzionamento completo di questo progetto può essere trovato nel video collegato sotto. Questo metodo è uno dei metodi semplici e facili da implementare per trasferire i dati su lunghe distanze. In questo progetto, abbiamo utilizzato solo una velocità di trasmissione di 9600 che è ben al di sotto della velocità di trasferimento massima che possiamo ottenere con il modulo MAX-485, ma questa velocità è adatta per la maggior parte dei moduli sensore là fuori e non ne abbiamo davvero bisogno tutte le velocità massime mentre si lavora con Arduino e altre schede di sviluppo a meno che non si utilizzi il cavo come connessione ethernet e si richieda tutta la larghezza di banda e la velocità di trasferimento che è possibile ottenere. Gioca da solo con la velocità di trasferimento e prova anche altri tipi di cavi Ethernet. Se hai domande, lasciale nella sezione commenti qui sotto o usa i nostri forum e farò del mio meglio per rispondere. Fino ad allora, adios!