- Protocollo di comunicazione seriale RS-485
- RS-485 in Arduino
- Componenti richiesti
- Schema elettrico
- Programmazione di Arduino UNO e Arduino Nano per la comunicazione seriale RS485
- Controllo della luminosità dei LED con la comunicazione seriale RS485
La scelta di un protocollo di comunicazione per la comunicazione tra microcontrollori e dispositivi periferici è una parte importante del sistema embedded. È importante perché le prestazioni complessive di qualsiasi applicazione incorporata dipendono dai mezzi di comunicazione in quanto sono correlate alla riduzione dei costi, al trasferimento più rapido dei dati, alla copertura a lunga distanza, ecc.
Nei tutorial precedenti abbiamo imparato a conoscere il protocollo di comunicazione I2C e i protocolli di comunicazione SPI in Arduino. Ora esiste un altro protocollo di comunicazione seriale chiamato RS-485. Questo protocollo utilizza una comunicazione seriale asincrona. Il vantaggio principale di RS-485 è il trasferimento di dati a lunga distanza tra due dispositivi. E sono più comunemente usati in ambienti industriali elettricamente rumorosi.
In questo tutorial, impareremo a conoscere la comunicazione seriale RS-485 tra due Arduino e quindi lo dimostreremo controllando la luminosità del LED collegato a un Arduino slave da Master Arduino inviando valori ADC tramite il modulo RS-485. Un potenziometro da 10k viene utilizzato per variare i valori ADC su Master Arduino.
Cominciamo con la comprensione del funzionamento della comunicazione seriale RS-485.
Protocollo di comunicazione seriale RS-485
RS-485 è un protocollo di comunicazione seriale asincrono che non richiede impulsi di clock. Utilizza una tecnica chiamata segnale differenziale per trasferire dati binari da un dispositivo a un altro.
Allora, qual è questo metodo di trasferimento del segnale differenziale?
Il metodo del segnale differenziale funziona creando una tensione differenziale utilizzando un 5V positivo e uno negativo. Fornisce una comunicazione Half-Duplex quando si utilizzano due fili e Full-Duplex richiede 4 fili a quattro.
Utilizzando questo metodo
- RS-485 supporta una velocità di trasferimento dati maggiore di 30 Mbps massimo.
- Fornisce inoltre la massima distanza di trasferimento dati rispetto al protocollo RS-232. Trasferisce dati fino a un massimo di 1200 metri.
- Il vantaggio principale di RS-485 rispetto a RS-232 è lo slave multiplo con singolo master mentre RS-232 supporta solo uno slave singolo.
- Può avere un massimo di 32 dispositivi collegati al protocollo RS-485.
- Un altro vantaggio dell'RS-485 è che è immune al rumore poiché utilizzano il metodo del segnale differenziale per il trasferimento.
- RS-485 è più veloce rispetto al protocollo I2C.
RS-485 in Arduino
Per l'utilizzo di RS-485 in Arduino, è necessario un modulo chiamato 5V MAX485 TTL to RS485 basato su Maxim MAX485 IC poiché consente la comunicazione seriale su una lunga distanza di 1200 metri ed è bidirezionale. In modalità half duplex ha una velocità di trasferimento dati di 2. 5 Mbps.
Il modulo da 5V MAX485 TTL a RS485 richiede una tensione di 5V e utilizza livelli logici di 5V in modo che possa essere interfacciato con le porte seriali hardware di microcontrollori come Arduino.
Ha le seguenti caratteristiche:
- Tensione di esercizio: 5 V.
- Chip MAX485 a bordo
- Un basso consumo energetico per la comunicazione RS485
- Ricetrasmettitore con velocità di risposta limitata
- Terminale 2P passo 5,08 mm
- Comodo cablaggio di comunicazione RS-485
- Tutti i pin del chip a cui sono stati collegati possono essere controllati tramite il microcontrollore
- Dimensioni scheda: 44 x 14 mm
Pin-Out di RS-485:
Nome pin |
Uso |
VCC |
5V |
UN |
Ingresso ricevitore non invertente Uscita driver non invertente |
B |
Inversione dell'ingresso del ricevitore Inversione dell'uscita del driver |
GND |
GND (0V) |
R0 |
Uscita ricevitore (pin RX) |
RI |
Uscita ricevitore (LOW-Enable) |
DE |
Uscita driver (HIGH-Enable) |
DI |
Ingresso driver (pin TX) |
Questo modulo RS-485 può essere facilmente interfacciato con Arduino. Usiamo le porte seriali hardware di Arduino 0 (RX) e 1 (TX) (In UNO, NANO). Anche la programmazione è semplice: basta usare Serial.print () per scrivere su RS-485 e Serial.Read () per leggere da RS-485.
La parte di programmazione è spiegata più avanti in dettaglio, ma prima controlliamo i componenti richiesti e lo schema del circuito.
Componenti richiesti
- Arduino UNO o Arduino NANO (2)
- Modulo convertitore MAX485 TTL a RS485 - (2)
- Potenziometro 10K
- Display LCD 16x2
- GUIDATO
- Breadboard
- Collegamento dei cavi
In questo tutorial Arduino Uno viene utilizzato come Master e Arduino Nano come Slave. Qui vengono utilizzate due schede Arduino, quindi sono necessari due moduli RS-485.
Schema elettrico
Collegamento del circuito tra il primo RS-485 e Arduino UNO (Master):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RI |
8 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
UN |
Ad A di Slave RS-485 |
B |
A B dello Slave RS-485 |
Connessione tra la seconda RS-485 e Arduino Nano (Slave):
RS-485 |
Arduino UNO |
DI |
D1 (TX) |
DE RI |
D8 |
R0 |
D0 (RX) |
VCC |
5V |
GND |
GND |
UN |
Ad A del Master RS-485 |
B |
A B del Master RS-485 |
Collegamento del circuito tra un LCD 16x2 e Arduino Nano:
LCD 16x2 |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Al perno centrale del potenziometro per il controllo del contrasto del display LCD |
RS |
D2 |
RW |
GND |
E |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
UN |
+ 5V |
K |
GND |
Un potenziometro 10K è collegato al pin analogico A0 di Arduino UNO per fornire un ingresso analogico e un LED è collegato al pin D10 di Arduino Nano.
Programmazione di Arduino UNO e Arduino Nano per la comunicazione seriale RS485
Per la programmazione di entrambe le schede viene utilizzato Arduino IDE. Ma assicurati di aver selezionato la PORTA corrispondente da Strumenti-> Porta e scheda da Strumenti-> Scheda.
Il codice completo con un video dimostrativo viene fornito alla fine di questo tutorial. Qui stiamo spiegando una parte importante del codice. Ci sono due programmi in questo tutorial, uno per Arduino UNO (Master) e l'altro per Arduino Nano (Slave).
Spiegazione del codice per Master: Arduino UNO
Nel lato Master, basta semplicemente prendere l'ingresso analogico sul pin A0 variando il potenziometro e quindi SerialWrite quei valori sul bus RS-485 attraverso le porte seriali hardware (0,1) di Arduino UNO.
Per iniziare la comunicazione seriale sui pin seriali hardware (0,1), utilizzare:
Serial.begin (9600);
Per leggere il valore analogico sul pin A0 di Arduino UNO e memorizzarlo in un potval variabile utilizzare:
int potval = analogRead (pushval);
Prima di scrivere il valore del potval sulla porta seriale, i pin DE e RE di RS-485 dovrebbero essere ALTI che è collegato al pin 8 di Arduino UNO in modo da rendere il pin 8 ALTO:
digitalWrite (enablePin, HIGH);
Successivamente, per inserire questi valori nella porta seriale collegata al modulo RS-485, utilizzare la seguente dichiarazione
Serial.println (potval);
Spiegazione del codice per Slave: Arduino NANO
Sul lato Slave viene ricevuto un valore intero dal Master RS-485 che è disponibile alla porta Seriale Hardware di Arduino Nano (Pins -0,1). Basta leggere quei valori e memorizzarli in una variabile. I valori sono nella forma di (0-1023). Quindi viene convertito in (0-255) poiché la tecnica PWM viene utilizzata per controllare la luminosità del LED.
Quindi AnalogWrite quei valori convertiti nel pin LED D10 (è un pin PWM). Quindi, a seconda del valore PWM, la luminosità del LED cambia e mostra anche quei valori nel display LCD 16x2.
Affinché l'RS-485 dello Slave Arduino riceva i valori dal Master, è sufficiente rendere BASSI i pin DE e RE dell'RS-485. Quindi il pin D8 (enablePin) di Arduino NANO è BASSO.
digitalWrite (enablePin, LOW);
E per leggere i dati interi disponibili su Serial Port e memorizzarli in un uso variabile
int pwmval = Serial.parseInt ();
Quindi converti il valore da (0-1023 a 0-255) e memorizzali in una variabile:
int convert = map (pwmval, 0,1023,0,255);
Quindi scrivere il valore analogico (PWM) sul pin D10 dove è collegato l'anodo LED:
analogWrite (ledpin, convert);
Per stampare il valore PWM nel display LCD 16x2, utilizzare
lcd.setCursor (0,0); lcd.print ("PWM FROM MASTER"); lcd.setCursor (0,1); lcd.print (converti);
Controllo della luminosità dei LED con la comunicazione seriale RS485
Quando il valore PWM è impostato su 0 utilizzando il potenziometro, il LED è spento.
E quando il valore PWM è impostato su 251 utilizzando il potenziometro: Il LED è acceso con la massima luminosità come mostrato nell'immagine sottostante:
Quindi è così che RS485 può essere utilizzato per la comunicazione seriale in Arduino.