- RS-485 seriële communicatie
- Componenten vereist
- Schakelschema
- Programmering STM32F103C8 & Arduino UNO voor RS485 seriële communicatie
- Testen van de RS485-communicatie tussen STM32F103C8 en Arduino UNO:
De communicatieprotocollen zijn het integrale onderdeel van een digitale elektronica en ingebed systeem. Overal waar een interface is tussen meerdere microcontrollers en randapparatuur, moet het communicatieprotocol worden gebruikt om een heleboel gegevens uit te wisselen. Er zijn veel soorten seriële communicatieprotocollen beschikbaar. De RS485 is een van de seriële communicatieprotocollen en wordt gebruikt in industriële projecten en zware machines.
We leerden in de vorige tutorial over RS485 seriële communicatie tussen Arduino Uno en Arduino Nano . Deze tutorial gaat over het gebruik van een RS-485 seriële communicatie in STM32F103C8 Microcontroller. Als je nieuw bent bij STM32 Microcontroller, begin dan met Aan de slag met STM32 met Arduino IDE: Knipperende LED en controleer hier alle STM32-projecten.
In deze tutorial heeft Master STM32F103C8 drie drukknoppen die worden gebruikt om de status van drie LED's die aanwezig zijn op de Slave Arduino Uno te regelen door middel van RS-485 Seriële communicatie.
Laten we beginnen met het begrijpen van de werking van seriële RS-485-communicatie.
RS-485 seriële communicatie
RS-485 is een asynchroon serieel communicatieprotocol waarvoor geen klok 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 half-duplex communicatie bij gebruik van twee draden en full-duplex communicatie bij gebruik van 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. Het 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 worden aangesloten op het RS-485-protocol.
- Een ander voordeel van de RS-485 is ongevoelig 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-module kan worden aangesloten op elke microcontroller met een seriële poort. Voor het gebruik van de RS-485-module met microcontrollers 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 en half-duplex een gegevensoverdrachtsnelheid van 2,5 heeft. Mbps. Deze module vereist een spanning van 5V.
RS-485 Pin Beschrijving:
Pin Naam |
Omschrijving |
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) |
RS485-module 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
Het gebruik van deze module met STM32F103C8 en Arduino UNO is heel eenvoudig. De hardware seriële poorten van microcontrollers worden gebruikt. De hardware seriële pinnen in STM32 en arduino UNO worden hieronder gegeven.
- In STM32F103C8: pinnen PA9 (TX) en PA10 (RX)
- In Arduino Uno: Pin 0 (RX) & 1 (TX)
Programmeren is ook eenvoudig, gebruik gewoon de Serial.print () om naar RS-485 te schrijven en Serial.Read () om te lezen van RS-485 en de pinnen DE & RE van RS-485 worden LAAG gemaakt om gegevens te ontvangen en worden HOOG gemaakt naar schrijf gegevens naar de RS-485-bus.
Componenten vereist
- STM32F103C8
- Arduino UNO
- MAX485 TTL naar RS485 Converter Module - (2)
- 10K Potentiometer
- Drukknop - 3
- LED - 3
- Weerstanden
- Breadboard
- Verbindingsdraden
Schakelschema
In deze tutorial wordt STM32F103C8 gebruikt als Master met één RS-485-module en Arduino UNO als Slave met een andere RS-485-module.
Circuitverbinding tussen de RS-485 en STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE OPNIEUW |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
EEN |
Aan A van Slave RS-485 |
B. |
Aan B van Slave RS-485 |
STM32F103C8 met drie drukknoppen:
Drie drukknoppen met drie Pull Down Resistor van 10k zijn verbonden met de pinnen PA0, PA1, PA2 van STM32F103C8.
Circuitverbinding tussen de RS-485 en Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE OPNIEUW |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
EEN |
Naar A van Master RS-485 |
B. |
Naar B van Master RS-485 |
Er worden drie leds gebruikt waar anodes van leds met een weerstand van 330 ohm zijn verbonden met pinnen 4, 7, 8 van Arduino UNO en kathode van de leds zijn verbonden met GND.
Programmering STM32F103C8 & Arduino UNO voor RS485 seriële communicatie
Arduino IDE wordt gebruikt voor het ontwikkelen en programmeren van beide kaarten, dwz STM32 en Arduino UNO. Maar zorg ervoor dat je de corresponderende POORT hebt geselecteerd via Tools-> Port and Board van Tools-> Board. Als u problemen of twijfel vindt, raadpleegt u Programmeren van uw STM32 in ARDUINO IDE. De programmering voor deze tutorial bestaat uit twee secties één voor STM32F103C8 (Master) en andere voor Arduino UNO (Slave). Beide codes worden hieronder een voor een uitgelegd.
STM32F103C8 als MasterAan de masterzijde wordt de status van de drukknop gelezen en vervolgens serieel geschreven naar de RS-485-bus via de hardware seriële poorten 1 (PA9, PA10) van STM32F103C8. Ook is er vanaf nu geen externe bibliotheek nodig. De Arduino heeft alle benodigde bibliotheek voor seriële communicatie.
Begin met seriële communicatie met behulp van seriële hardware-pinnen (PA9, PA10) met een buadrate van 9600.
Serial1.begin (9600);
Lees de status van de drukknop op de pinnen PA0, PA1, PA2 van STM32F103C8 en sla deze op in een variabele button1val, button2val, button3val. De waarde is HOOG als de knop wordt ingedrukt en LAAG als deze niet wordt ingedrukt.
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
Voordat de knopwaarden naar de seriële poort worden verzonden, moeten de pinnen DE & RE van RS-485 HOOG zijn die is verbonden met de pin PA3 van STM32F103C8 (om pin PA3 HOOG te maken):
digitalWrite (enablePin, HIGH);
Om die waarden in de seriële poort te zetten en waarden te verzenden, afhankelijk van welke drukknop wordt ingedrukt, gebruikt u if else statement en verzendt u de bijbehorende waarde wanneer op de knop wordt gedrukt.
Als de eerste knop wordt ingedrukt, komt de conditie overeen en wordt de waarde '1' verzonden naar de seriële poort waarop Arduino UNO is aangesloten.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
Evenzo, wanneer knop 2 wordt ingedrukt, wordt de waarde 2 verzonden via de seriële poort en wanneer knop 3 wordt ingedrukt, wordt de waarde 3 verzonden via de seriële poort.
anders if (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
En als er geen knop wordt ingedrukt, wordt de waarde 0 naar Arduino Uno gestuurd.
anders { int num = 0; Serial1.println (num); }
Hiermee is het programmeren voltooid om STM32 als Master te configureren.
Arduino UNO als slaafIn de Slave-kant ontvangt de Arduino UNO een integerwaarde die wordt verzonden van de Master STM32F103C8 die beschikbaar is op de Hardware Serial-poort van de Arduino UNO (P0, 1) waar de RS-485-module is aangesloten.
Lees eenvoudig de waarde en sla deze op in een variabele. Afhankelijk van de ontvangen waarde wordt de bijbehorende LED AAN of UIT gezet, verbonden met Arduino GPIO.
Om de waarden van de Master te ontvangen, maakt u de pinnen DE & RE van de RS-485-module LAAG. Dus de pin-2 (enablePin) van Arduino UNO is LAAG gemaakt.
digitalWrite (enablePin, LOW);
Lees nu gewoon de integer-gegevens die beschikbaar zijn op Serial Port en sla ze op in een variabele.
int ontvangen = Serial.parseInt ();
Afhankelijk van de ontvangen waarde, dwz (0, 1, 2, 3), gaat de corresponderende van de drie LED's branden.
if (ontvang == 1) // Afhankelijk van de ontvangen waarde wordt de bijbehorende LED AAN of UIT gezet { digitalWrite (ledpin1, HIGH); } else if (ontvangen == 2) { digitalWrite (ledpin2, HIGH); } else if (ontvangen == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Hiermee is het programmeren en configureren van Arduino UNO als Slave voltooid. Hiermee zijn ook de complete configuraties voor Arduino UNO en STM32 voltooid. De werkvideo en alle codes zijn aan het einde van deze tutorial bijgevoegd.
Testen van de RS485-communicatie tussen STM32F103C8 en Arduino UNO:
1. Wanneer drukknop-1, die is aangesloten op de Master STM32, wordt ingedrukt, gaat de LED 1 branden die is aangesloten op de Slave Arduino.
2. Wanneer drukknop-2, die is aangesloten op de Master STM32, wordt ingedrukt, gaat de LED 2 branden die is verbonden met de Slave Arduino.
3. Evenzo wanneer Drukknop-3 wordt ingedrukt, gaat de LED 3 AAN die is verbonden met de Slave Arduino.
Hiermee is de seriële RS485-communicatie tussen STM32F103C8 en Arduino UNO voltooid. De Arduino UNO en STM32 boards zijn veel gebruikte boards voor rapid prototyping en we hebben veel nuttige projecten op deze boards gedaan. Als je twijfels hebt of een suggestie voor ons hebt, schrijf en reageer dan hieronder.