- RS-485 Seriell kommunikasjon
- Kobler RS-485 med Arduino
- USB til RS-485 omformermodul
- Bare Modbus Master Software
- Verktøy kreves
- Kretsdiagram
- Programmering Arduino UNO for RS-485 MODBUS Slave
- Testing av Arduino UNO som Rs485 Modbus Slave
Modbus er en seriell kommunikasjonsprotokoll som ble oppdaget av Modicon i 1979, og den brukes til å overføre data over serielle linjer mellom industrielle elektroniske enheter. RS-485 Modbus bruker RS-485 for overføringslinjer. Det skal bemerkes at Modbus er en programvareprotokoll og ikke en maskinvareprotokoll. Den er delt inn i to deler som Modbus Master og Modbus Slave. I RS-485 Modbus-nettverk er det en Master og 127 Slaver hver med unik adresse fra 1 til 127. I dette MAX485 Arduino- prosjektet vil vi bruke Arduino Uno som Slave for seriell kommunikasjon.
Modbus brukes mest i PLCer (programmerbare logikkontroller). Og bortsett fra dette, brukes Modbus også i helsevesen, transport, hjemmeautomasjon etc. Modbus har 255 funksjonskoder, og det er hovedsakelig tre populære versjoner av Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Hva er forskjellen mellom Modbus ASCII og Modbus RTU?
Modbus RTU og Modbus ASCII snakker den samme protokollen. Den eneste forskjellen er at byte som overføres over ledningen blir presentert som binær med RTU og som lesbar ASCII med Modbus RTU. Modbus RTU vil bli brukt i denne opplæringen.
Denne opplæringen handler om å bruke RS-485 Modbus-kommunikasjon med Arduino UNO som slave. Her installerer vi Simply Modbus Master Software i PC og styrer to lysdioder og Servomotor ved å bruke RS-485 som overføringslinje. Disse lysdiodene og servomotoren er koblet til Slave Arduino og styres ved å sende verdier ved hjelp av Master Modbus Software. Siden denne opplæringen bruker RS-485, anbefales det å først gå gjennom RS485 seriell kommunikasjon mellom Arduino Uno og Arduino Nano. RS485 kan også brukes med andre kontrollere for seriell kommunikasjon:
- RS-485 Seriell kommunikasjon mellom Raspberry Pi og Arduino UNO
- Seriell kommunikasjon mellom STM32F103C8 og Arduino UNO ved bruk av RS-485
La oss begynne med å utforske litt bakgrunn om RS-485 og Modbus. Lær også mer om ulike serielle kommunikasjonsprotokoller her.
RS-485 Seriell kommunikasjon
RS-485 er en asynkron seriell kommunikasjonsprotokoll som ikke krever klokke. Den bruker en teknikk som kalles differensial signal for å overføre binære data fra en enhet til en annen.
Så hva er denne differensielle signaloverføringsmetoden ??
Metoden for differensial signal fungerer ved å skape en differensialspenning ved å bruke en positiv og negativ 5V. Den gir en halv-dupleks kommunikasjon når du bruker to ledninger, og Full-dupleks krever fire fires ledninger.
Ved å bruke denne metoden:
- RS-485 støtter høyere dataoverføringshastighet på maksimalt 30 Mbps.
- Det gir også maksimal dataoverføringsavstand sammenlignet med RS-232-protokollen. Den overfører data opp til 1200 meter maksimalt.
- Den største fordelen med RS-485 i forhold til RS-232 er flere slave med enkelt Master mens RS-232 støtter bare en enkelt slave.
- Kan ha maksimalt 32 enheter koblet til RS-485-protokollen.
- En annen fordel med RS-485 er immun mot støyen når de bruker differensial signalmetode for å overføre.
- RS-485 er raskere sammenlignet med I2C-protokollen.
Kobler RS-485 med Arduino
RS-485-modulen kan kobles til hvilken som helst mikrokontroller som har seriell port. For bruk av RS-485-modul med mikrokontrollere, er det nødvendig med en modul kalt 5V MAX485 TTL til RS485 som er basert på Maxim MAX485 IC da den tillater seriell kommunikasjon over lang avstand på 1200 meter. Den er toveis og halv dupleks og har dataoverføringshastighet på 2,5 Mbps. Denne modulen krever en spenning på 5V.
Pin-Out av RS-485:
Pin-navn |
Pin Beskrivelse |
VCC |
5V |
EN |
Ikke-inverterende mottakerinngang Ikke-inverterende driverutgang |
B |
Inverterende mottakerinngang Inverterende driverutgang |
GND |
GND (0V) |
R0 |
Mottaker ut (RX-pin) |
RE |
Mottakerutgang (LAV-aktivert) |
DE |
Driverutgang (HIGH-Enable) |
DI |
Driverinngang (TX-pin) |
USB til RS-485 omformermodul
Dette er en USB til RS485 Converter Adapter-modul som støtter WIN7, XP, Vista, Linux, Mac OS og gir et brukervennlig RS485-grensesnitt ved hjelp av COM-port i datamaskinen . Denne modulen er plug-and-play-enhet . Det er ingen kommandostrukturer, det som sendes til Virtual COM-porten blir automatisk konvertert til RS485 og omvendt. Modulen er helt selvdrevet fra USB-bussen. Så det er ikke behov for ekstern strømforsyning for drift.
Den vises som en seriell / COM-port og er tilgjengelig fra applikasjoner eller hyperterminal. Denne omformeren gir halv-dupleks RS-485-kommunikasjon. Baud-hastighetsområdet er 75 bps til 115200 bps, maksimalt opptil 6 Mbps.
For å bruke denne enheten er det forskjellige Modbus-programvare tilgjengelig på internett. I denne opplæringen brukes en programvare som heter Simply Modbus Software.
Bare Modbus Master Software
Modbus Master-programvare er nødvendig for å sende data til slave Modbus RS-485 Arduino-enhet via COM.
Simply Modbus Master er en datakommunikasjonstestprogramvare. Du kan laste ned Simply Modbus Master fra den gitte lenken og lære mer om den ved å henvise til programvarehåndbok.
Før du bruker programvaren, er det viktig å bli kjent med følgende terminologier.
Slave-ID:
Hver slave i et nettverk tildeles en unik enhetsadresse fra 1 til 127. Når masteren ber om data, er den første byten den sender Slave-adressen. På denne måten vet hver slave etter den første byten om han eller hun skal ignorere meldingen.
Funksjonskode:
Den andre byten som sendes av mesteren er Funksjonskoden. Dette tallet forteller slaven hvilken tabell du vil få tilgang til og om du skal lese fra eller skrive til tabellen.
Støttede Register Funksjonskoder:
Funksjonskode |
Handling |
Tabellnavn |
04 (04 hex) |
Lese |
Analoge inngangsregistre |
03 (03 hex) |
Lese |
Analog Output Holding Registers |
06 (06 sekskant) |
Skriv singel |
Analogt utdataholdingsregister |
16 (10 sekskant) |
Skriv flere |
Analog Output Holding Registers |
Støttede spolefunksjonskoder:
Funksjonskode |
Handling |
Tabellnavn |
02 (02 sekskant) |
Lese |
Diskrete inngangskontakter |
01 (01 hex) |
Lese |
Diskrete utgangsspoler |
05 (05 hex) |
Skriv singel |
Diskret utgangsspole |
15 (0F sekskant) |
Skriv flere |
Diskrete utgangsspoler |
CRC:
CRC står for Cyclic Redundancy check. Det er to byte lagt til på slutten av hver Modbus-melding for feilregistrering.
Verktøy kreves
Maskinvare
- Arduino UNO
- MAX-485 TTL til RS-485 omformermodul
- USB til RS-485 omformermodul
- LED (2)
- 1k-motstand (2)
- 16x2 LCD-skjerm
- 10k potensiometer
- Servomotor SG-90
Programvare
- Bare Modbus Master
Kretsdiagram
Kretsforbindelse mellom MAX-485 TTL til RS-485 omformermodul og Arduino UNO:
Arduino UNO |
MAX-485 TTL til RS-485 omformermodul |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Kretsforbindelse mellom MAX-485 TTL til RS-485-modul og USB til RS-485-omformer:
MAX-485 TTL til RS-485 Konverteringsmodul |
USB til RS-485-modul Koblet til PC |
EN |
EN |
B |
B |
Kretsforbindelser mellom Arduino UNO og 16x2 LCD-skjerm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
For å kontrollere pin av potensiometer for kontrast / lysstyrkekontroll av 16x2 LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
1. 3 |
EN |
+ 5V |
K |
GND |
Kretsforbindelse mellom 2 lysdioder, servomotor og Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Servo motor |
2 |
Anode gjennom 1k motstand |
- |
- |
5 |
- |
Anode gjennom 1k motstand |
- |
6 |
- |
- |
PWM-pinne (oransje) |
+ 5V |
- |
- |
+ 5V (RØD) |
GND |
Katode GND |
Katode GND |
GND (brun) |
Programmering Arduino UNO for RS-485 MODBUS Slave
Arduino UNO er konfigurert som Modbus Slave. Også, Arduino UNO er festet med to lysdioder og en servomotor. Så slaven Arduino styres fra Master Modbus Software. Kommunikasjonen mellom Arduino UNO og Modbus Master Software oppnås ved hjelp av RS-485-modulen. For å koble den til PC, brukes USB til RS-485 omformermodulen. Og Arduino UNO med MAX-485 TTL til RS-485 omformermodul, hele oppsettet vil se filen følger:
For bruk av Modbus i Arduino UNO, et bibliotek
I utgangspunktet inkluderer det nødvendige biblioteket. ModbusRTU-biblioteket er for bruk av RS-485 Modbus-kommunikasjon, og flytende krystallbiblioteket er for bruk av LCD med Arduino UNO, og servobiblioteket er for bruk av Servomotor med Arduino UNO.
#inkludere
Nå er LED-anodepinnene som er koblet til Arduino-pinner 2 og 5 definert som LED1 og LED2.
#define led1 2 #define led2 5
Deretter blir objektet for tilgang til flytende krystallklasse erklært med LCD-pinnene (RS, E, D4, D5, D6, D7) som er koblet til Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Når LCD-skjermen er ferdig, initialiser du servoobjektet for klasse Servo. Initialiser også bussobjekt for klasse Modbus.
Servo servo; Modbus buss;
Neste for lagring av verdier for Modbus-kommunikasjon blir en matrise erklært med de tre verdiene initialisert med null.
uint16_t modbus_array = {0,0,0};
I oppsettfunksjonen er LCD-skjermen først satt i 16x2-modus og en velkomstmelding vises og tømmes.
lcd.begin (16,2); // LCD satt i 16x2 modus lcd.print ("RS-485 Modbus"); // Velkomstmelding lcd.setCursor (0,1); lcd.print ("Arduino Slave"); forsinkelse (5000); lcd.clear ();
Etter dette er LED1 og LED2 pinner satt som utgangspinner.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Servopulsstiften koblet til PWM-stift 6 på Arduino er festet.
servo.attach (6);
Nå for Modbus-kommunikasjonen er følgende parametere satt. Første '1' representerer slave-ID, andre '1' representerer at den bruker RS-485 for å overføre data, og '4' representerer RS-485 DE&RE-pin koblet til Arduino UNO.
buss = Modbus (1,1,4);
Modbus-slaven er satt til 9600 baudrate.
Sløyfen starter med definisjonen av bus poll og bus.poll () brukes til å skrive og motta verdi fra master Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Denne metoden brukes til å sjekke om det er data tilgjengelig i den serielle porten.
Hvis det er data tilgjengelig i seriell port, vil Modbus RTU-biblioteket sjekke meldingen (sjekk enhetsadressen, datalengden og CRC) og utføre den nødvendige handlingen.
For eksempel for å skrive eller lese hvilken som helst verdi fra master, må ModbusRTU motta et usignert 16-biters heltall array og lengden fra Master Modbus. Denne matrisen bærer dataene som er skrevet fra mesteren.
I denne opplæringen er det tre matriser for LED1, LED2 og Servomotorvinkel.
Først for å slå PÅ eller AV, brukes LED1 modbus_array.
hvis (modbus_array == 0) // Avhenger av verdien i modubus_array skrevet av Master Modbus { digitalWrite (led1, LOW); // LED AV hvis 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } annet { digitalWrite (led1, HIGH); // LED PÅ hvis annen verdi enn 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Neste for å slå PÅ eller AV, brukes LED2 modbus_array.
hvis (modbus_array == 0) // Avhenger av verdien i modbus_array skrevet av Master Modbus { digitalWrite (led2, LOW); // LED AV hvis 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } annet { digitalWrite (led2, HIGH); // LED PÅ hvis annen verdi enn 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Ved siden av å angi vinkelen på servomotoren blir modbus_array brukt og verdien skrevet ut i 16x2 LCD-skjermen.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Servo vinkel:"); lcd.print (pwm); forsinkelse (200); lcd.clear ();
Dette avslutter programmeringen av Arduino UNO for å jobbe som MODBUS Slave. Det neste trinnet vil være å teste det som Modbus Slave.
Testing av Arduino UNO som Rs485 Modbus Slave
Etter at kretsforbindelsene er fullført og koden er lastet opp til Arduino UNO, er det på tide å koble USB til RS-485-modulen med PCen der Simple Modbus Master- programvaren er installert.
Åpne enhetsbehandling og sjekk COM-porten i henhold til PC-en din der USB til RS-485-modulen er koblet til, og åpne deretter Simply Modbus Master 8.1.1-programvaren.
1. Når Simply Modbus Software er åpnet, åpner du nå Skriv-alternativet.
2. Etter at Simply Modbus Master Write er åpnet. Still inn parametrene
Modus i RTU, COM-port i henhold til PCen din (min var COM6), Baud på 9600, Data Bits 8, Stop bit 1, Parity None og Slave ID som 1.
3. Etter det angitt registreres først som 40001 og verdiene som skal skrives er 3 og funksjonskoden som 16 (Write Holding Register).
Deretter skriver du 1 til 40001 (For LED1 på) og 1 til 40002 (For LED2 på) og 90 til 40003 (For Servomotorvinkel) og deretter klikke SEND-knappen.
Du kan se at både LED-status er PÅ og servovinkel på 90 grader.
4. Deretter angir du 40001 som 1 og 40002 som 0 og 40003 som 180 og klikker SEND-knappen.
5. Skriv nå 135 til 40003 og 40001 som 0 og 40002 som 1.
Slik kan RS-485 Modbus brukes i seriell kommunikasjon med Arduino UNO som slave. I neste opplæring vil vi bruke Arduino Uno som mester i MODBUS-commination.
Finn den fullstendige koden og en demonstrasjonsvideo nedenfor.