- RS-485 serieel communicatieprotocol
- RS-485 in Arduino
- Componenten vereist
- Schakelschema
- Programmering Arduino UNO & Arduino Nano voor RS485 seriële communicatie
- LED-helderheid regelen met seriële communicatie RS485
Het kiezen van een communicatieprotocol voor communicatie tussen microcontrollers en randapparatuur is een belangrijk onderdeel van een embedded systeem. Het is belangrijk omdat de algehele prestaties van een ingebedde toepassing afhankelijk zijn van communicatiemiddelen, aangezien het verband houdt met kostenreductie, snellere gegevensoverdracht, lange afstandsdekking enz.
In de vorige tutorials hebben we geleerd over het I2C-communicatieprotocol en SPI-communicatieprotocollen in Arduino. Nu is er een ander serieel communicatieprotocol genaamd RS-485. Dit protocol maakt gebruik van asynchrone seriële communicatie. Het belangrijkste voordeel van RS-485 is de gegevensoverdracht over lange afstand tussen twee apparaten. En ze worden het meest gebruikt in industriële omgevingen met elektrische ruis.
In deze tutorial leren we over RS-485 seriële communicatie tussen twee Arduino's en demonstreren we dit door de helderheid van de LED die is aangesloten op een Slave Arduino van Master Arduino te regelen door ADC-waarden te verzenden via de RS-485-module. Een 10k-potentiometer wordt gebruikt om de ADC-waarden bij Master Arduino te variëren.
Laten we beginnen met het begrijpen van de werking van seriële RS-485-communicatie.
RS-485 serieel communicatieprotocol
RS-485 is een asynchroon serieel communicatieprotocol waarvoor geen klokpuls 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. Hij 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 zijn aangesloten op het RS-485-protocol.
- Een ander voordeel van de RS-485 is dat hij ongevoelig is 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 in Arduino
Voor het gebruik van RS-485 in Arduino is een module met de naam 5V MAX485 TTL naar RS485 nodig die is gebaseerd op Maxim MAX485 IC, omdat deze seriële communicatie over een lange afstand van 1200 meter mogelijk maakt en bidirectioneel is. In half duplex-modus heeft het een gegevensoverdrachtsnelheid van 2,5 Mbps.
5V MAX485 TTL naar RS485-module vereist een spanning van 5V en gebruikt logische niveaus van 5V zodat deze kan worden gekoppeld aan seriële hardware-poorten van microcontrollers zoals Arduino.
Het heeft de volgende kenmerken:
- Bedrijfsspanning: 5V
- MAX485-chip aan boord
- Een laag stroomverbruik voor de RS485-communicatie
- Zendontvanger met beperkte snelheid
- 2P-aansluiting met een spoed van 5,08 mm
- Handige RS-485-communicatiebedrading
- Alle pinnen van de chip die zijn geleid, kunnen worden bestuurd via de microcontroller
- Afmeting bord: 44 x 14 mm
Pin-out van RS-485:
Pin Naam |
Gebruik |
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) |
Deze RS-485-module kan eenvoudig worden gekoppeld aan Arduino. Laten we de hardware seriële poorten van Arduino 0 (RX) en 1 (TX) (in UNO, NANO) gebruiken. Programmeren is ook eenvoudig: gebruik gewoon Serial.print () om naar RS-485 te schrijven en Serial.Read () om van RS-485 te lezen.
Het programmeergedeelte wordt later in detail uitgelegd, maar laten we eerst de vereiste componenten en het schakelschema controleren.
Componenten vereist
- Arduino UNO of Arduino NANO (2)
- MAX485 TTL naar RS485 Converter Module - (2)
- 10K Potentiometer
- 16x2 LCD-scherm
- LED
- Breadboard
- Verbindingsdraden
In deze tutorial wordt Arduino Uno gebruikt als Master en Arduino Nano als Slave. Hier worden twee Arduino-boards gebruikt, dus twee RS-485-modules zijn vereist.
Schakelschema
Circuitverbinding tussen eerste RS-485 en Arduino UNO (Master):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE OPNIEUW |
8 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
EEN |
Aan A van Slave RS-485 |
B. |
Aan B van Slave RS-485 |
Verbinding tussen tweede RS-485 en Arduino Nano (Slave):
RS-485 |
Arduino UNO |
DI |
D1 (TX) |
DE OPNIEUW |
D8 |
R0 |
D0 (RX) |
VCC |
5V |
GND |
GND |
EEN |
Naar A van Master RS-485 |
B. |
Naar B van Master RS-485 |
Circuitverbinding tussen een 16x2 LCD en Arduino Nano:
16x2 LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
Naar middenpen van potentiometer voor contrastregeling van LCD |
RS |
D2 |
RW |
GND |
E. |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
EEN |
+ 5V |
K |
GND |
Een 10K-potentiometer is verbonden met de analoge pin A0 van de Arduino UNO voor het leveren van analoge invoer en een LED is verbonden met pin D10 van Arduino Nano.
Programmering Arduino UNO & Arduino Nano voor RS485 seriële communicatie
Voor het programmeren van beide kaarten wordt Arduino IDE gebruikt. Maar zorg ervoor dat je de corresponderende POORT hebt geselecteerd via Tools-> Port and Board van Tools-> Board.
De volledige code met een demovideo wordt aan het einde van deze tutorial gegeven. Hier leggen we een belangrijk deel van de code uit. Er zijn twee programma's in deze tutorial, een voor Arduino UNO (Master) en een voor Arduino Nano (Slave).
Code uitleg voor Master: Arduino UNO
In de Master-kant, neem gewoon de analoge ingang op pin A0 door de potentiometer te variëren en vervolgens Serial. Schrijf die waarden naar de RS-485-bus via de hardware seriële poorten (0,1) van Arduino UNO.
Om seriële communicatie te starten bij hardware seriële pinnen (0,1), gebruikt u:
Serial.begin (9600);
Om de analoge waarde op de pin A0 van Arduino UNO te lezen en op te slaan in een variabele potval, gebruikt u:
int potval = analogRead (pushval);
Voordat de potval- waarde naar de seriële poort wordt geschreven, moeten de pinnen DE & RE van RS-485 HOOG zijn, die is verbonden met pen 8 van Arduino UNO, zodat pen 8 HOOG wordt gemaakt:
digitalWrite (enablePin, HIGH);
Gebruik de volgende verklaring om die waarden in de seriële poort te zetten die is verbonden met de RS-485-module
Serial.println (potval);
Code-uitleg voor Slave: Arduino NANO
In de Slave-zijde wordt een integer waarde ontvangen van de Master RS-485 die beschikbaar is op de Hardware Serial poort van de Arduino Nano (Pins -0,1). Lees gewoon die waarde en sla ze op in een variabele. De waarden zijn in de vorm van (0-1023). Het wordt dus omgezet in (0-255) omdat de PWM-techniek wordt gebruikt om de helderheid van de led te regelen.
Vervolgens AnalogWrite die geconverteerde waarde naar de LED-pin D10 (het is een PWM-pin). Dus afhankelijk van de PWM-waarde verandert de helderheid van de LED en worden die waarden ook weergegeven in een 16x2 LCD-display.
Om ervoor te zorgen dat de RS-485 van de Slave Arduino de waarden van de Master ontvangt, moet u de pinnen DE & RE van RS-485 LAAG maken. Dus de pin D8 (enablePin) van Arduino NANO is LAAG gemaakt.
digitalWrite (enablePin, LOW);
En om de integer-gegevens die beschikbaar zijn bij Serial Port te lezen en op te slaan in een variabel gebruik
int pwmval = Serial.parseInt ();
Converteer vervolgens de waarde van (0-1023 naar 0-255) en sla ze op in een variabele:
int convert = map (pwmval, 0,1023,0,255);
Schrijf vervolgens de analoge waarde (PWM) naar pin D10 waar de LED-anode is aangesloten:
analogWrite (ledpin, converteren);
Gebruik om die PWM-waarde af te drukken in een 16x2 LCD-scherm
lcd.setCursor (0,0); lcd.print ("PWM VAN MASTER"); lcd.setCursor (0,1); lcd.print (omzetten);
LED-helderheid regelen met seriële communicatie RS485
Wanneer de PWM-waarde is ingesteld op 0 met behulp van een potentiometer, is de LED UIT.
En wanneer de PWM-waarde is ingesteld op 251 met behulp van de potentiometer: de LED is ingeschakeld met volledige helderheid zoals weergegeven in de onderstaande afbeelding:
Dit is dus hoe RS485 kan worden gebruikt voor seriële communicatie in Arduino.