- Comunicazione seriale RS-485
- Collegamento di RS-485 con Arduino
- Modulo convertitore da USB a RS-485
- Semplicemente Modbus Master Software
- Strumenti necessari
- Schema elettrico
- Programmazione Arduino UNO per RS-485 MODBUS Slave
- Testare Arduino UNO come Rs485 Modbus Slave
Modbus è un protocollo di comunicazione seriale che è stato scoperto da Modicon nel 1979 e viene utilizzato per la trasmissione di dati su linee seriali tra i dispositivi elettronici industriali. RS-485 Modbus utilizza RS-485 per le linee di trasmissione. Va notato che Modbus è un protocollo software e non un protocollo hardware. È diviso in due parti come Modbus Master e Modbus Slave. Nella rete RS-485 Modbus sono presenti un Master e 127 Slave ciascuno con indirizzo univoco da 1 a 127. In questo progetto MAX485 Arduino, utilizzeremo Arduino Uno come Slave per la comunicazione seriale.
I Modbus sono utilizzati principalmente nei PLC (controllori logici programmabili). E oltre a questo, il Modbus è utilizzato anche in sanità, trasporti, automazione domestica, ecc. Modbus ha 255 codici funzione e ci sono principalmente tre versioni popolari di Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Qual è la differenza tra Modbus ASCII e Modbus RTU?
Modbus RTU e Modbus ASCII parlano lo stesso protocollo. L'unica differenza è che i byte trasmessi in rete sono presentati come binari con RTU e come ASCII leggibili con Modbus RTU. Modbus RTU verrà utilizzato in questo tutorial.
Questo tutorial riguarda l'utilizzo della comunicazione Modbus RS-485 con Arduino UNO come Slave. Qui installiamo il software Simply Modbus Master nel PC e controlliamo due LED e il servomotore utilizzando RS-485 come linea di trasmissione. Questi LED e il servomotore sono collegati con Slave Arduino e controllati inviando valori utilizzando il software Master Modbus. Poiché questo tutorial utilizza RS-485, si consiglia di passare prima attraverso la comunicazione seriale RS485 tra Arduino Uno e Arduino Nano. RS485 può essere utilizzato anche con altri controllori per la comunicazione seriale:
- Comunicazione seriale RS-485 tra Raspberry Pi e Arduino UNO
- Comunicazione seriale tra STM32F103C8 e Arduino UNO tramite RS-485
Cominciamo esplorando alcune informazioni di base su RS-485 e Modbus. Ulteriori informazioni sui vari protocolli di comunicazione seriale qui.
Comunicazione seriale RS-485
RS-485 è un protocollo di comunicazione seriale asincrono che non richiede 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 è immune al rumore poiché utilizzano il metodo del segnale differenziale per il trasferimento.
- RS-485 è più veloce rispetto al protocollo I2C.
Collegamento di RS-485 con Arduino
Il modulo RS-485 può essere collegato a qualsiasi microcontrollore dotato di porta seriale. Per l'utilizzo del modulo RS-485 con microcontrollori, è necessario un modulo chiamato 5V MAX485 TTL to RS485 basato su Maxim MAX485 IC in quanto consente la comunicazione seriale su lunghe distanze di 1200 metri. È bidirezionale e half duplex e ha una velocità di trasferimento dati di 2,5 Mbps. Questo modulo richiede una tensione di 5V.
Pin-Out di RS-485:
Nome pin |
Descrizione pin |
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) |
Modulo convertitore da USB a RS-485
Questo è un modulo adattatore convertitore da USB a RS485 che supporta WIN7, XP, Vista, Linux, Mac OS e fornisce un'interfaccia RS485 facile da usare tramite la porta COM del computer . Questo modulo è un dispositivo plug-and-play . Non ci sono strutture di comando, tutto ciò che viene inviato alla porta COM virtuale viene automaticamente convertito in RS485 e viceversa. Il modulo è completamente autoalimentato dal bus USB. Quindi, nessuna necessità di alimentazione esterna per il funzionamento.
Si presenta come una porta seriale / COM ed è accessibile da applicazioni o hyper-terminal. Questo convertitore fornisce la comunicazione RS-485 half-duplex. L'intervallo di velocità in baud è compreso tra 75 bps e 115200 bps, massimo fino a 6 Mbps.
Per utilizzare questo dispositivo sono disponibili vari software Modbus in Internet. In questo tutorial viene utilizzato un software chiamato Simply Modbus Software.
Semplicemente Modbus Master Software
È necessaria l'applicazione Modbus Master Software per inviare dati al dispositivo Arduino Modbus RS-485 slave tramite COM.
Simply Modbus Master è un software di test per la comunicazione dati. È possibile scaricare il Simply Modbus Master dal collegamento fornito e saperne di più consultando il Manuale del software.
Prima di utilizzare il software, è importante acquisire familiarità con le seguenti terminologie.
ID slave:
Ad ogni slave in una rete viene assegnato un indirizzo di unità univoco da 1 a 127. Quando il master richiede dati, il primo byte che invia è l'indirizzo dello slave. In questo modo ogni slave sa dopo il primo byte se ignorare o meno il messaggio.
Codice funzione:
Il secondo byte inviato dal Master è il codice funzione. Questo numero indica allo slave a quale tabella accedere e se leggere o scrivere nella tabella.
Codici funzione registro supportati:
Codice funzione |
Azione |
Nome tabella |
04 (04 esadecimale) |
Leggere |
Registri di ingresso analogico |
03 (03 esadecimale) |
Leggere |
Registri di mantenimento dell'uscita analogica |
06 (06 esadecimale) |
Scrivi singolo |
Registro di mantenimento dell'uscita analogica |
16 (10 esadecimale) |
Scrivi più |
Registri di mantenimento dell'uscita analogica |
Codici funzione bobina supportati:
Codice funzione |
Azione |
Nome tabella |
02 (02 esadecimale) |
Leggere |
Contatti di ingresso discreti |
01 (01 esadecimale) |
Leggere |
Bobine di uscita discrete |
05 (05 esadecimale) |
Scrivi singolo |
Bobina di uscita discreta |
15 (0F esadecimale) |
Scrivi più |
Bobine di uscita discrete |
CRC:
CRC sta per Cyclic Redundancy check. Sono due byte aggiunti alla fine di ogni messaggio Modbus per il rilevamento degli errori.
Strumenti necessari
Hardware
- Arduino UNO
- Modulo convertitore da MAX-485 TTL a RS-485
- Modulo convertitore da USB a RS-485
- LED (2)
- Resistenza 1k (2)
- Display LCD 16x2
- Potenziometro 10k
- Servomotore SG-90
Software
- Semplicemente Modbus Master
Schema elettrico
Collegamento del circuito tra il modulo convertitore da MAX-485 TTL a RS-485 e Arduino UNO:
Arduino UNO |
Modulo convertitore da MAX-485 TTL a RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Collegamento del circuito tra MAX-485 TTL al modulo RS-485 e convertitore da USB a RS-485:
MAX-485 TTL a RS-485 Modulo convertitore |
Modulo da USB a RS-485 Collegato al PC |
UN |
UN |
B |
B |
Collegamenti del circuito tra Arduino UNO e display LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Per controllare il pin del potenziometro per il controllo del contrasto / luminosità dell'LCD 16x2 |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UN |
+ 5V |
K |
GND |
Collegamento del circuito tra 2 LED, servomotore e Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomotore |
2 |
Anodo tramite resistenza da 1k |
- |
- |
5 |
- |
Anodo tramite resistenza da 1k |
- |
6 |
- |
- |
Pin PWM (arancione) |
+ 5V |
- |
- |
+ 5V (ROSSO) |
GND |
Cathode GND |
Cathode GND |
GND (marrone) |
Programmazione Arduino UNO per RS-485 MODBUS Slave
Arduino UNO è configurato come Modbus Slave. Inoltre, Arduino UNO è collegato con due LED e un servomotore. Quindi lo slave Arduino è controllato dal software Master Modbus. La comunicazione tra Arduino UNO e il software Modbus Master avviene utilizzando il modulo RS-485. Per il collegamento con il PC, viene utilizzato il modulo convertitore da USB a RS-485. E Arduino UNO con modulo convertitore da MAX-485 TTL a RS-485, l'intera configurazione apparirà come segue:
Per l'utilizzo di Modbus in Arduino UNO, una libreria
Inizialmente, includi la libreria richiesta. La libreria ModbusRTU è per l'utilizzo della comunicazione Modbus RS-485 e la libreria a cristalli liquidi è per l'utilizzo di LCD con Arduino UNO e la libreria servo è per l'utilizzo del servomotore con Arduino UNO.
#includere
Ora i pin dell'anodo LED che sono collegati ai pin 2 e 5 di Arduino sono definiti come LED1 e LED2.
#define led1 2 #define led2 5
Successivamente viene dichiarato l'oggetto per l'accesso alla classe Liquid Crystal con i pin LCD (RS, E, D4, D5, D6, D7) che sono collegati ad Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Quando LCD ha finito, inizializza l'oggetto servo per la classe Servo. Inizializza anche l'oggetto bus per la classe Modbus.
Servo servo; Bus Modbus;
Successivamente, per memorizzare i valori per la comunicazione Modbus, viene dichiarato un array con i tre valori inizializzati con zero.
uint16_t modbus_array = {0,0,0};
Nella funzione di configurazione , per prima cosa l'LCD è impostato in modalità 16x2 e viene visualizzato e cancellato un messaggio di benvenuto.
lcd.begin (16,2); // Lcd impostato in modalità 16x2 lcd.print ("RS-485 Modbus"); // Messaggio di benvenuto lcd.setCursor (0,1); lcd.print ("Arduino Slave"); ritardo (5000); lcd.clear ();
Successivamente, i pin LED1 e LED2 vengono impostati come pin di uscita.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Il pin del servoazionamento collegato al pin 6 PWM di Arduino è collegato.
servo.attach (6);
Ora per la comunicazione Modbus sono impostati i seguenti parametri. Il primo "1" rappresenta lo Slave ID, il secondo "1" indica che utilizza RS-485 per trasferire i dati e "4" rappresenta il pin RS-485 DE&RE collegato ad Arduino UNO.
bus = Modbus (1,1,4);
Lo slave Modbus è impostato a 9600 baudrate.
Il ciclo inizia con la definizione di bus poll e bus.poll () viene utilizzato per scrivere e ricevere il valore dal Modbus master.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Questo metodo viene utilizzato per verificare se sono disponibili dati sulla porta seriale.
Se ci sono dati disponibili sulla porta seriale, la libreria Modbus RTU controllerà il messaggio (controlla l'indirizzo del dispositivo, la lunghezza dei dati e il CRC) ed eseguirà l'azione richiesta.
Ad esempio, per scrivere o leggere qualsiasi valore dal master, ModbusRTU deve ricevere un array di interi a 16 bit senza segno e la sua lunghezza dal Modbus master. Questo array trasporta i dati scritti dal master.
In questo tutorial ci sono tre array per LED1, LED2 e angolo del servomotore.
Prima di accendere o spegnere il LED1 modbus_array viene utilizzato.
if (modbus_array == 0) // Dipende dal valore in modubus_array scritto dal Master Modbus { digitalWrite (led1, LOW); // LED SPENTO se 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED acceso se valore diverso da 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Successivamente per accendere o spegnere il LED2 modbus_array viene utilizzato.
if (modbus_array == 0) // Dipende dal valore in modbus_array scritto dal Master Modbus { digitalWrite (led2, LOW); // LED SPENTO se 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED acceso se valore diverso da 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Successivamente per impostare l'angolo del servomotore, il modbus_array utilizzato e il valore vengono stampati nel display LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Angolo servo:"); lcd.print (pwm); ritardo (200); lcd.clear ();
Questo termina la programmazione di Arduino UNO per utilizzarlo come MODBUS Slave. Il prossimo passo sarà testarlo come Modbus Slave.
Testare Arduino UNO come Rs485 Modbus Slave
Dopo che i collegamenti del circuito sono stati completati e il codice è stato caricato su Arduino UNO, è tempo di collegare il modulo USB al modulo RS-485 con il PC su cui è installato il software Simple Modbus Master.
Apri Gestione dispositivi e controlla la porta COM in base al tuo PC a cui è collegato il modulo da USB a RS-485 e quindi apri il software Simply Modbus Master 8.1.1.
1. Dopo aver aperto il software Simply Modbus, aprire ora l'opzione Scrivi.
2. Dopo aver aperto Simply Modbus Master Write. Imposta i parametri
Modalità in RTU, porta COM in base al PC (la mia era COM6), Baud a 9600, Data Bits 8, Stop bit 1, Parity None e Slave ID come 1.
3. Dopo di che impostare il primo registro come 40001 ei valori da scrivere sono 3 e il codice funzione come 16 (Write Holding Register).
Quindi scrivere da 1 a 40001 (per LED1 acceso) e da 1 a 40002 (per LED2 acceso) e da 90 a 40003 (per angolo servomotore) e quindi fare clic sul pulsante INVIA.
Puoi vedere sia lo stato del LED acceso che l'angolo del servo a 90 gradi.
4. Successivamente immettere 40001 come 1 e 40002 come 0 e 40003 come 180 e fare clic sul pulsante INVIA.
5. Ora scriviamo da 135 a 40003 e 40001 come 0 e 40002 come 1.
È così che RS-485 Modbus può essere utilizzato nella comunicazione seriale con Arduino UNO come Slave. Nel prossimo tutorial useremo Arduino Uno come master nella comunicazione MODBUS.
Trova il codice completo e un video dimostrativo di seguito.