- RS-485 seriële communicatie
- RS-485 verbinden met Arduino
- USB naar RS-485 convertermodule
- Gewoon Modbus Master Software
- Benodigde gereedschappen
- Schakelschema
- Programmering Arduino UNO voor RS-485 MODBUS Slave
- Testen van de Arduino UNO als Rs485 Modbus Slave
Modbus is een protocol voor seriële communicatie dat in 1979 door Modicon werd ontdekt en wordt gebruikt voor het verzenden van gegevens via seriële lijnen tussen industriële elektronische apparaten. RS-485 Modbus gebruikt RS-485 voor transmissielijnen. Opgemerkt moet worden dat Modbus een softwareprotocol is en geen hardwareprotocol. Het is onderverdeeld in twee delen, zoals Modbus Master en Modbus Slave. In het RS-485 Modbus-netwerk is er één Master en 127 Slaves elk met een uniek adres van 1 tot 127. In dit MAX485 Arduino- project zullen we Arduino Uno als Slave gebruiken voor seriële communicatie.
Modbus wordt meestal gebruikt in PLC's (Programmable Logic Controllers). En afgezien hiervan wordt de Modbus ook gebruikt in de gezondheidszorg, transport, domotica etc. Modbus heeft 255 functiecodes en er zijn voornamelijk drie populaire versies van Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Wat is het verschil tussen Modbus ASCII en Modbus RTU?
Modbus RTU en Modbus ASCII spreken hetzelfde protocol. Het enige verschil is dat de bytes die over de draad worden verzonden, worden gepresenteerd als binair met RTU en als leesbare ASCII met Modbus RTU. In deze tutorial wordt Modbus RTU gebruikt.
Deze tutorial gaat over het gebruik van RS-485 Modbus-communicatie met Arduino UNO als Slave. Hier installeren we Simply Modbus Master Software op pc en besturen we twee LED's en servomotor door RS-485 als transmissielijn te gebruiken. Deze LED's en servomotor zijn verbonden met Slave Arduino en worden aangestuurd door waarden te verzenden met behulp van Master Modbus-software. Aangezien deze tutorial gebruik maakt van RS-485, is het aan te raden om eerst de RS485 seriële communicatie tussen Arduino Uno en Arduino Nano te doorlopen. RS485 kan ook worden gebruikt met andere controllers voor seriële communicatie:
- RS-485 seriële communicatie tussen Raspberry Pi en Arduino UNO
- Seriële communicatie tussen STM32F103C8 en Arduino UNO via RS-485
Laten we beginnen met wat achtergrondinformatie over de RS-485 en Modbus. Lees hier ook meer over verschillende seriële communicatieprotocollen.
RS-485 seriële communicatie
RS-485 is een asynchroon serieel communicatieprotocol waarvoor geen klok nodig is. Het gebruikt een techniek genaamd differentieel signaal om binaire gegevens van het ene apparaat naar het andere over te brengen.
Dus wat is deze differentiële signaaloverdrachtsmethode?
De differentiële signaalmethode werkt door een differentiële spanning te creëren door een positieve en negatieve 5V te gebruiken. Het biedt een half-duplex communicatie bij gebruik van twee draden en full-duplex vereist 4 vier draden.
Door deze methode te gebruiken:
- RS-485 ondersteunt een hogere gegevensoverdrachtsnelheid van maximaal 30 Mbps.
- Het biedt ook een maximale afstand voor gegevensoverdracht in vergelijking met het RS-232-protocol. Het draagt gegevens over tot maximaal 1200 meter.
- Het belangrijkste voordeel van RS-485 ten opzichte van RS-232 is de meervoudige slave met enkele master, terwijl RS-232 alleen enkele slave ondersteunt.
- Er kunnen maximaal 32 apparaten worden aangesloten op het RS-485-protocol.
- Een ander voordeel van de RS-485 is ongevoelig voor ruis, aangezien ze een differentiële signaalmethode gebruiken om over te dragen.
- RS-485 is sneller in vergelijking met het I2C-protocol.
RS-485 verbinden met Arduino
RS-485-module kan worden aangesloten op elke microcontroller met een seriële poort. Voor het gebruik van de RS-485-module met microcontrollers is een module met de naam 5V MAX485 TTL naar RS485 nodig die is gebaseerd op Maxim MAX485 IC, omdat hiermee seriële communicatie over een lange afstand van 1200 meter mogelijk is. Het is bidirectioneel en half duplex en heeft een gegevensoverdrachtsnelheid van 2,5 Mbps. Deze module vereist een spanning van 5V.
Pin-out van RS-485:
Pin Naam |
Pin Beschrijving |
VCC |
5V |
EEN |
Niet-inverterende ontvanger-ingang Niet-inverterende stuurprogramma-uitvoer |
B. |
Ontvangerinvoer omkeren Driver output omkeren |
GND |
GND (0V) |
R0 |
Ontvanger uit (RX-pin) |
OPNIEUW |
Ontvangeruitgang (LOW-Enable) |
DE |
Driver-uitgang (HIGH-Enable) |
DI |
Driver-ingang (TX-pin) |
USB naar RS-485 convertermodule
Dit is een USB-naar-RS485-converteradaptermodule die WIN7, XP, Vista, Linux, Mac OS ondersteunt en een gebruiksvriendelijke RS485-interface biedt door middel van de COM-poort op de computer . Deze module is een plug-and-play-apparaat . Er zijn geen commandostructuren, alles wat naar de virtuele COM-poort wordt gestuurd, wordt automatisch geconverteerd naar RS485 en vice versa. De module is volledig eigen stroomvoorziening via de USB-bus. Dus geen externe voeding nodig voor gebruik.
Het wordt weergegeven als een seriële / COM-poort en is toegankelijk vanuit applicaties of hyperterminal. Deze converter biedt half-duplex RS-485-communicatie. Het baudrate-bereik is 75 bps tot 115200 bps, maximaal tot 6 Mbps.
Om dit apparaat te kunnen gebruiken zijn er diverse Modbus Software op internet beschikbaar. In deze tutorial wordt een software genaamd Simply Modbus Software gebruikt.
Gewoon Modbus Master Software
Modbus Master Software-applicatie is nodig om gegevens via COM naar het slave Modbus RS-485 Arduino-apparaat te verzenden.
Simply Modbus Master is een datacommunicatietestsoftware. U kunt de Simply Modbus Master downloaden via de gegeven link en er meer over lezen in de Softwarehandleiding.
Voordat u de software gebruikt, is het belangrijk om vertrouwd te raken met de volgende terminologieën.
Slaaf ID:
Elke slave in een netwerk krijgt een uniek unitadres van 1 tot 127 toegewezen. Wanneer de master om gegevens vraagt, is de eerste byte die hij verzendt het Slave-adres. Op deze manier weet elke slaaf na de eerste byte of hij het bericht moet negeren.
Functiecode:
De tweede byte die door de master wordt verzonden, is de functiecode. Dit nummer vertelt de slaaf tot welke tafel hij toegang moet hebben en of hij moet lezen of schrijven naar de tafel.
Ondersteunde registerfunctiecodes:
Functiecode |
Actie |
Tafel naam |
04 (04 hexadecimaal) |
Lezen |
Registers voor analoge invoer |
03 (03 hexadecimaal) |
Lezen |
Analoge uitgangsregisters |
06 (06 hexadecimaal) |
Schrijf een single |
Holding Register met analoge uitgang |
16 (10 hexadecimaal) |
Schrijf meerdere |
Analoge uitgangsregisters |
Ondersteunde spoelfunctiecodes:
Functiecode |
Actie |
Tafel naam |
02 (02 hexadecimaal) |
Lezen |
Discrete ingangscontacten |
01 (01 hexadecimaal) |
Lezen |
Discrete uitgangsspoelen |
05 (05 hexadecimaal) |
Schrijf een single |
Discrete uitgangsspoel |
15 (0F hexadecimaal) |
Schrijf meerdere |
Discrete uitgangsspoelen |
CRC:
CRC staat voor Cyclic Redundancy check. Het is twee bytes toegevoegd aan het einde van elk Modbus-bericht voor foutdetectie.
Benodigde gereedschappen
Hardware
- Arduino UNO
- MAX-485 TTL naar RS-485 convertermodule
- USB naar RS-485 convertermodule
- LED (2)
- 1k-weerstand (2)
- 16x2 LCD-scherm
- 10k Potentiometer
- Servomotor SG-90
Software
- Gewoon Modbus Master
Schakelschema
Circuitverbinding tussen MAX-485 TTL naar RS-485 convertermodule en Arduino UNO:
Arduino UNO |
MAX-485 TTL naar RS-485 convertermodule |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Circuitverbinding tussen MAX-485 TTL naar RS-485-module en USB naar RS-485-converter:
MAX-485 TTL naar RS-485 Omvormermodule |
USB naar RS-485-module Verbonden met pc |
EEN |
EEN |
B. |
B. |
Circuitverbindingen tussen Arduino UNO en 16x2 LCD-scherm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Om de pin van de potentiometer te bedienen voor het regelen van contrast / helderheid van 16x2 LCD |
RS |
8 |
RW |
GND |
E. |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
EEN |
+ 5V |
K |
GND |
Circuitverbinding tussen 2 LED's, servomotor en Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servomotor |
2 |
Anode via 1k-weerstand |
- |
- |
5 |
- |
Anode via 1k-weerstand |
- |
6 |
- |
- |
PWM-pin (oranje) |
+ 5V |
- |
- |
+ 5V (ROOD) |
GND |
Kathode GND |
Kathode GND |
GND (bruin) |
Programmering Arduino UNO voor RS-485 MODBUS Slave
De Arduino UNO is geconfigureerd als Modbus Slave. Ook is Arduino UNO bevestigd met twee LED's en een servomotor. Dus de slaaf Arduino wordt bestuurd vanuit de Master Modbus-software. De communicatie tussen de Arduino UNO en de Modbus Master Software wordt tot stand gebracht door middel van de RS-485-module. Voor aansluiting op de pc wordt de USB naar RS-485-convertermodule gebruikt. En de Arduino UNO met MAX-485 TTL naar RS-485 converter module, de hele setup ziet er als volgt uit:
Voor het gebruik van Modbus in Arduino UNO, een bibliotheek
Voeg in eerste instantie de vereiste bibliotheek toe. ModbusRTU-bibliotheek is voor het gebruik van RS-485 Modbus-communicatie en de liquid crystal-bibliotheek is voor het gebruik van LCD met Arduino UNO, en de servobibliotheek is voor gebruik van servomotor met Arduino UNO.
# omvatten
Nu worden de LED-anode-pinnen die zijn verbonden met Arduino-pinnen 2 en 5 gedefinieerd als LED1 en LED2.
#define led1 2 #define led2 5
Vervolgens wordt het object voor toegang tot de Liquid Crystal-klasse gedeclareerd met de LCD-pinnen (RS, E, D4, D5, D6, D7) die zijn verbonden met Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Als LCD klaar is, Initialiseer servo-object voor klasse Servo. Initialiseer ook busobject voor klasse Modbus.
Servo servo; Modbus-bus;
Vervolgens wordt voor het opslaan van waarden voor Modbus-communicatie een array gedeclareerd met de drie waarden geïnitialiseerd met nul.
uint16_t modbus_array = {0,0,0};
In de instelfunctie wordt eerst het LCD-scherm ingesteld in de 16x2-modus en wordt een welkomstbericht weergegeven en gewist.
lcd.begin (16,2); // Lcd ingesteld in 16x2-modus lcd.print ("RS-485 Modbus"); // Welkomstbericht lcd.setCursor (0,1); lcd.print ("Arduino Slave"); vertraging (5000); lcd.clear ();
Hierna worden LED1 en LED2 pinnen ingesteld als output pinnen.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
De servopulspen die is aangesloten op PWM-pin 6 van Arduino is bevestigd.
servo.attach (6);
Nu zijn voor de Modbus-communicatie de volgende parameters ingesteld. De eerste '1' staat voor Slave ID, de tweede '1' geeft aan dat het RS-485 gebruikt om gegevens over te dragen en '4' staat voor de RS-485 DE & RE-pin die is aangesloten op Arduino UNO.
bus = Modbus (1,1,4);
De Modbus-slave is ingesteld op 9600 baudrate.
De lus begint met de definitie van buspoll en bus.poll () wordt gebruikt om waarde te schrijven en te ontvangen van de master Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Deze methode wordt gebruikt om te controleren of er gegevens beschikbaar zijn op de seriële poort.
Als er gegevens beschikbaar zijn op de seriële poort, zal de Modbus RTU-bibliotheek het bericht controleren (controleer het apparaatadres, de gegevenslengte en CRC) en voert de vereiste actie uit.
Om bijvoorbeeld een waarde van de master te schrijven of te lezen, moet de ModbusRTU een niet-ondertekende 16-bits integer-array en de lengte ervan van de Master Modbus ontvangen. Deze array bevat de gegevens die van de master zijn geschreven.
In deze tutorial zijn er drie arrays voor LED1, LED2 en Servomotorhoek.
Om eerst AAN of UIT te zetten wordt de LED1 modbus_array gebruikt.
if (modbus_array == 0) // Hangt af van de waarde in modubus_array geschreven door Master Modbus { digitalWrite (led1, LOW); // LED UIT als 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED AAN als een andere waarde dan 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Naast het AAN of UIT zetten wordt de LED2 modbus_array gebruikt.
if (modbus_array == 0) // Hangt af van de waarde in modbus_array geschreven door Master Modbus { digitalWrite (led2, LOW); // LED UIT als 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED AAN als een andere waarde dan 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Naast het instellen van de hoek van de servomotor wordt de gebruikte modbus_array en de waarde afgedrukt op het 16x2 LCD-scherm.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo-hoek:"); lcd.print (pwm); vertraging (200); lcd.clear ();
Hiermee is het programmeren van Arduino UNO voltooid om het als MODBUS Slave te laten werken. De volgende stap is het testen als Modbus Slave.
Testen van de Arduino UNO als Rs485 Modbus Slave
Nadat de circuitverbindingen zijn voltooid en de code is geüpload naar de Arduino UNO, is het tijd om de USB-naar-RS-485-module aan te sluiten op de pc waarop de Simple Modbus Master- software is geïnstalleerd.
Open de apparaatbeheerder en controleer de COM-poort volgens uw pc waarop de USB naar RS-485-module is aangesloten en open daarna de Simply Modbus Master 8.1.1-software.
1. Nadat Simply Modbus Software is geopend, opent u nu de Write-optie.
2. Nadat de Simply Modbus Master Write is geopend. Stel de parameters in
Modus in RTU, COM-poort volgens uw pc (de mijne was COM6), baud op 9600, databits 8, stopbit 1, pariteit geen en slaaf-ID als 1.
3. Stel daarna het eerste register in als 40001 en de te schrijven waarden zijn 3 en de functiecode als 16 (Schrijf Holding Register).
Schrijf daarna 1 tot 40001 (voor LED1 aan) en 1 tot 40002 (voor LED2 aan) en 90 tot 40003 (voor servomotorhoek) en klik vervolgens op de knop VERZENDEN.
U kunt zien dat zowel de LED-status AAN is als de servohoek van 90 graden.
4. Voer daarna 40001 in als 1 en 40002 als 0 en 40003 als 180 en klik op de knop VERZENDEN.
5. Schrijf nu 135 tot 40003 en 40001 als 0 en 40002 als 1.
Dit is hoe RS-485 Modbus kan worden gebruikt in seriële communicatie met Arduino UNO als Slave. In de volgende tutorial zullen we de Arduino Uno gebruiken als master in MODBUS-communicatie.
Vind de volledige code en een demonstratievideo hieronder.