Arduino

RS485-communicatie met Arduino

Laatst bijgewerkt: 13/02/2020

We zullen uitleggen hoe de RS485-modules te gebruiken en we zullen verschillende voorbeelden implementeren om 2 Arduino's via RS485 te communiceren, we zullen de simplex-, full-duplex- en halfduplexcommunicatie ontwikkelen.

De industriële standaard RS485 of ook bekend als EIA-485 is een fysieke-laagstandaard volgens het OSI-model. Dat wil zeggen, het stelt geen normen of beperkingen aan de inhoud, vorm of codering van de verzonden berichten. Met behulp van RS485 als fysieke laag is het mogelijk om een ​​industrieel veldbustype MODBUS te implementeren voor communicatie tussen industriële apparatuur of DMX voor lichtregeling onder andere toepassingen. De RS485-standaard wordt veel gebruikt vanwege zijn robuustheid, eenvoudige implementatie en goede prestaties.

In deze tutorial werken we aan het onderwerp Seriële communicatie a over RS485 met Arduino.

RS485 wordt gedefinieerd als een meerpunts differentieel buscommunicatiesysteem, het is ideaal voor het verzenden met gemiddelde snelheden over lange afstanden (35 Mbit / s tot 10 meter en 100 kbit / s in 1200 meter) en via luidruchtige kanalen, omdat bij gebruik Differentiële spanningen verminderen de elektrische ruis die in de transmissielijn optreedt. Het fysieke transmissiemedium (bedrading) is de twisted pair-kabel die maximaal 32 stations ondersteunt in 1 enkele bus, met een maximale lengte van 1200 meter die werkt tussen 300 en 19.200 bit / s onder half-duplex communicatie (half-duplex).

Voor de implementatie van de voorbeelden van de zelfstudie gebruiken we de RS485-modules voor seriële TTL

De module heeft toegang tot alle pinnen van de MAX485-chip en heeft alle extra componenten voor de juiste werking. Pinnen "A" en "B" kunnen ook worden aangesloten vanaf het aansluitblok.

Pinnen A en B zijn waar de gegevens worden verzonden en ontvangen, B is de ontkenning in spanning van A, dezelfde gegevens worden verzonden maar in lijn B worden geweigerd, op deze manier kunnen beide signalen worden afgetrokken en de ruis worden geëlimineerd. blijf alleen met het datasignaal. De manager van deze differentiële transmissie is de MAX485-chip.

Vanuit het oogpunt van de microcontroller of Arduino werkt de communicatie als een seriële communicatie, we werken met de RX- en TX-pinnen; en afhankelijk van het type verbinding kan nog een pin worden gebruikt om aan te geven of we gegevens verzenden of ontvangen.

Gebruik de RS485-module als zender

In deze configuratie werkt de module alleen als een zender, zodat de module weet dat de A B-uitgang zich zal gedragen als gegevensuitvoer, en dat de RE- en DE-pinnen moeten worden aangesloten op 5V. Vanuit de Arduino worden de gegevens verzonden naar de pin DI (Data Input) van de module en dit zal de data verzenden via de pins AB

Gebruik de RS485-module als een ontvanger

Bij het aansluiten van de pinnen RE en DE gedraagt de module zich als een ontvanger, en de door AB ontvangen gegevens zullen aanwezig zijn in de RO (Receiver Output) pin, die de RO-pin van de module verbindt met de RX van onze Arduino, we kunnen de ontvangen data lezen.

Ex 1. Simplex-communicatie tussen twee Arduinos door RS485

Een simplexcommunicatie is een unidirectionele communicatie, in dit geval gedraagt een Arduino zich alleen als een zender en de andere alleen als een ontvanger, op programmeerniveau lijkt het alsof we met een seriële communicatie werken, maar in slechts één richting. De ene stuurt en de andere ontvangt alleen gegevens.

Laten we een voorbeeld zien:

Van een Arduino via een potentiometer zullen we een servomotor verplaatsen die in een andere Arduino wordt aangesloten, slechts twee kabels (uitgangen A en B van de RS485) zullen zich bij de Arduinos aansluiten, als de afstand lang is, wordt het aanbevolen om een gedraaide kabel te gebruiken.

De code van de zender is de volgende: Simplex/zender.ino
De ontvanger Arduino-code is de volgende: Simplex/ontvanger.ino

Zoals het wordt waargenomen is een eenvoudige seriële communicatie, in de Arduino-zender wordt de aflezing van de potentiometer gemaakt, geschaald en serieel verzonden, in de ontvanger ontvangen we de gegevens en bewegen we de servomotor.

Op deze manier kunnen we een communicatie tussen twee Arduino maken, maar in één richting, om het in twee richtingen te doen, hebben we twee vormen, half-duplex en full-duplex

Ex 2. Full-duplex communicatie tussen twee Arduino's

In dit geval moeten we nog een paar regels toevoegen, in totaal zouden ze lid worden van de Arduino 4-lijnen, één paar is te verzenden (TX) en nog een paar te ontvangen (RX).

In het volgende voorbeeld van een Arduino verzenden we niet alleen gegevens om een servomotor te verplaatsen maar ontvangen we ook gegevens van een sensor, we zullen een potentiometer gebruiken om de sensor te simuleren.

