- Skirtumas tarp UART ir RS485 ryšio
- Būtini komponentai
- Tolimojo laidinio ryšio grandinės schema
- MAX485 UART-RS485 keitiklio modulis
- Ethernet CAT-6E kabelis
- „Arduino“ kodo paaiškinimas
- Išvada
Mes jau ilgą laiką savo mažuose projektuose, kuriuose atstumas tarp jutiklių ir plokštės yra ne didesnis kaip keli centimetrai, maks. Ir ilgą laiką naudojame tokias mikrovaldiklių plokštes kaip „Arduino“, „Raspberry Pi“, „NodeMCU“, ESP8266, MSP430 ir kt. esant tokiems atstumams, ryšį tarp skirtingų jutiklių modulių, relių, pavarų ir valdiklių galima lengvai atlikti per paprastus trumpiklius, mums nesijaudinant dėl signalo iškraipymo terpėje ir į jį slenkančių elektrinių triukšmų. Bet jei kuriate valdymo sistemą su šiomis plokštėmis didesniu nei 10–15 metrų atstumu, turėtumėte atsižvelgti į triukšmą ir signalo galią, nes jei norite, kad jūsų sistema veiktų patikimai, negalite sau leisti prarasti duomenis perduodant.
Yra daugybė įvairių nuoseklaus ryšio protokolų, tokių kaip I2C ir SPI, kuriuos galima lengvai įdiegti su „Arduino“, ir šiandien mes ieškosime kito dažniausiai naudojamo protokolo, vadinamo RS485, kuris labai dažnai naudojamas didelio triukšmo pramoninėse aplinkose duomenims perduoti ilgą atstumą. Šioje pamokoje mes sužinosime apie RS485 ryšio protokolą ir kaip jį įgyvendinti naudojant du „Arduino Nano“, kuriuos turime su savimi, ir kaip naudoti MAX485 RS485 į UART konversijos modulį. Anksčiau mes taip pat vykdėme MAX485 ryšį su „Arduino“ ir MAX485 ryšį su „Raspberry pi“, taip pat galite juos patikrinti, jei susidomėsite.
Skirtumas tarp UART ir RS485 ryšio
Daugelis pigių jutiklių ir kitų modulių, tokių kaip GPS, „Bluetooth“, RFID, ESP8266 ir kt., Kurie dažniausiai naudojami su „Arduino“, „Raspberry Pi“ rinkoje naudoja UART TTL ryšį, nes tam reikia tik 2 laidų TX (siųstuvas) ir RX (Imtuvas). Tai nėra standartinis ryšio protokolas, tačiau tai yra fizinė grandinė, kuria galite perduoti ir gauti nuoseklius duomenis su kitais periferiniais įrenginiais. Jis gali perduoti / priimti duomenis tik nuosekliai, todėl pirmiausia lygiagrečius duomenis paverčia nuosekliaisiais, o tada perduoda duomenis.
UART yra asinchroninis perdavimo įrenginys, todėl nėra laikrodžio signalo duomenims sinchronizuoti tarp dviejų įrenginių, o kiekvieno duomenų paketo pradžioje ir pabaigoje jis naudoja pradžios ir pabaigos bitus, atitinkamai pažymėdamas perduodamų duomenų galūnes. UART perduoti duomenys yra suskirstyti į paketus. Kiekviename pakete yra 1 pradinis bitas, 5–9 duomenų bitai (priklausomai nuo UART), pasirinktinis pariteto bitas ir 1 arba 2 pabaigos bitai. Tai labai gerai dokumentuota ir plačiai naudojama, be to, ji turi pariteto bitą, kad būtų galima patikrinti klaidas. Tačiau yra tam tikrų apribojimų, nes jis negali palaikyti kelių vergų ir kelių šeimininkų o maksimalus duomenų kadras yra ribojamas iki 9 bitų. Duomenims perduoti tiek „Master“, tiek „Slave“ duomenų perdavimo sparta turi būti tarp 10% vienas kito. Žemiau pateiktas pavyzdys, kaip simbolis yra siųstuvas per UART duomenų liniją. Signalas „High“ ir „Low“ yra matuojamas pagal BND lygį, todėl GND lygio perstūmimas turės pražūtingą poveikį duomenų perdavimui.
Kita vertus, RS485 yra labiau pramone pagrįstas ryšys, sukurtas kelių įrenginių tinklui, kurį galima naudoti dideliais atstumais ir didesniu greičiu. Jis veikia diferencinio signalo matavimo metodu, o ne įtampos matavimu, susuktu GND kaiščiu. RS485 signalai yra plaukiojantys ir kiekvienas signalas perduodamas per Sig + ir Sig-linijas.
RS485 imtuvas lygina įtampos skirtumą tarp abiejų linijų, o ne absoliučią įtampą signalo linijoje. Tai gerai veikia ir neleidžia egzistuoti antžeminėms linijoms, kurios yra dažnas komunikacijos problemų šaltinis. Geriausi rezultatai pasiekiami, jei „Sig +“ ir „Sig-“ linijos yra susuktos, nes sukimasis panaikina kabelio sukeliamo elektromagnetinio triukšmo poveikį ir suteikia daug geresnį atsparumą triukšmui, kuris leidžia RS485 perduoti duomenis iki 1200 m atstumu. Susukta pora taip pat leidžia perdavimo greičiams būti daug didesniems nei įmanoma tiesiais kabeliais. Mažais perdavimo atstumais RS485 galima pasiekti iki 35Mbps greitį, nors perdavimo greitis mažės atstumu. Esant 1200 m perdavimo greičiui, galite naudoti tik 100 kbps perdavimo greitį. Norint realizuoti šį ryšio protokolą, jums reikia specialaus Ethernet kabelio. Yra daugybė Ethernet kabelių, kuriuos galime naudoti, kategorijų, pvz., CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A ir kt. Mūsų pamokoje ketiname naudoti CAT-6E kabelį kuris turi 4 susuktas 24AWG laidų poras ir gali palaikyti iki 600MHz. Abiejuose jo galuose yra RJ45 jungtis. Tipiniai linijos įtampos lygiai nuo linijinių tvarkyklių yra mažiausiai ± 1,5 V, bet ne daugiau kaip ± 6 V. Imtuvo įėjimo jautrumas yra ± 200 mV. ± 200 mV diapazone esantis triukšmas iš esmės blokuojamas dėl bendro režimo triukšmo slopinimo. Pavyzdys, kaip baitas (0x3E) perduodamas per dvi RS485 ryšio linijas.
Būtini komponentai
- 2 × MAX485 keitiklio modulis
- 2 × „Arduino Nano“
- 2 × 16 * 2 raidinis ir skaitmeninis LCD
- 2 × 10k valytuvų potenciometrai
- Cat-6E Ethernet kabelis
- Duonos lentos
- Šuolių laidai
Tolimojo laidinio ryšio grandinės schema
Žemiau pateiktame paveikslėlyje parodyta „Arduino“ tolimojo laidinio ryšio siųstuvo ir imtuvo grandinės schema. Atkreipkite dėmesį, kad tiek siųstuvo, tiek imtuvo grandinės atrodo identiškos, vienintelis skirtumas yra į jį įrašytas kodas. Taip pat demonstravimui mes naudojame vieną plokštę kaip siųstuvą ir vieną plokštę kaip imtuvą, tačiau mes galime lengvai užprogramuoti plokštes dirbti tiek kaip siųstuvas, tiek kaip imtuvas su ta pačia sąranga.
Aukščiau nurodytos grandinės prijungimo schema taip pat pateikiama žemiau.
Kaip matote aukščiau, yra dvi beveik identiškos grandinių poros, kurių kiekviena turi „Arduino nano“, 16 * 2 raidinius ir skaitmeninius LCD ir MAX485 UART – RS485 keitiklio IC, sujungtus su kiekvienu „Ethernet Cat-6E“ kabelio galu per RJ45 jungtį. Kabelis, kurį naudojau pamokoje, yra 25 m ilgio. Kai kuriuos duomenis iš siųstuvo pusės mes atsiųsime per „Nano“ kabelį, kuris konvertuojamas į RS485 signalus per „MAX RS485“ modulį, veikiantį pagrindiniu režimu.
Priėmimo gale keitiklio modulis MAX485 veikia kaip vergas, o klausydamas perdavimo iš pagrindinio įrenginio jis vėl paverčia gautus RS485 duomenis į standartinius 5 V TTL UART signalus, kuriuos turi perskaityti priimantis „Nano“ ir rodyti 16 * Prie jo prijungtas 2 raidinis ir skaitmeninis skystųjų kristalų ekranas.
MAX485 UART-RS485 keitiklio modulis
Šis „UART-RS485“ keitiklio modulis turi įmontuotą „MAX485“ lustą, kuris yra mažos galios ir riboto greičio ribotas siųstuvas-imtuvas, naudojamas RS-485 ryšiui. Jis veikia naudojant vieną + 5 V maitinimo šaltinį, o vardinė srovė yra 300 μA. Jis veikia pusiau dvipusiu ryšiu, kad įgyvendintų TTL lygio pavertimo RS-485 lygiu funkciją, o tai reiškia, kad jis gali bet kada perduoti arba priimti, o ne abu, bet gali pasiekti maksimalų 2,5 Mbps perdavimo greitį. MAX485 siųstuvas ima 120–500 μA maitinimo srovę esant nepakrautoms arba visiškai pakrautoms sąlygoms, kai vairuotojas yra išjungtas. Vairuotojui yra apribota trumpojo jungimo srovė, o vairuotojo išėjimus galima nustatyti esant didelei impedanso būsenai per terminio išjungimo grandinę. Imtuvo įvestyje yra gedimų saugojimo funkcija, užtikrinanti didelę loginę išvestį, jei įėjimas yra atviros grandinės.Be to, jis pasižymi stipriu anti-interferenciniu veikimu. Jame taip pat yra įmontuoti šviesos diodai, rodantys dabartinę lusto būseną, ty ar lustas maitinamas, ar jis perduoda ar priima duomenis, kad būtų lengviau derinti ir naudoti.
Pirmiau pateiktoje grandinės schemoje paaiškinta, kaip borto „MAX485 IC“ yra sujungtas su įvairiais komponentais, ir pateikiamos 0,1 colio standartinės tarpų antraštės, kurios, jei norite, bus naudojamos su duona.
Ethernet CAT-6E kabelis
Galvodami apie didelių atstumų duomenų perdavimą, akimirksniu galvojame apie prisijungimą prie interneto naudojant Ethernet kabelius. Šiais laikais interneto ryšiui dažniausiai naudojame „Wi-Fi“ ryšį, tačiau anksčiau prie kiekvieno asmeninio kompiuterio eidami naudojome Ethernet kabelius. Pagrindinė šių „Ethernet“ kabelių naudojimo įprastais laidais priežastis yra ta, kad jie daug geriau apsaugo nuo triukšmo šliaužimo ir signalo iškraipymo dideliais atstumais. Jie turi apsauginę striukę virš izoliacinio sluoksnio, kad apsaugotų nuo elektromagnetinių trukdžių, taip pat kiekviena laidų pora yra susukta kartu, kad būtų išvengta bet kokio srovės kilpos susidarymo ir tokiu būdu daug geresnė apsauga nuo triukšmo. Jie dažnai nutraukiami su 8 kontaktų RJ45 jungtimis abiejuose galuose. Yra daugybė Ethernet kabelių, kuriuos galime naudoti, kategorijų, tokių kaip CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A ir kt. Savo pamokoje naudosime CAT-6E kabelį, kuriame yra 4 susuktos 24AWG laidų poros ir galintis palaikyti iki 600MHz.
Paveikslėlis, parodantis, kaip laidų pora yra susukta CAT-6E kabelio izoliacijos sluoksnyje
RJ-45 jungtis skirta CAT-6E Ethernet kabeliui
„Arduino“ kodo paaiškinimas
Šiame projekte mes naudojame du „Arduino Nano“, vieną - kaip siųstuvą ir vieną - kaip imtuvą, kurie kiekvienas valdo 16 * 2 raidinį ir skaitmeninį LCD, kad būtų rodomi rezultatai. Taigi, „Arduino“ kode sutelksime dėmesį į duomenų siuntimą ir siunčiamų ar gautų duomenų rodymą LCD ekrane.
Dėl siųstuvo pusės:
Pradedame įtraukdami standartinę biblioteką, skirtą vairuoti LCD ekraną, ir deklaruojame „Arduino Nano“ D8 kaištį kaip išvesties kaištį, kurį vėliau panaudosime paskelbdami „MAX485“ modulį kaip siųstuvą ar imtuvą.
int enablePin = 8; int potval = 0; # įtraukti
Dabar einu į sąrankos dalį. Mes pakelsime įgalinimo kaištį aukštai, kad MAX485 modulis būtų siųstuvo režime. Kadangi tai yra pusiau dupleksinis IC, jis negali tiek perduoti, tiek priimti tuo pačiu metu. Čia taip pat inicializuosime skystųjų kristalų ekraną ir atsispausdinsime sveikinimo pranešimą.
Serijos pradžia (9600); // inicializuoti seriją baudos greičiu 9600: pinMode (enablePin, OUTPUT); lcd.prade (16,2); lcd.print („CIRCUIT DIGEST“); lcd.setCursor (0,1); lcd.print („Nano siųstuvas“); vėlavimas (3000); lcd.clear ();
Dabar cikle rašome nuolat didėjančią sveikojo skaičiaus vertę nuosekliose linijose, kuri tada perduodama kitam nano. Ši reikšmė taip pat atspausdinta LCD ekrane, kad būtų galima rodyti ir derinti.
Serial.print („Išsiųsta vertė =“); Serial.println (potval); // Serial Write POTval į RS-485 magistralę lcd.setCursor (0,0); lcd.print („Išsiųsta vertė“); lcd.setCursor (0,1); lcd.print (potval); vėlavimas (1000); lcd.clear (); potval + = 1;
Imtuvo pusė:
Vėlgi, mes pradedame įtraukti standartinę biblioteką, skirtą LCD valdymui, ir paskelbiame „Arduino Nano“ D8 kaištį kaip išvesties kaištį, kurį vėliau naudosime paskelbdami „MAX485“ modulį kaip siųstuvą ar imtuvą.
int enablePin = 8; # įtraukti
Dabar einu į sąrankos dalį. Norėdami įjungti MAX485 modulį į imtuvo režimą, aukštai ištrauksime įgalinimo kaištį. Kadangi tai yra pusiau dupleksinis IC, jis negali tiek perduoti, tiek priimti tuo pačiu metu. Čia taip pat inicializuosime skystųjų kristalų ekraną ir atsispausdinsime sveikinimo pranešimą.
Serijos pradžia (9600); // inicializuoti seriją baudos greičiu 9600: pinMode (enablePin, OUTPUT); lcd.prade (16,2); lcd.print („CIRCUIT DIGEST“); lcd.setCursor (0,1); lcd.print („Nano imtuvas“); vėlavimas (3000); „digitalWrite“ („enablePin“, „LOW“); // (8 kaištis visada LOW gauti vertę iš Master)
Dabar cikle patikriname, ar serijiniame prievade yra nieko laisvo, tada perskaitome duomenis, o kadangi gaunami duomenys yra sveikas skaičius, mes juos analizuojame ir rodome prijungtame LCD.
int pwmval = Serial.parseInt (); // Gaukite INTEGER reikšmę iš Master throught RS-485 Serial.print ("Aš gavau vertę"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Gauta vertė"); lcd.setCursor (0,1); lcd.print (pwmval); vėlavimas (1000); lcd.clear ();
Išvada
Testo sąranką, kurią naudojome šiam projektui, galite rasti žemiau.
Visą šio projekto darbą galite rasti žemiau esančiame vaizdo įraše. Šis metodas yra vienas iš paprastų ir lengvai įgyvendinamų duomenų perdavimo dideliais atstumais būdų. Šiame projekte mes naudojome tik 9600 perdavimo spartą, kuri yra gerokai mažesnė už maksimalų perdavimo greitį, kurį galime pasiekti naudodami „MAX-485“ modulį, tačiau šis greitis tinka daugumai ten esančių jutiklių modulių ir mums to tikrai nereikia visas didžiausias greitis dirbant su „Arduino“ ir kitomis programinės įrangos plokštėmis, nebent kabelį naudojate kaip „Ethernet“ jungtį ir jums nereikia viso pralaidumo ir perdavimo greičio. Pažaiskite patys su perdavimo greičiu ir pabandykite naudoti kitus „Ethernet“ kabelio tipus. Jei turite klausimų, palikite juos komentarų skiltyje žemiau arba naudokitės mūsų forumais, ir aš pasistengsiu kuo geriau į juos atsakyti. Iki to laiko, adios!