Sériová komunikace je jedním z nejběžnějších způsobů výměny dat mezi elektronickými zařízeními. Když se však zvětší vzdálenosti nebo se v okolí vyskytne elektromagnetické rušení, komunikační signály mohou být náchylné k chybám. Zde vstupuje do hry komunikační standard RS485, který nabízí robustní a efektivní alternativu. Arduino nám svou všestranností umožňuje plně využít tento protokol celkem jednoduchým způsobem.
V tomto článku uvidíme, jak lze implementovat komunikaci RS485 mezi několika Arduiny pomocí modulů založených na integrovaném MAX485, čipu, který převádí signály TTL (z Arduina) na RS485 a naopak. V tomto tutoriálu probereme jak základní koncepty, tak praktické příklady, které vám umožní implementovat simplexní, poloduplexní a plně duplexní komunikaci mezi mikrokontroléry Arduino, a vysvětlíme, jak můžete tento komunikační systém rozšířit tak, aby obsluhoval více zařízení v jediném sběrnice RS485.
Co je RS485?
RS485 je komunikační standard široce používaný v průmyslu, známý pro své robustnost a jeho schopnost odolat velká vzdálenost přenos, a to i v hlučném průmyslovém prostředí. Na rozdíl od jiných typů sériové komunikace, jako je RS232, umožňuje RS485 připojení více zařízení na stejnou sběrnici, takže je ideální pro aplikace průmyslové automatizace a řízení.
Tento protokol je odolný vůči elektromagnetickému šumu díky tomu, že používá a diferenciální signalizační systém, což znamená, že data jsou odesílána přes dva vodiče, A a B, což jsou verze opačného napětí. To umožňuje snadno potlačit jakýkoli šum zachycený v kabelech a zajistit integritu signálu.
Jednou z hlavních výhod RS485 je to podporuje vzdálenosti až 1200 metrů a rychlostí až 35 Mbps na krátké vzdálenosti, což z něj dělá ideální protokol pro průmyslové a řídicí aplikace v prostředích, kde je nutná dlouhá kabeláž.
Komunikační režimy RS485
V komunikaci RS485 můžeme systém konfigurovat třemi různými způsoby: simplexní, poloduplexní a plně duplexní. Každý z nich má svá specifika a je realizován podle potřeb projektu.
Simplexní komunikace
V simplexním režimu probíhá komunikace pouze jedním směrem, to znamená, že jedno zařízení funguje jako emitenta a další podobné přijímač. To je užitečné v situacích, kdy chcete pouze odesílat nebo přijímat data bez potřeby zpětné vazby.
Můžeme například nastavit systém, kde Arduino načte hodnotu senzoru a odešle ji do jiného zařízení, které ji jednoduše přijme. V tomto případě, protože data putují pouze jedním směrem, lze upustit od určitých přídavných ovládacích prvků, čímž je systém jednodušší a ekonomičtější.
Half-Duplex komunikace
Většina aplikací RS485 na Arduinu je implementována v poloduplexním režimu, protože to pouze vyžaduje dva drátya umožňuje odesílat i přijímat data, i když ne současně. To znamená, že pokud jedno zařízení odesílá data, ostatní zařízení musí být v režimu příjmu a naopak.
Pro přepínání mezi režimy vysílání a příjmu použijte přídavné kolíky (RE/DE) na modulu MAX485, který budete ovládat z kódu, abyste určili, zda má zařízení v daný okamžik odesílat nebo přijímat.
Tento režim je zvláště užitečný, pokud máte na stejné sběrnici více zařízení, která spolu potřebují komunikovat, ale ne současně.
Plně duplexní komunikace
V plně duplexním režimu mohou zařízení odesílat a přijímat data současně. Chcete-li však implementovat plný duplex v RS485, dva páry kroucených drátů, což zvyšuje náklady a složitost elektroinstalace. Navíc budete potřebovat dva moduly MAX485 pro každé zařízení, abyste mohli samostatně spravovat vysílací a přijímací kanály.
Komponenty potřebné pro komunikaci RS485 s Arduinem
K implementaci komunikačního systému RS485 na Arduinu budete potřebovat následující komponenty:
- Jedno nebo více Arduino: Bude stačit jakýkoli model Arduino, ale v tomto tutoriálu jej použijeme Arduino UNO a Arduino MEGA jako příklady.
- Moduly MAX485: Tyto moduly umožňují převádět signály TTL z Arduina na RS485 a naopak. Jsou velmi levné a snadno se dají najít v obchodech jako AliExpress nebo eBay.
- Zakončovací rezistory: Na každém konci sběrnice je obvykle umístěn odpor mezi 120 ohmy, aby se zabránilo odrazům v signálu. Na krátké vzdálenosti je možné se bez nich obejít, ale v delších instalacích jsou nezbytné pro zachování integrity signálu.
- Twisted pair kabely: Pro minimalizaci elektromagnetického rušení se doporučuje používat kroucené dvoulinky, zejména v hlučném průmyslovém prostředí.
Obecné schéma zapojení
Připojte moduly MAX485 na Arduino je docela jednoduché. Nejdůležitější piny jsou A a B, které odpovídají linkám sběrnice RS485. Tyto piny musí být připojeny ke všem zařízením na sběrnici. Modul má navíc piny RE a DE, které řídí, zda je modul v režimu přijímače nebo vysílače.
Obecně se připojení modulů k Arduinu provádí následovně:
- VCC a GND modulu se připojují k VCC a GND na Arduinu.
- DI (Data Input) modulu se připojuje k TX pinu Arduina, pokud má modul fungovat jako emitor.
- RO (Receiver Output) modulu se připojuje k RX pinu Arduina, pokud má modul fungovat jako přijímač.
- DE a RE musí být ovládány z digitálního pinu Arduino, aby bylo možné přepínat mezi režimy vysílání a příjmu.
Pokud potřebujete, aby modul fungoval pouze jako vysílač nebo přijímač, můžete RE a DE připojit přímo k HIGH nebo LOW. Pro složitější komunikaci, kde se zařízení musí přepínat mezi vysíláním a příjmem, je však nejlepší ovládat tyto piny ze softwaru.
Příklady kódů pro komunikaci RS485
Níže je uvedeno několik příkladů pokrývajících různé konfigurace komunikace s RS485 na Arduinu.
Simplexní komunikace
Kód vydavatele
Pro základní simplexní systém, kde máme pouze jednoho odesílatele a jednoho příjemce, může kód odesílatele vypadat takto:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Kód přijímače
Přijímač jednoduše načte data přicházející přes sériový port:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Half-Duplex komunikace
V tomto příkladu implementujeme poloduplexní systém, kde se zařízení střídají mezi odesíláním a přijímáním dat.
Kód učitele
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); } }
Slave kód
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); } }
Plně duplexní komunikace
Pro implementaci plně duplexní komunikace budou potřeba dva moduly MAX485 na Arduino. Každý pár modulů bude obsluhovat jednu datovou linku: jednu pro vysílání a jednu pro příjem.
Kód bude podobný jako v předchozích příkladech, ale v tomto případě by obě zařízení vždy vysílala a přijímala současně.
Rozšíření na více zařízení na RS485
RS485 má schopnost připojit až 32 zařízení na jednu sběrnici a ve speciálních případech může dosáhnout více. Díky tomu je vynikající volbou pro projekty zahrnující více mikrokontrolérů nebo zařízení. Pro identifikaci každého z nich v síti je běžné implementovat adresu nebo ID pro každé zařízení.
V tomto případě master odešle zprávu s adresou zařízení, se kterým chce komunikovat, a pouze toto zařízení bude mít na starosti zpracování zprávy a poskytnutí odpovědi.
K tomu se přidává možnost použití složitější protokoly jako je MODBUS, které umožňují vytváření vysoce efektivních a bezpečných sítí v průmyslu.
Pro domácí projekty nebo méně náročné aplikace můžete každému Arduinu jednoduše přiřadit identifikátor a nechat je reagovat pouze na zprávy pro ně určené.