De verbindingen zouden de volgende zijn:

Aan de Arduino links noemen we het Master, omdat het de hoofd Arduino is en die alle orders beheert, terwijl de tweede Arduino Slave wordt genoemd; dit is niet specifiek de definitie van Master / Slave in een RS485-communicatie, maar we zullen deze denominaties gebruiken om te weten waarnaar Arduino verwijst.

De code van de Arduino Master : Full-duplex/master.ino
De code van de Slave Arduino : Full-duplex/slave.ino

Zoals opgemerkt, is een communicatieframe tot stand gebracht:
[Frame start] [Functie] [Waarde] [Einde van frame]

In ons geval is de framestart het teken 'A', de functie is het teken S of L om aan te geven dat we de servo gaan verplaatsen of om een sensorwaarde te vragen, de [waarde] zal alleen aanwezig zijn als de functie een gegevens, en het einde van de plot dat we gebruiken is het karakter F. Enkele voorbeelden van deze plot zijn: "IS90F", "IS120F", "ILF", enz.

De slave interpreteert dit frame en voert de overeenkomstige functie uit, als het een functie is die moet reageren, is het responsframe:

[Frame start] [Waarde] [Einde van frame], zoals "i865f", "i64f"

Ex 3. Half-duplex communicatie tussen twee Arduinos

In een halfduplexcommunicatie wordt een enkel kanaal gebruikt om te communiceren, tegelijkertijd worden de gegevens via het kanaal verzonden en op een ander tijdstip worden gegevens ontvangen, maar we kunnen nooit tegelijkertijd verzenden en ontvangen.

Voor het uitvoeren van deze communicatie moeten de DE- en RE-pinnen van de RS485-module op de Arduino worden aangesloten, waarmee we vanuit het programma de module als zender of ontvanger kunnen instellen

Het volgende voorbeeld doet hetzelfde als het vorige voorbeeld alleen dat deze keer een rs485-module wordt gebruikt door Arduino en een paar kabels om te communiceren.

De verbindingen zouden de volgende zijn:

Net als in het vorige geval, zal de Arduino aan de linkerkant de meester zijn en de rechter aan de rechterkant de slaaf.

De code van de Arduino Master : half-duplex/master.ino
De code van de Slave Arduino : half-duplex/slave.ino

Omdat de code wordt waargenomen elke keer dat we gegevens gaan schrijven of lezen, activeren of deactiveren we respectievelijk de pin die is verbonden met DE en RE van de RS485-module.

De master heeft altijd de lijn actief als een transmissie, die op elk moment kan schrijven, terwijl de slave zich altijd in de ontvangstmodus bevindt, luisterend naar de gegevens die hem bereiken. Als de master een reactie van de slave nodig heeft, moet hij na het verzenden van de query naar de ontvangstmodus gaan zodat de slave het kanaal kan gebruiken om de gegevens te verzenden. Zodra het antwoord is voltooid, moet de master het kanaal opnieuw kunnen verzenden .

Ex 4. Half-duplex communicatie tussen verschillende arduinos.

Dit is de meest gebruikte configuratie, alle Arduino's zijn verbonden met dezelfde RS485-bus, één Arduino is meester en alle anderen zijn slaven. Elke slaaf heeft een adres dat hem identificeert, de meester zodat hij kan communiceren met een slaaf gebruikt dit adres. De master verzendt de informatie via de bus en alleen de slave met het juiste adres is degene die de gegevens interpreteert of verwerkt.

Hieronder tonen we hetzelfde voorbeeld waaraan eerder is gewerkt, maar gericht combineert een multipoint-verbinding.

De verbindingen zijn de volgende

Het voorbeeld wordt slechts voor één slave getoond, maar voor de andere slaves zijn de verbindingen hetzelfde en in de code hoeft u alleen rekening te houden met de adressen van de slaves.

Het verschil met de vorige gevallen is in het frame voor communicatie, nu is het noodzakelijk om het adres van de slaaf te verzenden, het frame als volgt achterlatend:

[Frame start] [Adres] [Functie] [Waarde] [Einde van frame]

Het adres is een geheel getal en geeft aan met welke slave we willen communiceren. Voorbeelden van dit frame zijn: "I101S90F", "I25S120F", "I223LF", enz.

De slave interpreteert dit frame en als het overeenkomt met zijn adres voert het de corresponderende functie uit, als het een functie is die moet reageren, voegt het ook zijn adres toe in het responsframe, zodat de master weet dat de overeenkomstige slave heeft gereageerd. Het responsframe is van het formulier:

[Frame start] [Adres] [,] [Waarde] [Einde van frame]

In dit geval tussen het adres en de waarde die we een komma verzenden als scheidingsteken, omdat beide numerieke waarden zijn, zouden enkele rastervoorbeelden zijn: "i101,865f", "i26,64f"

De code van de Arduino Master : Half-duplex met meerdere arduino's/master.ino
De code van de Slave Arduino : Half-duplex met meerdere arduino's/slave.ino

De code voor een tweede slave als u wilt dat deze dezelfde functie heeft, in de code hoeft u alleen het adres te wijzigen.

De code van dit project kan je hier downloaden.