- Comunicare serial RS-485
- Componente necesare
- Diagrama circuitului
- Programare STM32F103C8 & Arduino UNO pentru comunicare serială RS485
- Testarea comunicației RS485 între STM32F103C8 și Arduino UNO:
Protocoalele de comunicații fac parte integrantă dintr-o electronică digitală și un sistem încorporat. Oriunde există interfață a mai multor microcontrolere și periferice, protocolul de comunicație trebuie utilizat pentru a face schimb de date. Există multe tipuri de protocol de comunicații seriale disponibile. RS485 este unul dintre protocolurile de comunicații seriale și este utilizat în proiecte industriale și utilaje grele.
Am aflat despre comunicarea în serie RS485 între Arduino Uno și Arduino Nano în tutorialul anterior . Acest tutorial este despre utilizarea unei comunicații seriale RS-485 în microcontrolerul STM32F103C8. Dacă nu sunteți nou în microcontrolerul STM32, începeți cu Noțiuni introductive despre STM32 folosind Arduino IDE: LED intermitent și verificați aici toate proiectele STM32.
În acest tutorial Master STM32F103C8 are trei butoane care sunt utilizate pentru a controla starea a trei LED-uri prezente la Slave Arduino Uno utilizând comunicarea Serială RS-485.
Să începem prin a înțelege funcționarea comunicării seriale RS-485.
Comunicare serial RS-485
RS-485 este un protocol de comunicare serial asincron care nu necesită ceas. Folosește o tehnică numită semnal diferențial pentru a transfera date binare de la un dispozitiv la altul.
Deci, ce este această metodă diferențială de transfer de semnal ??
Metoda semnalului diferențial funcționează prin crearea unei tensiuni diferențiale utilizând un 5V pozitiv și negativ. Oferă o comunicare Half-Duplex atunci când se utilizează două fire și comunicare Full-Duplex atunci când se utilizează patru fire.
Prin utilizarea acestei metode:
- RS-485 acceptă o rată mai mare de transfer de date de maximum 30 Mbps.
- De asemenea, oferă distanța maximă de transfer de date în comparație cu protocolul RS-232. Transferă date până la 1200 de metri maximum.
- Principalul avantaj al RS-485 față de RS-232 este sclavul multiplu cu un singur Master, în timp ce RS-232 acceptă numai un singur sclav.
- Poate avea maximum 32 de dispozitive conectate la protocolul RS-485.
- Un alt avantaj al RS-485 este imun la zgomot, deoarece utilizează metoda semnalului diferențial pentru transfer.
- RS-485 este mai rapid în comparație cu protocolul I2C.
Modulul RS-485 poate fi conectat la orice microcontroler care are port serial. Pentru utilizarea modulului RS-485 cu microcontrolere este necesar un modul numit 5V MAX485 TTL la RS485 care se bazează pe Maxim MAX485 IC deoarece permite comunicarea serială pe distanțe mari de 1200 de metri și este bidirecțional și semi-duplex are o rată de transfer de date de 2,5 Mbps. Acest modul necesită o tensiune de 5V.
Descriere pin RS-485:
Nume PIN |
Descriere |
VCC |
5V |
A |
Intrare receptor fără inversare Ieșirea driverului fără inversare |
B |
Inversarea intrării receptorului Inversarea ieșirii driverului |
GND |
GND (0V) |
R0 |
Receptor Out (pin RX) |
RE |
Ieșire receptor (LOW-Enable) |
DE |
Ieșire driver (activare HIGH) |
DI |
Intrare driver (pin TX) |
Modulul RS485 are următoarele caracteristici:
- Tensiune de funcționare: 5V
- Cip MAX485 la bord
- Un consum redus de energie pentru comunicația RS485
- Transmițător cu frecvență redusă
- Terminal 2P pas 5.08mm
- Cablare convenabilă pentru comunicații RS-485
- Toți pinii cipului au putut fi controlați prin intermediul microcontrolerului
- Dimensiunea plăcii: 44 x 14 mm
Utilizarea acestui modul cu STM32F103C8 și Arduino UNO este foarte ușoară. Sunt utilizate porturile seriale hardware ale microcontrolerelor. Pinii seriali hardware din STM32 și arduino UNO sunt prezentați mai jos.
- În STM32F103C8: Pinii PA9 (TX) și PA10 (RX)
- În Arduino Uno: Pin 0 (RX) și 1 (TX)
Programarea este, de asemenea, simplu trebuie doar să utilizați Serial.print () pentru a scrie la RS-485 și Serial.Read () pentru a citi de la RS-485 și știfturile DE RE & RS-485 se face LOW pentru a primi date și a făcut mare pentru a scrieți date pe magistrala RS-485.
Componente necesare
- STM32F103C8
- Arduino UNO
- Modul convertor MAX485 TTL la RS485 - (2)
- Potențiometru 10K
- Buton de apăsare - 3
- LED - 3
- Rezistențe
- Breadboard
- Conectarea firelor
Diagrama circuitului
În acest tutorial STM32F103C8 este folosit ca Master cu un modul RS-485 și Arduino UNO este folosit ca Slave cu un alt modul RS-485.
Conexiune de circuit între RS-485 și STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RE |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
A |
Către A din Slave RS-485 |
B |
Către B al Sclavului RS-485 |
STM32F103C8 cu buton cu trei butoane:
Trei butoane cu trei rezistențe de tracțiune de 10k sunt conectate la pinii PA0, PA1, PA2 ai STM32F103C8.
Conexiune de circuit între RS-485 și Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RE |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
A |
Către A a Maestrului RS-485 |
B |
Către B al Maestrului RS-485 |
Se utilizează trei LED-uri în care anodii LED-urilor cu rezistență de 330 ohmi sunt conectați la pinii 4, 7, 8 ai Arduino UNO și catodul LED-urilor sunt conectați la GND.
Programare STM32F103C8 & Arduino UNO pentru comunicare serială RS485
Arduino IDE este utilizat pentru dezvoltarea și programarea ambelor plăci, adică STM32 și Arduino UNO. Dar asigurați-vă că ați selectat PORTUL corespunzător din Tools-> Port and Board din Tools-> Board. Dacă întâmpinați dificultăți sau îndoială, consultați doar Programarea STM32 în ARDUINO IDE. Programarea acestui tutorial constă din două secțiuni, una pentru STM32F103C8 (Master) și alta pentru Arduino UNO (Slave). Ambele coduri vor fi explicate unul câte unul mai jos.
STM32F103C8 ca MasterÎn partea Master, starea butonului de apăsare este citită și apoi scrisă în serie acele valori pe magistrala RS-485 prin porturile seriale hardware 1 (PA9, PA10) ale STM32F103C8. De asemenea, de acum nu este necesară nicio bibliotecă externă. Arduino are toată biblioteca necesară pentru comunicarea în serie.
Începeți comunicarea serială utilizând pinii seriali hardware (PA9, PA10) la un nivel de 9600.
Serial1.begin (9600);
Citiți starea butonului la pinii PA0, PA1, PA2 din STM32F103C8 și stocați-le într-un buton variabil1val, button2val, button3val. Valoarea este HIGH dacă butonul este apăsat și LOW când nu este apăsat.
int button1val = digitalRead (buton1); int button2val = digitalRead (buton2); int button3val = digitalRead (buton3);
Înainte de a trimite valorile butoanelor la portul serial, pinii DE & RE ai RS-485 ar trebui să fie HIGH conectați la pinul PA3 al STM32F103C8 (Pentru a face pinul PA3 HIGH):
digitalWrite (enablePin, HIGH);
Apoi pentru a pune acele valori în portul serial și a trimite valori în funcție de butonul care este apăsat, folosiți instrucțiunea if else și trimiteți valoarea corespunzătoare când butonul este apăsat.
Dacă este apăsat primul buton, atunci condiția se potrivește și valoarea '1' este trimisă la portul serial unde este conectat Arduino UNO.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
În mod similar, când butonul 2 este apăsat, valoarea 2 este trimisă prin portul serial și când butonul 3 este apăsat, valoarea 3 este trimisă prin portul serial.
else if (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
Și când nu este apăsat niciun buton, valoarea 0 este trimisă către Arduino Uno.
else { int num = 0; Serial1.println (num); }
Aceasta termină programarea pentru a configura STM32 ca Master.
Arduino UNO ca sclavÎn partea Slave, Arduino UNO primește o valoare întreagă care este trimisă de la Master STM32F103C8, care este disponibilă la portul Hardware Serial al Arduino UNO (P0, 1) unde este conectat modulul RS-485.
Pur și simplu citiți valoarea și stocați într-o variabilă. În funcție de valoarea primită, LED-ul corespunzător este aprins sau oprit conectat la Arduino GPIO.
Pentru a primi valorile de la Master, faceți pinii DE & RE ai modulului RS-485 LOW. Deci pin-2 (enablePin) din Arduino UNO este scăzut.
digitalWrite (enablePin, LOW);
Acum trebuie doar să citiți datele întregi disponibile la Serial Port și să le stocați într-o variabilă.
int primi = Serial.parseInt ();
În funcție de valoarea adică (0, 1, 2, 3) primită, unul dintre cele trei LED-uri corespunzătoare este aprins.
dacă (primi == 1) // În funcție de valoarea primită, LED-ul corespunzător este aprins sau oprit { digitalWrite (ledpin1, HIGH); } else if (primi == 2) { digitalWrite (ledpin2, HIGH); } else if (primi == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Aceasta termină programarea și configurarea Arduino UNO ca Slave. De asemenea, aceasta termină configurațiile complete pentru Arduino UNO și STM32. Videoclipul de lucru și toate codurile sunt atașate la sfârșitul acestui tutorial.
Testarea comunicației RS485 între STM32F103C8 și Arduino UNO:
1. Când se apasă butonul-1, care este conectat la Master STM32, LED-ul 1 se aprinde conectat la Slave Arduino.
2. Când este apăsat butonul-2, care a fost conectat la Master STM32, LED-ul 2 se aprinde conectat la Slave Arduino.
3. În mod similar, când este apăsat butonul 3, LED-ul 3 se aprinde conectat la Slave Arduino.
Aceasta finalizează comunicația serială RS485 între STM32F103C8 și Arduino UNO. Plăcile Arduino UNO și STM32 sunt plăci utilizate pe scară largă pentru prototipare rapidă și am realizat multe proiecte utile pe aceste plăci. Dacă găsiți îndoieli sau aveți vreo sugestie pentru noi, scrieți și comentați mai jos.