Nuoseklus ryšys yra vienas iš labiausiai paplitusių duomenų mainų tarp elektroninių įrenginių būdų. Tačiau, kai atstumai didėja arba aplinkoje atsiranda elektromagnetinių trukdžių, ryšio signalai gali būti linkę į klaidas. Štai čia pradeda veikti RS485 ryšio standartas, siūlantis tvirtą ir veiksmingą alternatyvą. „Arduino“ dėl savo universalumo leidžia išnaudoti visas šio protokolo galimybes gana paprastai.
Šiame straipsnyje pamatysime, kaip RS485 ryšį galima įgyvendinti tarp kelių Arduinos naudojant modulius, pagrįstus integruotu MAX485 – lustu, konvertuojančiu TTL signalus (iš Arduino) į RS485 ir atvirkščiai. Visoje šioje pamokoje apžvelgsime pagrindines sąvokas ir praktinius pavyzdžius, kurie leis jums įdiegti vienalaikį, pusiau dvipusį ir pilną dvipusį ryšį tarp Arduino mikrovaldiklių, ir paaiškinsime, kaip galite išplėsti šią komunikacijos sistemą, kad galėtumėte valdyti kelis įrenginius viename. RS485 magistralė.
Kas yra RS485?
RS485 yra komunikacijos standartas, plačiai naudojamas pramonėje, žinomas dėl savo tvirtumas ir jo gebėjimą atlaikyti ilgas atstumas perdavimo, net ir triukšmingoje pramoninėje aplinkoje. Skirtingai nuo kitų tipų nuosekliojo ryšio, pvz., RS232, RS485 leidžia prie tos pačios magistralės prijungti kelis įrenginius, todėl jis idealiai tinka pramoninės automatikos ir valdymo programoms.
Šis protokolas yra atsparus elektromagnetiniam triukšmui, nes jame naudojamas a diferencialinė signalizacijos sistema, o tai reiškia, kad duomenys siunčiami dviem laidais A ir B, kurių įtampa yra priešinga. Tai leidžia lengvai panaikinti bet kokį laidų triukšmą ir užtikrinti signalo vientisumą.
Vienas iš pagrindinių RS485 privalumų yra tas palaiko atstumus iki 1200 metrų ir greitis iki 35 Mb/s nedideliais atstumais, todėl tai idealus protokolas pramoninėms ir valdymo programoms aplinkoje, kur reikalingas ilgas kabelis.
RS485 ryšio režimai
RS485 komunikacijoje sistemą galime konfigūruoti trimis skirtingais būdais: simplex, half-duplex ir full-duplex. Kiekvienas iš jų turi savo ypatumus ir yra įgyvendinamas pagal projekto poreikius.
Paprastas bendravimas
Simpleksiniame režime ryšys vyksta tik viena kryptimi, tai yra, vienas įrenginys veikia kaip siųstuvas ir dar vienas panašus imtuvas. Tai naudinga tais atvejais, kai norite tiesiog siųsti arba gauti duomenis be grįžtamojo ryšio.
Pavyzdžiui, galime sukurti sistemą, kurioje Arduino nuskaito jutiklio reikšmę ir siunčia ją į kitą įrenginį, kuris ją tiesiog gauna. Šiuo atveju, kadangi duomenys keliauja tik viena kryptimi, galima atsisakyti tam tikrų papildomų valdymo elementų, todėl sistema tampa paprastesnė ir ekonomiškesnė.
Pusiau dvipusis ryšys
Dauguma RS485 programų Arduino yra įdiegtos pusiau dvipusio režimo, nes tam reikia tik du laidai, ir leidžia siųsti ir gauti duomenis, nors ir ne vienu metu. Tai yra, jei vienas įrenginys siunčia duomenis, kiti įrenginiai turi būti priėmimo režimu ir atvirkščiai.
Norėdami perjungti siuntimo ir priėmimo režimus, naudokite papildomi kaiščiai (RE/DE) MAX485 modulyje, kurį valdysite naudodami kodą, kad nustatytumėte, ar įrenginys turi siųsti ar gauti bet kuriuo metu.
Šis režimas ypač naudingas, jei toje pačioje magistralėje turite kelis įrenginius, kurie turi bendrauti tarpusavyje, bet ne vienu metu.
Visiškas dvipusis ryšys
Viso dvipusio režimo įrenginiai gali siųsti ir gauti duomenis tuo pačiu metu. Tačiau norint įdiegti visišką dvipusį ryšį RS485, dvi poros susuktų laidų, o tai padidina laidų sąnaudas ir sudėtingumą. Be to, jums reikės dviejų MAX485 modulių kiekvienam įrenginiui, kad galėtumėte atskirai valdyti perdavimo ir priėmimo kanalus.
Komponentai, reikalingi RS485 ryšiui su Arduino
Norėdami įdiegti RS485 ryšio sistemą Arduino, jums reikės šių komponentų:
- Vienas ar daugiau „Arduinos“: Tiks bet koks „Arduino“ modelis, tačiau mes naudosime šioje pamokoje Arduino UNO ir Arduino MEGA kaip pavyzdžiai.
- MAX485 moduliai: Šie moduliai leidžia konvertuoti TTL signalus iš Arduino į RS485 ir atvirkščiai. Jie yra labai pigūs ir lengvai randami tokiose parduotuvėse kaip „AliExpress“ ar „eBay“.
- Nutraukimo rezistoriai: Kiekviename magistralės gale paprastai dedamas 120 omų rezistorius, kad būtų išvengta signalo atspindžių. Mažais atstumais galima apsieiti ir be jų, tačiau ilgesnėse instaliacijose jos būtinos norint išlaikyti signalo vientisumą.
- Vytos poros kabeliai: Norint sumažinti elektromagnetinius trukdžius, ypač triukšmingoje pramoninėje aplinkoje, rekomenduojama naudoti vytos poros kabelius.
Bendra prijungimo schema
Prijunkite MAX485 modulius „Arduino“ yra gana paprasta. Svarbiausi kaiščiai yra A ir B, kurie atitinka RS485 magistralės linijas. Šie kaiščiai turi būti prijungti prie visų magistralės įrenginių. Be to, modulis turi RE ir DE kaiščius, kurie kontroliuoja, ar modulis veikia imtuvo ar siųstuvo režimu.
Apskritai modulių prijungimas prie „Arduino“ atliekamas taip:
- Modulio VCC ir GND jungiasi prie VCC ir GND „Arduino“.
- Modulio DI (duomenų įvestis) jungiasi prie Arduino TX kaiščio, jei modulis turi veikti kaip emiteris.
- Modulio RO (imtuvo išvestis) jungiasi prie Arduino RX kaiščio, jei modulis turi veikti kaip imtuvas.
- DE ir RE turi būti valdomi iš Arduino skaitmeninio kaiščio, kad būtų galima perjungti perdavimo ir priėmimo režimus.
Jei modulis turi veikti tik kaip siuntėjas arba imtuvas, galite prijungti RE ir DE tiesiogiai prie HIGH arba LOW. Tačiau sudėtingesniems ryšiams, kai įrenginys turi persijungti iš siuntimo į priėmimą, geriausia šiuos kontaktus valdyti iš programinės įrangos.
RS485 ryšio kodų pavyzdžiai
Žemiau pateikiami keli pavyzdžiai, apimantys skirtingas ryšio konfigūracijas su RS485 „Arduino“.
Paprastas bendravimas
Išdavėjo kodas
Pagrindinėje simpleksinėje sistemoje, kurioje turime tik vieną siuntėją ir vieną imtuvą, siuntėjo kodas gali atrodyti taip:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Imtuvo kodas
Imtuvas tiesiog nuskaitys duomenis, gaunamus per nuoseklųjį prievadą:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Pusiau dvipusis ryšys
Šiame pavyzdyje mes įgyvendiname pusiau dvipusę sistemą, kai įrenginiai pakaitomis siunčia ir gauna duomenis.
Mokytojo kodas
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); } }
Vergo kodas
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); } }
Visiškas dvipusis ryšys
Norint įgyvendinti dvipusį ryšį, reikės dviejų MAX485 modulių vienam Arduino. Kiekviena modulių pora apdoros vieną duomenų liniją: vieną siuntimui ir vieną priėmimui.
Kodas bus panašus į ankstesnius pavyzdžius, tačiau šiuo atveju abu įrenginiai visada siųstų ir gautų vienu metu.
Išplėtimas į kelis įrenginius naudojant RS485
RS485 turi galimybę vienoje magistralėje sujungti iki 32 įrenginių, o ypatingais atvejais gali pasiekti ir daugiau. Dėl to tai puikus pasirinkimas projektams, kuriuose dalyvauja keli mikrovaldikliai ar įrenginiai. Norint identifikuoti kiekvieną iš jų tinkle, įprasta kiekvienam įrenginiui įdiegti adresą arba ID.
Tokiu atveju meistras išsiųs pranešimą su įrenginio, su kuriuo nori susisiekti, adresu ir tik tas įrenginys bus atsakingas už pranešimo apdorojimą ir atsakymo pateikimą.
Prie to pridedama galimybė naudoti sudėtingesni protokolai pvz., MODBUS, kuri leidžia sukurti itin efektyvius ir saugius tinklus pramonėje.
Namų projektams ar mažiau reiklioms programoms galite tiesiog kiekvienam „Arduino“ priskirti identifikatorių ir leisti jiems atsakyti tik į jiems skirtus pranešimus.