- Komunikacja szeregowa RS-485
- Wymagane składniki
- Schemat obwodu
- Programowanie STM32F103C8 i Arduino UNO do komunikacji szeregowej RS485
- Testowanie komunikacji RS485 pomiędzy STM32F103C8 a Arduino UNO:
Protokoły komunikacyjne są integralną częścią cyfrowej elektroniki i systemu wbudowanego. Wszędzie tam, gdzie występuje połączenie wielu mikrokontrolerów i urządzeń peryferyjnych, protokół komunikacyjny musi być używany w celu wymiany danych. Dostępnych jest wiele typów protokołów komunikacji szeregowej. RS485 jest jednym z protokołów komunikacji szeregowej i jest używany w projektach przemysłowych i ciężkich maszynach.
O komunikacji szeregowej RS485 między Arduino Uno i Arduino Nano dowiedzieliśmy się w poprzednim samouczku . Ten samouczek dotyczy korzystania z komunikacji szeregowej RS-485 w mikrokontrolerze STM32F103C8. Jeśli jesteś nowy w mikrokontrolerze STM32, zacznij od Rozpoczynania pracy z STM32 przy użyciu Arduino IDE: migająca dioda LED i sprawdź wszystkie projekty STM32 tutaj.
W tym samouczku Master STM32F103C8 ma trzy przyciski, które służą do sterowania stanem trzech diod LED obecnych w Slave Arduino Uno za pomocą komunikacji szeregowej RS-485.
Zacznijmy od zrozumienia działania komunikacji szeregowej RS-485.
Komunikacja szeregowa RS-485
RS-485 to asynchroniczny protokół komunikacji szeregowej, który nie wymaga zegara. Wykorzystuje technikę zwaną sygnałem różnicowym do przesyłania danych binarnych z jednego urządzenia do drugiego.
Czym więc jest ta metoda przesyłania sygnału różnicowego?
Metoda sygnału różnicowego polega na tworzeniu napięcia różnicowego przy użyciu dodatniego i ujemnego 5V. Zapewnia komunikację w trybie półdupleksu w przypadku korzystania z dwóch przewodów oraz komunikację w trybie pełnego dupleksu w przypadku korzystania z czterech przewodów.
Korzystając z tej metody:
- RS-485 obsługuje większą szybkość przesyłania danych, maksymalnie 30 Mb / s.
- Zapewnia również maksymalną odległość przesyłania danych w porównaniu z protokołem RS-232. Przesyła dane na maksymalnie 1200 metrów.
- Główną zaletą RS-485 nad RS-232 jest wiele urządzeń podrzędnych z jednym urządzeniem nadrzędnym, podczas gdy RS-232 obsługuje tylko jedno urządzenie podrzędne.
- Może mieć maksymalnie 32 urządzenia podłączone do protokołu RS-485.
- Kolejną zaletą RS-485 jest odporność na szumy, ponieważ wykorzystują one metodę sygnału różnicowego do przesyłania.
- RS-485 jest szybszy w porównaniu z protokołem I2C.
Moduł RS-485 można podłączyć do dowolnego mikrokontrolera posiadającego port szeregowy. Do korzystania z modułu RS-485 z mikrokontrolerami potrzebny jest moduł o nazwie 5V MAX485 TTL na RS485 oparty na układzie scalonym Maxim MAX485, który umożliwia komunikację szeregową na duże odległości 1200 metrów i jest dwukierunkowy, a prędkość transmisji danych w trybie półdupleksu wynosi 2,5 Mbps. Ten moduł wymaga napięcia 5V.
Opis pinów RS-485:
Nazwa pinu |
Opis |
VCC |
5V |
ZA |
Nieodwracające wejście odbiornika Wyjście sterownika nieodwracającego |
b |
Odwracanie sygnału wejściowego odbiornika Odwracanie wyjścia sterownika |
GND |
GND (0 V) |
R0 |
Wyjście odbiornika (pin RX) |
RE |
Wyjście odbiornika (LOW-Enable) |
DE |
Wyjście sterownika (WYSOKI-włączony) |
DI |
Wejście sterownika (pin TX) |
Moduł RS485 posiada następujące cechy:
- Napięcie robocze: 5 V.
- Wbudowany układ MAX485
- Niski pobór mocy do komunikacji RS485
- Transceiver o ograniczonej szybkości narastania
- Zacisk 2P o rastrze 5,08 mm
- Wygodne okablowanie komunikacyjne RS-485
- Wszystkie wyprowadzone piny chipa mogą być kontrolowane przez mikrokontroler
- Rozmiar płytki: 44 x 14 mm
Używanie tego modułu z STM32F103C8 i Arduino UNO jest bardzo łatwe. Wykorzystywane są sprzętowe porty szeregowe mikrokontrolerów. Piny szeregowe sprzętu w STM32 i arduino UNO podano poniżej.
- W STM32F103C8: Piny PA9 (TX) i PA10 (RX)
- W Arduino Uno: Pin 0 (RX) i 1 (TX)
Programowanie jest również proste, wystarczy użyć Serial.print (), aby zapisać na RS-485 i Serial.Read (), aby odczytać z RS-485, a piny DE i RE RS-485 są ustawione na NISKIE, aby odbierać dane i ustawione na WYSOKO do zapis danych na magistrali RS-485.
Wymagane składniki
- STM32F103C8
- Arduino UNO
- Moduł konwertera MAX485 TTL na RS485 - (2)
- Potencjometr 10 K.
- Przycisk - 3
- LED - 3
- Rezystory
- Płytka prototypowa
- Podłączanie przewodów
Schemat obwodu
W tym samouczku STM32F103C8 jest używany jako Master z jednym modułem RS-485, a Arduino UNO jest używany jako Slave z innym modułem RS-485.
Połączenie obwodu między RS-485 i STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RE |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
ZA |
Do A Slave RS-485 |
b |
Do B złącza Slave RS-485 |
STM32F103C8 z trzema przyciskami:
Trzy przyciski z trzema rezystorami obniżającymi po 10k są podłączone do pinów PA0, PA1, PA2 STM32F103C8.
Połączenie obwodu między RS-485 i Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RE |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
ZA |
Do A Master RS-485 |
b |
Do B Master RS-485 |
Zastosowano trzy diody LED, w których anody diod LED z rezystorem 330 omów są podłączone do pinów 4, 7, 8 Arduino UNO, a katoda diod LED jest podłączona do GND.
Programowanie STM32F103C8 i Arduino UNO do komunikacji szeregowej RS485
Arduino IDE służy do tworzenia i programowania obu płyt tj. STM32 i Arduino UNO. Ale upewnij się, że wybrałeś odpowiedni PORT z Tools-> Port and Board z Tools-> Board. Jeśli napotkasz jakiekolwiek trudności lub wątpliwości, po prostu zapoznaj się z Programowaniem STM32 w ARDUINO IDE. Programowanie w tym samouczku składa się z dwóch sekcji, jednej dla STM32F103C8 (Master) i drugiej dla Arduino UNO (Slave). Oba kody zostaną wyjaśnione po kolei poniżej.
STM32F103C8 jako MasterPo stronie głównej status przycisku jest odczytywany, a następnie szeregowo zapisywany te wartości na magistrali RS-485 przez sprzętowe porty szeregowe 1 (PA9, PA10) STM32F103C8. Obecnie nie jest też potrzebna żadna zewnętrzna biblioteka. Arduino posiada całą bibliotekę niezbędną do komunikacji szeregowej.
Rozpocznij komunikację szeregową za pomocą sprzętowych pinów szeregowych (PA9, PA10) o wartości 9600.
Serial1.begin (9600);
Odczytaj stan przycisku na pinach PA0, PA1, PA2 STM32F103C8 i zapisz je w zmiennej wartość przycisku1, wartość przycisku2, wartość przycisku3. Wartość jest WYSOKA, jeśli przycisk jest wciśnięty, i NISKA, gdy nie jest wciśnięty.
int button1val = digitalRead (przycisk1); int button2val = digitalRead (przycisk2); int button3val = digitalRead (button3);
Przed wysłaniem wartości przycisków do portu szeregowego, piny DE i RE RS-485 powinny być WYSOKIE, które jest podłączone do pinu PA3 w STM32F103C8 (Aby zrobić pin PA3 WYSOKI):
digitalWrite (enablePin, HIGH);
Następnie, aby umieścić te wartości w porcie szeregowym i wysłać wartości w zależności od tego, który przycisk jest wciśnięty, użyj instrukcji if else i wyślij odpowiednią wartość po naciśnięciu przycisku.
Naciśnięcie pierwszego przycisku powoduje spełnienie warunku i wysłanie wartości „1” do portu szeregowego, do którego podłączony jest Arduino UNO.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
Podobnie, po naciśnięciu przycisku 2, wartość 2 jest wysyłana przez port szeregowy, a po naciśnięciu przycisku 3, wartość 3 jest wysyłana przez port szeregowy.
else if (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
A gdy żaden przycisk nie jest wciśnięty, wartość 0 jest wysyłana do Arduino Uno.
else { int num = 0; Serial1.println (num); }
To kończy programowanie, aby skonfigurować STM32 jako Master.
Arduino UNO jako SlavePo stronie Slave Arduino UNO odbiera wartość całkowitą, która jest wysyłana z Master STM32F103C8, który jest dostępny w porcie szeregowym sprzętowym Arduino UNO (P0, 1), do którego podłączony jest moduł RS-485.
Po prostu przeczytaj wartość i zapisz ją w zmiennej. W zależności od otrzymanej wartości odpowiednia dioda LED jest włączona lub wyłączona, podłączona do Arduino GPIO.
Aby otrzymać wartości od Mastera wystarczy ustawić piny DE i RE modułu RS-485 na LOW. Więc pin-2 (enablePin) Arduino UNO jest NISKI.
digitalWrite (enablePin, LOW);
Teraz po prostu przeczytaj dane całkowite dostępne w porcie szeregowym i zapisz je w zmiennej.
int otrzymasz = Serial.parseInt ();
W zależności od otrzymanej wartości, tj. (0, 1, 2, 3), odpowiednio jedna z trzech diod LED zapala się.
if (odbierz == 1) // W zależności od otrzymanej wartości odpowiednia dioda LED jest włączona lub wyłączona { digitalWrite (ledpin1, HIGH); } else if (odbieraj == 2) { digitalWrite (ledpin2, HIGH); } else if (odbieraj == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
To kończy programowanie i konfigurowanie Arduino UNO jako Slave. To również kończy pełną konfigurację dla Arduino UNO i STM32. Roboczy film i wszystkie kody są dołączone na końcu tego samouczka.
Testowanie komunikacji RS485 pomiędzy STM32F103C8 a Arduino UNO:
1. Po naciśnięciu przycisku-1, który jest podłączony do Master STM32, zapala się dioda LED 1 podłączona do Slave Arduino.
2. Po wciśnięciu przycisku-2, który jest podłączony do Master STM32, zapala się dioda LED 2 podłączona do Slave Arduino.
3. Podobnie, gdy wciśnięty jest przycisk 3, zapala się dioda LED 3 podłączona do Arduino Slave.
To kończy komunikację szeregową RS485 między STM32F103C8 i Arduino UNO. Płytki Arduino UNO i STM32 są szeroko stosowanymi płytkami do szybkiego prototypowania i wykonaliśmy na nich wiele przydatnych projektów. Jeśli masz jakiekolwiek wątpliwości lub masz jakieś sugestie dla nas, napisz i skomentuj poniżej.