Seriële communicatie is een van de meest gebruikelijke manieren om gegevens uit te wisselen tussen elektronische apparaten. Wanneer de afstanden echter groter worden of de omgeving elektromagnetische interferentie heeft, kunnen communicatiesignalen gevoelig zijn voor fouten. Dat is waar de RS485-communicatiestandaard een rol speelt, die een robuust en effectief alternatief biedt. Dankzij de veelzijdigheid van Arduino kunnen we op een vrij eenvoudige manier optimaal profiteren van dit protocol.
In dit artikel zullen we zien hoe RS485-communicatie kan worden geïmplementeerd tussen verschillende Arduino's met behulp van modules gebaseerd op de geïntegreerde MAX485, een chip die TTL-signalen (van Arduino) omzet naar RS485 en vice versa. In deze zelfstudie behandelen we zowel de basisconcepten als praktische voorbeelden waarmee u simplex-, half-duplex- en full-duplex-communicatie tussen Arduino-microcontrollers kunt implementeren, en leggen we uit hoe u dit communicatiesysteem kunt uitbreiden om meerdere apparaten in één te verwerken. RS485-bus.
Wat is RS485?
De RS485 is een communicatiestandaard die veel wordt gebruikt in de industrie en bekend staat om zijn stevigheid en zijn vermogen om te weerstaan lange afstand transmissie, zelfs in luidruchtige industriële omgevingen. In tegenstelling tot andere vormen van seriële communicatie, zoals RS232, maakt RS485 het mogelijk meerdere apparaten op dezelfde bus aan te sluiten, waardoor het ideaal is voor industriële automatiserings- en besturingstoepassingen.
Dit protocol is bestand tegen elektromagnetische ruis dankzij het gebruik van een differentieel signaleringssysteem, wat betekent dat gegevens over twee draden worden verzonden, A en B, die qua spanning tegengestelde versies zijn. Hierdoor kan eventuele ruis die in de kabels wordt opgepikt eenvoudig worden geannuleerd, waardoor de signaalintegriteit wordt gewaarborgd.
Een van de belangrijkste voordelen van RS485 is dat ondersteunt afstanden tot 1200 meter en snelheden tot 35 Mbps over korte afstanden, waardoor het een ideaal protocol is voor industriële en besturingstoepassingen in omgevingen waar lange bekabeling noodzakelijk is.
RS485-communicatiemodi
Bij RS485-communicatie kunnen we het systeem op drie verschillende manieren configureren: simplex, half-duplex en full-duplex. Elk ervan heeft zijn bijzonderheden en wordt geïmplementeerd volgens de behoeften van het project.
Simplex-communicatie
In de simplexmodus verloopt de communicatie slechts in één richting, dat wil zeggen dat één apparaat als zodanig fungeert uitgevende instelling en nog een zoals receptor. Dit is handig in situaties waarin u alleen gegevens wilt verzenden of ontvangen zonder dat u feedback nodig heeft.
We kunnen bijvoorbeeld een systeem opzetten waarbij een Arduino een sensorwaarde leest en deze naar een ander apparaat stuurt dat deze gewoon ontvangt. In dit geval kunnen bepaalde aanvullende bedieningselementen achterwege blijven, omdat er slechts gegevens in één richting worden verzonden, waardoor het systeem eenvoudiger en economischer wordt.
Half-duplexcommunicatie
De meeste RS485-toepassingen op Arduino zijn geïmplementeerd in de half-duplex-modus, omdat dit alleen vereist is twee dradenen stelt u in staat gegevens te verzenden en te ontvangen, maar niet tegelijkertijd. Dat wil zeggen dat als één apparaat gegevens verzendt, de andere apparaten zich in de ontvangstmodus moeten bevinden, en omgekeerd.
Gebruik om te schakelen tussen de zend- en ontvangstmodi extra pinnen (RE/DE) op de MAX485-module, die u kunt bedienen via de code om te bepalen of het apparaat op een bepaald moment moet verzenden of ontvangen.
Deze modus is vooral handig als je meerdere apparaten op dezelfde bus hebt die met elkaar moeten communiceren, maar niet tegelijkertijd.
Full-duplexcommunicatie
In de full-duplexmodus kunnen apparaten tegelijkertijd gegevens verzenden en ontvangen. Om echter full-duplex in RS485 te implementeren, twee paar gedraaide draden, wat de kosten en complexiteit van de bedrading verhoogt. Bovendien hebt u voor elk apparaat twee MAX485-modules nodig om de zend- en ontvangstkanalen afzonderlijk te beheren.
Componenten die nodig zijn voor RS485-communicatie met Arduino
Om een RS485-communicatiesysteem op Arduino te implementeren, hebt u de volgende componenten nodig:
- Eén of meerdere Arduino's: Elk Arduino-model is geschikt, maar in deze tutorial zullen we gebruiken Arduino UNO en Arduino MEGA als voorbeelden.
- MAX485-modules: Met deze modules kunt u TTL-signalen van Arduino naar RS485 omzetten en omgekeerd. Ze zijn erg goedkoop en gemakkelijk te vinden in winkels zoals AliExpress of eBay.
- Afsluitweerstanden: Aan elk uiteinde van de bus wordt meestal een weerstand van tussen de 120 ohm geplaatst om reflecties in het signaal te voorkomen. Op korte afstanden is het mogelijk om het zonder te doen, maar bij langere installaties zijn ze essentieel om de integriteit van het signaal te behouden.
- Twisted-pair-kabels: Het wordt aanbevolen om twisted pair-kabels te gebruiken om elektromagnetische interferentie te minimaliseren, vooral in luidruchtige industriële omgevingen.
Algemeen aansluitschema
Sluit MAX485-modules aan naar een Arduino is vrij eenvoudig. De belangrijkste pinnen zijn A en B, die overeenkomen met de RS485-buslijnen. Deze pinnen moeten op alle apparaten op de bus worden aangesloten. Bovendien heeft de module RE- en DE-pinnen die bepalen of de module zich in de ontvanger- of zendermodus bevindt.
Over het algemeen gaat het aansluiten van de modules op de Arduino als volgt:
- VCC en GND van de module verbinden met VCC en GND op de Arduino.
- DI (Data Input) van de module wordt aangesloten op de TX-pin van de Arduino als de module als zender moet fungeren.
- RO (Receiver Output) van de module wordt aangesloten op de RX-pin van Arduino als de module als ontvanger moet fungeren.
- DE en RE moeten worden bestuurd vanaf een Arduino digitale pin om te schakelen tussen verzend- en ontvangstmodi.
Als je de module alleen nodig hebt om als zender of ontvanger te functioneren, kun je RE en DE direct op HIGH of LOW aansluiten. Voor complexere communicatie waarbij het apparaat moet schakelen tussen zenden en ontvangen, kun je deze pinnen echter het beste vanuit de software bedienen.
Codevoorbeelden voor RS485-communicatie
Hieronder vindt u enkele voorbeelden van de verschillende communicatieconfiguraties met RS485 op Arduino.
Simplex-communicatie
Uitgeverscode
Voor een eenvoudig simplexsysteem waarbij we slechts één afzender en één ontvanger hebben, kan de code voor de afzender er als volgt uitzien:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Ontvangercode
De ontvanger leest eenvoudigweg de gegevens die via de seriële poort binnenkomen:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Half-duplexcommunicatie
In dit voorbeeld implementeren we een half-duplexsysteem waarbij apparaten afwisselend gegevens verzenden en ontvangen.
Docentencode
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); } }
Slavecode
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); } }
Full-duplexcommunicatie
Om full-duplex communicatie te implementeren zijn twee MAX485-modules per Arduino nodig. Elk paar modules kan één datalijn verwerken: één voor zenden en één voor ontvangen.
De code zal vergelijkbaar zijn met de vorige voorbeelden, maar in dit geval zouden beide apparaten altijd tegelijkertijd zenden en ontvangen.
Uitbreiding naar meerdere apparaten in RS485
RS485 heeft de mogelijkheid om maximaal 32 apparaten op één enkele bus aan te sluiten, en in speciale gevallen kan het zelfs meer bereiken. Dat maakt het een uitstekende keuze voor projecten waarbij meerdere microcontrollers of apparaten betrokken zijn. Om elk apparaat op het netwerk te identificeren, is het gebruikelijk om voor elk apparaat een adres of ID te implementeren.
In dit geval stuurt de master een bericht met het adres van het apparaat waarmee hij wil communiceren, en alleen dat apparaat is verantwoordelijk voor het verwerken van het bericht en het geven van een antwoord.
Daarbij komt de mogelijkheid tot gebruik complexere protocollen zoals MODBUS, waarmee zeer efficiënte en veilige netwerken in de industrie kunnen worden gecreëerd.
Voor thuisprojecten of minder veeleisende toepassingen kunt u eenvoudigweg een identificatie aan elke Arduino toewijzen en ze alleen laten reageren op berichten die voor hen bedoeld zijn.