Seriel kommunikation er en af de mest almindelige måder at udveksle data mellem elektroniske enheder på. Men når afstande øges, eller miljøet har elektromagnetisk interferens, kan kommunikationssignaler være tilbøjelige til fejl. Det er her, RS485 kommunikationsstandarden kommer i spil, som tilbyder et robust og effektivt alternativ. Arduino, med sin alsidighed, giver os mulighed for at drage fuld fordel af denne protokol på en ret enkel måde.
I denne artikel vil vi se, hvordan RS485-kommunikation kan implementeres mellem flere Arduinoer ved hjælp af moduler baseret på den integrerede MAX485, en chip, der konverterer TTL-signaler (fra Arduino) til RS485 og omvendt. Igennem denne tutorial vil vi dække både de grundlæggende begreber og praktiske eksempler, der giver dig mulighed for at implementere simpleks, halv-dupleks og fuld-dupleks kommunikation mellem Arduino-mikrocontrollere og forklare, hvordan du kan udvide dette kommunikationssystem til at håndtere flere enheder i en enkelt RS485 bus.
Hvad er RS485?
RS485 er en kommunikationsstandard, der er meget udbredt i branchen, kendt for sin robusthed og dens evne til at modstå lang distance transmission, selv i støjende industrimiljøer. I modsætning til andre typer seriel kommunikation, såsom RS232, tillader RS485 at forbinde flere enheder på den samme bus, hvilket gør den ideel til industriel automatisering og kontrolapplikationer.
Denne protokol er modstandsdygtig over for elektromagnetisk støj takket være det faktum, at den bruger en differentielt signalsystem, hvilket betyder, at data sendes over to ledninger, A og B, som er modsatte versioner i spænding. Dette gør det nemt at annullere enhver støj, der optages i kablerne, hvilket sikrer signalintegritet.
En af de største fordele ved RS485 er det understøtter afstande op til 1200 meter og hastigheder op til 35 Mbps over korte afstande, hvilket gør den til en ideel protokol til industri- og kontrolapplikationer i miljøer, hvor lange kabler er nødvendige.
RS485 kommunikationstilstande

