- RS-485 серийна комуникация
- Необходими компоненти
- Електрическа схема
- Програмиране на STM32F103C8 и Arduino UNO за последователна комуникация RS485
- Тестване на RS485 комуникацията между STM32F103C8 и Arduino UNO:
Комуникационните протоколи са неразделна част от цифровата електроника и вградената система. Навсякъде, където има взаимодействие на множество микроконтролери и периферни устройства, комуникационният протокол трябва да се използва за обмен на куп данни. Налични са много видове протоколи за серийна комуникация. RS485 е един от протокола за серийна комуникация и се използва в индустриални проекти и тежки машини.
Научихме за серийната комуникация RS485 между Arduino Uno и Arduino Nano в предишния урок . Този урок е за използването на серийна комуникация RS-485 в микроконтролера STM32F103C8. Ако сте нов в STM32 Microcontroller, започнете с Първи стъпки със STM32 с помощта на Arduino IDE: Мигащ светодиод и проверете всички STM32 проекти тук.
В този урок Master STM32F103C8 има три бутона, които се използват за управление на състоянието на три светодиода, присъстващи в Slave Arduino Uno, чрез RS-485 серийна комуникация.
Нека започнем с разбирането за работата на RS-485 серийната комуникация.
RS-485 серийна комуникация
RS-485 е асинхронен сериен комуникационен протокол, който не изисква часовник. Той използва техника, наречена диференциален сигнал за прехвърляне на двоични данни от едно устройство на друго.
И така, какъв е този метод за диференциално предаване на сигнала ??
Методът на диференциалния сигнал работи чрез създаване на диференциално напрежение чрез използване на положителни и отрицателни 5V. Той осигурява Half-Duplex комуникация при използване на два проводника и Full-Duplex комуникация при използване на четири проводника.
Като използвате този метод:
- RS-485 поддържа по-висока скорост на трансфер на данни от максимум 30Mbps.
- Той също така осигурява максимално разстояние за трансфер на данни в сравнение с протокола RS-232. Той прехвърля данни до максимум 1200 метра.
- Основното предимство на RS-485 пред RS-232 е множественото подчинено устройство с единичен Master, докато RS-232 поддържа само един подчинен.
- Може да има максимум 32 устройства, свързани към протокол RS-485.
- Друго предимство на RS-485 е имунитетът срещу шума, тъй като те използват метод на диференциален сигнал за трансфер.
- RS-485 е по-бърз в сравнение с протокола I2C.
Модулът RS-485 може да бъде свързан към всеки микроконтролер със сериен порт. За използване на RS-485 модул с микроконтролери е необходим модул, наречен 5V MAX485 TTL до RS485, който се основава на Maxim MAX485 IC, тъй като позволява последователна комуникация на дълги разстояния от 1200 метра и е двупосочен и полудуплекс има скорост на трансфер на данни Mbps. Този модул изисква напрежение 5V.
RS-485 Описание на пина:
Име на ПИН |
Описание |
VCC |
5V |
A |
Неинвертиращ вход на приемника Неинвертиращ изход на драйвера |
Б. |
Обръщане на входа на приемника Обръщане на изхода на драйвера |
GND |
GND (0V) |
R0 |
Изход на приемника (RX щифт) |
RE |
Изход на приемника (LOW-Enable) |
DE |
Изход на драйвера (HIGH-Enable) |
DI |
Вход за водача (TX щифт) |
RS485 модулът има следните характеристики:
- Работно напрежение: 5V
- Вграден чип MAX485
- Ниска консумация на енергия за комуникация RS485
- Приемо-предавател с ограничена скорост
- 5.08mm стъпка 2P терминал
- Удобно RS-485 комуникационно окабеляване
- Всички изводи на чипа са доведени до могат да бъдат контролирани чрез микроконтролера
- Размер на дъската: 44 x 14 мм
Използването на този модул със STM32F103C8 и Arduino UNO е много лесно. Използват се хардуерните серийни портове на микроконтролери. Хардуерните серийни щифтове в STM32 и arduino UNO са дадени по-долу.
- В STM32F103C8: щифтове PA9 (TX) и PA10 (RX)
- В Arduino Uno: Pin 0 (RX) & 1 (TX)
Програмирането също е лесно, просто използвайте Serial.print (), за да пишете в RS-485 и Serial.Read (), за да четете от RS-485, а щифтовете DE & RE на RS-485 са направени НИСКИ за получаване на данни и направени HIGH до запис на данни в RS-485 шина.
Необходими компоненти
- STM32F103C8
- Arduino UNO
- Преобразуващ модул MAX485 TTL към RS485 - (2)
- 10K потенциометър
- Бутон - 3
- LED - 3
- Резистори
- Макет
- Свързване на проводници
Електрическа схема
В този урок STM32F103C8 се използва като Master с един RS-485 модул, а Arduino UNO се използва като Slave с друг RS-485 модул.
Връзка на веригата между RS-485 и STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RE |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
A |
До A на Slave RS-485 |
Б. |
До B на Slave RS-485 |
STM32F103C8 с три бутона:
Три бутона с три издърпващи резистора от 10k са свързани към щифтовете PA0, PA1, PA2 на STM32F103C8.
Верижна връзка между RS-485 и Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RE |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
A |
Към A на Master RS-485 |
Б. |
Към B на Master RS-485 |
Използват се три светодиода, при които анодите на светодиоди с резистор от 330 ома са свързани към изводи 4, 7, 8 на Arduino UNO, а катодът на светодиодите е свързан към GND.
Програмиране на STM32F103C8 и Arduino UNO за последователна комуникация RS485
Arduino IDE се използва за разработване и програмиране на двете платки, т.е. STM32 и Arduino UNO. Но се уверете, че сте избрали съответния PORT от Tools-> Port and Board от Tools-> Board. Ако откриете някакви затруднения или съмнения, просто се обърнете към Програмиране на вашия STM32 в ARDUINO IDE. Програмирането за този урок се състои от два раздела един за STM32F103C8 (Master) и друг за Arduino UNO (Slave). И двата кода ще бъдат обяснени един по един по-долу.
STM32F103C8 като главенОт страна на Master, състоянието на бутона се чете и след това серийно се записват тези стойности в RS-485 шината през хардуерните серийни портове 1 (PA9, PA10) на STM32F103C8. Също така към момента не е необходима външна библиотека. Arduino разполага с цялата необходима библиотека за серийна комуникация.
Започнете серийната комуникация с помощта на хардуерни серийни щифтове (PA9, PA10) при буадрат от 9600.
Serial1.begin (9600);
Прочетете състоянието на бутона на щифтовете PA0, PA1, PA2 на STM32F103C8 и ги запазете в променлива бутон1вал, бутон2вал, бутон3вал. Стойността е HIGH, ако бутонът е натиснат и LOW, когато не е натиснат.
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
Преди да изпратите стойностите на бутоните към серийния порт, щифтовете DE & RE на RS-485 трябва да бъдат ВИСОКИ, което е свързано към щифта PA3 на STM32F103C8 (За да направите пин PA3 HIGH):
digitalWrite (enablePin, HIGH);
След това, за да поставите тези стойности в серийния порт и да изпратите стойности, в зависимост от това кой бутон е натиснат, използвайте оператора if else и изпратете съответната стойност при натискане на бутона.
Ако се натисне първият бутон, състоянието съвпада и стойността „1“ се изпраща към серийния порт, където е свързан Arduino UNO.
ако (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
По същия начин, когато се натисне бутон 2, стойността 2 се изпраща през серийния порт и когато бутон 3 се натиска стойността 3 се изпраща през серийния порт.
иначе ако (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } иначе ако (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
И когато не е натиснат бутон, стойността 0 се изпраща до Arduino Uno.
else { int num = 0; Serial1.println (num); }
Това завършва програмирането за конфигуриране на STM32 като Master.
Arduino UNO като робВ подчинената страна Arduino UNO получава целочислена стойност, която се изпраща от Master STM32F103C8, която е достъпна в Хардуерния сериен порт на Arduino UNO (P0, 1), където е свързан RS-485 модулът.
Просто четете стойност и съхранявайте в променлива. В зависимост от получената стойност съответният светодиод се включва или изключва, свързан към Arduino GPIO.
За да получите стойностите от Master, направете щифтовете DE & RE на модула RS-485 НИСКИ. Така че pin-2 (enablePin) на Arduino UNO е направен НИСКО.
digitalWrite (enablePin, LOW);
Сега просто прочетете целочислените данни, налични в серийния порт, и ги съхранявайте в променлива.
int получаване = Serial.parseInt ();
В зависимост от получената стойност, т.е. (0, 1, 2, 3), съответно един от трите светодиода се включва.
if (receive == 1) // В зависимост от получената стойност съответният светодиод се включва или изключва { digitalWrite (ledpin1, HIGH); } иначе ако (получаване == 2) { digitalWrite (ledpin2, HIGH); } иначе ако (получаване == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Това завършва програмирането и конфигурирането на Arduino UNO като Slave. Също така това завършва пълните конфигурации за Arduino UNO и STM32. Работното видео и всички кодове са приложени в края на този урок.
Тестване на RS485 комуникацията между STM32F103C8 и Arduino UNO:
1. Когато натиснете бутон-1, който е свързан към Master STM32, светодиодът 1 се включва, включен към Slave Arduino.
2. При натискане на бутон-2, свързан към Master STM32, светодиодът 2 се включва, свързан към Slave Arduino.
3. По същия начин, когато натиснете бутон-3, светодиодът 3 се включва, свързан към Slave Arduino.
Това завършва последователната комуникация RS485 между STM32F103C8 и Arduino UNO. Платките Arduino UNO и STM32 са широко използвани платки за бързо прототипиране и сме направили много полезни проекти върху тези платки. Ако откриете някакви съмнения или предложения за нас, напишете и коментирайте по-долу.