Серийната комуникация е един от най-разпространените начини за обмен на данни между електронни устройства. Въпреки това, когато разстоянията се увеличават или околната среда има електромагнитни смущения, комуникационните сигнали могат да бъдат податливи на грешки. Това е мястото, където комуникационният стандарт RS485 влиза в действие, предлагайки стабилна и ефективна алтернатива. Arduino, със своята гъвкавост, ни позволява да се възползваме напълно от този протокол по доста прост начин.
В тази статия ще видим как RS485 комуникацията може да бъде реализирана между няколко Arduino с помощта на модули, базирани на интегрирания MAX485, чип, който преобразува TTL сигнали (от Arduino) в RS485 и обратно. В този урок ще покрием както основните концепции, така и практическите примери, които ще ви позволят да реализирате симплексна, полудуплексна и пълна дуплексна комуникация между микроконтролерите на Arduino и ще обясним как можете да разширите тази комуникационна система, за да управлявате множество устройства в едно RS485 шина.
Какво е RS485?
RS485 е комуникационен стандарт, широко използван в индустрията, известен със своите здравина и способността му да издържа голямо разстояние предаване, дори в шумна промишлена среда. За разлика от други типове серийна комуникация, като RS232, RS485 позволява свързването на множество устройства към една и съща шина, което го прави идеален за индустриална автоматизация и приложения за управление.
Този протокол е устойчив на електромагнитен шум благодарение на факта, че използва a диференциална сигнална система, което означава, че данните се изпращат по два проводника, A и B, които са противоположни версии по напрежение. Това позволява всеки шум, уловен в кабелите, да бъде лесно премахнат, като се гарантира целостта на сигнала.
Едно от основните предимства на RS485 е това поддържа разстояния до 1200 метра и скорост до 35 Mbps на къси разстояния, което го прави идеален протокол за индустриални и контролни приложения в среди, където е необходимо дълго окабеляване.
RS485 комуникационни режими
При RS485 комуникация можем да конфигурираме системата по три различни начина: симплекс, полудуплекс и пълен дуплекс. Всяка една има своите особености и се изпълнява според нуждите на проекта.
Симплексна комуникация
В симплексен режим комуникацията върви само в една посока, тоест едно устройство действа като предавател и друг подобен приемник. Това е полезно в ситуации, в които просто искате да изпращате или получавате данни без нужда от обратна връзка.
Например, можем да настроим система, при която Arduino чете стойност на сензор и я изпраща на друго устройство, което просто я получава. В този случай, тъй като данните се движат само в една посока, някои допълнителни контролни елементи могат да бъдат премахнати, което прави системата по-проста и по-икономична.
Полудуплексна комуникация
Повечето RS485 приложения на Arduino се изпълняват в полудуплексен режим, защото това изисква само два проводникаи ви позволява да изпращате и получавате данни, макар и не едновременно. Тоест, ако едно устройство изпраща данни, другите устройства трябва да са в режим на приемане и обратно.
За да превключвате между режимите на предаване и приемане, използвайте допълнителни щифтове (RE/DE) на модула MAX485, който ще контролирате от кода, за да определите дали устройството трябва да изпраща или получава във всеки даден момент.
Този режим е особено полезен, ако имате няколко устройства на една и съща шина, които трябва да комуникират помежду си, но не едновременно.
Пълна дуплексна комуникация
В режим на пълен дуплекс устройствата могат да изпращат и получават данни едновременно. Въпреки това, за да внедрите пълен дуплекс в RS485, две двойки усукани проводници, което увеличава цената и сложността на окабеляването. Освен това ще ви трябват два модула MAX485 за всяко устройство, за да управлявате отделно каналите за предаване и приемане.
Компоненти, необходими за RS485 комуникация с Arduino
За да внедрите комуникационна система RS485 на Arduino, ще ви трябват следните компоненти:
- Едно или повече Arduinos: Всеки модел на Arduino ще свърши работа, но в този урок ще използваме Arduino UNO и Arduino MEGA като примери.
- MAX485 модули: Тези модули ви позволяват да конвертирате TTL сигнали от Arduino към RS485 и обратно. Те са много евтини и лесни за намиране в магазини като AliExpress или eBay.
- Крайни резистори: Резистор между 120 ома обикновено се поставя във всеки край на шината, за да се избегнат отражения в сигнала. На къси разстояния е възможно да се мине без тях, но при по-дълги инсталации те са от съществено значение за поддържане на целостта на сигнала.
- Кабели с усукана двойка: Препоръчително е да използвате кабели с усукана двойка, за да сведете до минимум електромагнитните смущения, особено в шумна промишлена среда.
Обща схема на свързване
Свържете модулите MAX485 към Arduino е доста проста. Най-важните изводи са A и B, които съответстват на шинните линии RS485. Тези щифтове трябва да бъдат свързани към всички устройства в шината. Освен това, модулът има RE и DE щифтове, които контролират дали модулът е в режим на приемник или предавател.
Като цяло свързването на модулите към Arduino се извършва по следния начин:
- VCC и GND на модула се свързват към VCC и GND на Arduino.
- DI (вход на данни) на модула се свързва към TX щифта на Arduino, ако модулът трябва да действа като излъчвател.
- RO (Receiver Output) на модула се свързва към RX щифта на Arduino, ако модулът трябва да действа като приемник.
- DE и RE трябва да се управляват от цифров щифт на Arduino, за да превключвате между режимите на предаване и приемане.
Ако се нуждаете само от модула, за да функционира като подател или получател, можете да свържете RE и DE директно към HIGH или LOW. Въпреки това, за по-сложни комуникации, при които устройството трябва да превключва между предаване и приемане, най-добре е тези щифтове да се контролират от софтуера.
Примери за кодове за RS485 комуникация
По-долу има няколко примера, покриващи различните комуникационни конфигурации с RS485 на Arduino.
Симплексна комуникация
Код на издателя
За основна симплексна система, където имаме само един изпращач и един получател, кодът за изпращача може да изглежда така:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Код на приемника
Приемникът просто ще прочете данните, пристигащи през серийния порт:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Полудуплексна комуникация
В този пример прилагаме полудуплексна система, при която устройствата редуват изпращане и получаване на данни.
Код на учителя
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, HIGH); Serial.write('H'); delay(100); digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Робски код
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); delay(100); digitalWrite(reDePin, HIGH); Serial.write(data + 1); } }
Пълна дуплексна комуникация
За реализиране на пълнодуплексна комуникация ще са необходими два модула MAX485 на Arduino. Всяка двойка модули ще обработва една линия за данни: една за предаване и една за приемане.
Кодът ще бъде подобен на предишните примери, но в този случай и двете устройства винаги ще предават и приемат едновременно.
Разширяване до множество устройства в RS485
RS485 има способността да свързва до 32 устройства на една шина, като в специални случаи може да достигне и повече. Това го прави отличен избор за проекти, включващи множество микроконтролери или устройства. За да се идентифицира всяко едно от тях в мрежата, обичайно е да се внедри адрес или ID за всяко устройство.
В този случай мастерът ще изпрати съобщение с адреса на устройството, с което иска да комуникира, и само това устройство ще отговаря за обработката на съобщението и даване на отговор.
Към това се добавя възможността за използване по-сложни протоколи като MODBUS, които позволяват създаването на високоефективни и сигурни мрежи в индустрията.
За домашни проекти или по-малко взискателни приложения можете просто да зададете идентификатор на всеки Arduino и да ги накарате да отговарят само на съобщения, предназначени за тях.