I RS485-kommunikation kan vi konfigurere systemet på tre forskellige måder: simpleks, halv-dupleks og fuld-dupleks. Hver enkelt har sine særegenheder og implementeres i overensstemmelse med projektets behov.
Simpel kommunikation
I simplekstilstand går kommunikationen kun i én retning, det vil sige, at én enhed fungerer som transmitter og en anden lignende receiver. Dette er nyttigt i situationer, hvor du blot ønsker at sende eller modtage data uden behov for feedback.
For eksempel kan vi opsætte et system, hvor en Arduino læser en sensorværdi og sender den til en anden enhed, der blot modtager den. I dette tilfælde, da der kun er data, der bevæger sig i én retning, kan visse yderligere kontrolelementer undlades, hvilket gør systemet enklere og mere økonomisk.
Halv-duplex kommunikation
De fleste RS485-applikationer på Arduino er implementeret i halv-dupleks-tilstand, fordi dette kun kræver to tråde, og giver dig mulighed for både at sende og modtage data, men ikke samtidigt. Det vil sige, at hvis en enhed sender data, skal de andre enheder være i modtagetilstand og omvendt.
For at skifte mellem sende- og modtagetilstand skal du bruge ekstra stifter (RE/DE) på MAX485-modulet, som du vil styre fra koden for at bestemme, om enheden skal sende eller modtage på et givet tidspunkt.
Denne tilstand er især nyttig, hvis du har flere enheder på den samme bus, der skal kommunikere med hinanden, men ikke samtidigt.
Fuld duplex kommunikation
I fuld duplex-tilstand kan enheder sende og modtage data på samme tid. Men for at implementere fuld duplex i RS485, to par snoede ledninger, hvilket øger omkostningerne og kompleksiteten af ledninger. Derudover skal du bruge to MAX485-moduler til hver enhed for at administrere sende- og modtagekanalerne separat.
Komponenter, der kræves til RS485-kommunikation med Arduino
For at implementere et RS485-kommunikationssystem på Arduino skal du bruge følgende komponenter:
- En eller flere Arduinoer: Enhver Arduino-model vil gøre det, men i denne tutorial vil vi bruge Arduino UNO og Arduino MEGA som eksempler.
- MAX485 moduler: Disse moduler giver dig mulighed for at konvertere TTL-signaler fra Arduino til RS485 og omvendt. De er meget billige og nemme at finde i butikker som AliExpress eller eBay.
- Termineringsmodstande: En modstand på mellem 120 ohm er normalt placeret i hver ende af bussen for at undgå refleksioner i signalet. På korte afstande er det muligt at undvære dem, men i længere installationer er de essentielle for at bevare signalets integritet.
- Parsnoede kabler: Det anbefales at bruge parsnoede kabler for at minimere elektromagnetisk interferens, især i støjende industrielle miljøer.
Generelt tilslutningsdiagram
Tilslut MAX485-moduler til en Arduino er ret simpelt. De vigtigste ben er A og B, som svarer til RS485-buslinjerne. Disse ben skal tilsluttes alle enheder på bussen. Derudover har modulet RE- og DE-ben, der styrer om modulet er i modtager- eller sendertilstand.
Generelt sker tilslutning af modulerne til Arduino på følgende måde:
- VCC og GND på modulet forbindes til VCC og GND på Arduino.
- Modulets DI (Data Input) forbindes til Arduino'ens TX pin, hvis modulet skal fungere som emitter.
- RO (Receiver Output) på modulet forbindes til RX-pinden på Arduino, hvis modulet skal fungere som modtager.
- DE og RE skal styres fra en Arduino digital pin for at skifte mellem sende- og modtagetilstande.
Hvis du kun skal bruge modulet til at fungere som afsender eller modtager, kan du tilslutte RE og DE direkte til HIGH eller LOW. Til mere kompleks kommunikation, hvor enheden skal skifte mellem at sende og modtage, er det bedst at styre disse ben fra softwaren.
Kodeeksempler til RS485 kommunikation
Nedenfor er flere eksempler, der dækker de forskellige kommunikationskonfigurationer med RS485 på Arduino.
Simpel kommunikation
Udstederkode
For et grundlæggende simplex-system, hvor vi kun har én afsender og én modtager, kan koden for afsenderen se sådan ud:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Modtager kode
Modtageren vil blot læse de data, der ankommer gennem den serielle port:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Halv-duplex kommunikation
I dette eksempel implementerer vi et halv-duplex-system, hvor enheder veksler mellem at sende og modtage data.
Lærer kode
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, HIGH); Serial.write('H'); delay(100); digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Slave kode
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); delay(100); digitalWrite(reDePin, HIGH); Serial.write(data + 1); } }
Fuld duplex kommunikation
For at implementere fuld-duplex-kommunikation vil der være brug for to MAX485-moduler pr. Arduino. Hvert par moduler vil håndtere en datalinje: en til at sende og en til at modtage.
Koden vil ligne de foregående eksempler, men i dette tilfælde vil begge enheder altid sende og modtage samtidigt.
Udvidelse til flere enheder i RS485
RS485 har mulighed for at forbinde op til 32 enheder på en enkelt bus, og i særlige tilfælde kan den nå flere. Det gør det til et fremragende valg til projekter, der involverer flere mikrocontrollere eller enheder. For at identificere hver enkelt af dem på netværket er det almindeligt at implementere en adresse eller et ID for hver enhed.
I dette tilfælde vil masteren sende en besked med adressen på den enhed, den ønsker at kommunikere med, og kun den enhed vil være ansvarlig for at behandle beskeden og give et svar.
Hertil kommer muligheden for at bruge mere komplekse protokoller såsom MODBUS, som gør det muligt at skabe højeffektive og sikre netværk i branchen.
Til hjemmeprojekter eller mindre krævende applikationer kan du blot tildele en identifikator til hver Arduino og få dem til kun at svare på beskeder, der er beregnet til dem.