Turinys:

„Arduino“RF jutiklio dekoderis: 5 žingsniai
„Arduino“RF jutiklio dekoderis: 5 žingsniai

Video: „Arduino“RF jutiklio dekoderis: 5 žingsniai

Video: „Arduino“RF jutiklio dekoderis: 5 žingsniai
Video: Using IR Remote Controls with the Arduino 2024, Lapkritis
Anonim
„Arduino“RF jutiklio dekoderis
„Arduino“RF jutiklio dekoderis

Mano ankstesniuose namuose buvo iš anksto įdiegta apsaugos sistema, kurioje buvo durų jutikliai, judesio jutiklis ir valdymo skydelis. Viskas buvo tvirtai prijungta prie didelės elektroninės dėžutės spintoje ir buvo nurodymai, kaip prijungti fiksuotojo ryšio telefoną, kad automatiškai skambintų pavojaus atveju. Kai bandžiau žaisti su juo, sužinojau, kad vienas iš durų jutiklių buvo nepilnai sumontuotas, o kitas - su pertrūkiais dėl netinkamo išlygiavimo. Tiek to profesionalios instaliacijos, nurodytos apsaugos įmonės vizitinėje kortelėje. Mano sprendimas tuo metu buvo nusipirkti porą interneto apsaugos kamerų ir pigią belaidę apsaugos signalizaciją.

Greitai pirmyn į šiandieną ir tas belaidis signalas sėdi dėžutėje mano rūsyje. Įsigijęs pigų radijo imtuvą, nusprendžiau išsiaiškinti, ar galiu iššifruoti pranešimus, kuriuos perduoda įvairūs turimi aliarmo jutikliai ir nuotolinio valdymo pultai. Aš supratau, kad kadangi jie visi dirbo su pigiu signalizacijos langeliu, jie visi turi naudoti tą patį pranešimo formatą tik su kitu ID. Netrukus sužinojau, kad jie panašūs tik bendra pranešimų struktūra. Taigi projektas greitai tapo nereikšmingas ir tapo labai įdomus.

1 žingsnis: jutiklių moduliai

Jutiklių moduliai
Jutiklių moduliai
Jutiklių moduliai
Jutiklių moduliai
Jutiklių moduliai
Jutiklių moduliai
Jutiklių moduliai
Jutiklių moduliai

Kaip matote aukščiau esančiose nuotraukose, siųstuvai apima durų atidarymo jutiklius, judesio jutiklius, įjungimo nuotolinio valdymo pultus ir belaidę klaviatūrą, naudojamą aliarmo dėžutės programavimui. Kaip paaiškėja, nė vienas iš šių įrenginių nenaudoja vienodo sinchronizavimo ilgio arba bitų trukmės. Vienintelis bendras dalykas, išskyrus pranešimo ilgį, yra pagrindinis bitų formatas. Kiekvienas bitas užima tam tikrą laiką, o skirtumas tarp nulio ir vieno yra aukštų/žemų dalių darbo ciklas.

Aukščiau parodyta graži bangos forma nėra tai, ką aš pirmą kartą gavau. Kadangi 433 MHz dažnių juostoje yra tiek daug srauto, turėjau būtinai suaktyvinti jutiklį prieš pat nustatydamas apimtį, kad būtų atliktas vienas trigeris. Laimei, jutikliai suaktyvina kelias duomenų pranešimo kopijas, o nuotolinio valdymo pultas ir klaviatūra toliau siunčia pranešimus tol, kol paspaudžiamas mygtukas. Naudodamas apimtį galėjau nustatyti kiekvieno elemento sinchronizavimo ilgį ir duomenų bitų trukmę. Kaip minėta anksčiau, sinchronizavimo laikas yra skirtingas ir bitų laikas yra skirtingas, tačiau visi pranešimų formatai yra žemo lygio sinchronizavimo, po kurio eina 24 duomenų bitai ir vienas sustojimo bitas. To pakako, kad galėčiau programinėje įrangoje sukurti bendrąjį dekoderį, nekoduodamas visų skirtingų įrenginio detalių.

2 žingsnis: Aparatūra

Techninė įranga
Techninė įranga
Techninė įranga
Techninė įranga

Iš pradžių sukūriau jutiklių dekoderį, naudodamas PIC mikrovaldiklį ir surinkimo kalbą. Neseniai žaidžiau su „Arduino“variantais, todėl maniau, kad pažiūrėsiu, ar galėčiau tai pakartoti. Paprasta schema parodyta aukščiau, taip pat yra mano prototipo nuotrauka. Viskas, ką aš padariau, buvo naudoti tris įprastus trumpiklius, kad pereitumėte nuo „Arduino Nano“prie RF imtuvo plokštės. Viskas, ko reikia, yra maitinimas ir viena duomenų linija.

Jei perskaitysite mano instrukciją „3 viename laiko ir orų ekrane“, pamatysite, kad naudoju įprastą RXB6, 433 MHz imtuvą. Gali būti, kad tikrai pigūs imtuvai veiks tokiu trumpu atstumu, kokio reikia šiam projektui, bet vis tiek rekomenduoju naudoti superheterodino imtuvą.

3 žingsnis: programinė įranga

Programinė įranga konvertuoja gautus bitus į rodomus ASCII simbolius. Jis pateikia sinchronizavimo ilgio vertę ir 1 bei 0 bitų ilgį. Kadangi jau žinojau sinchronizavimo ilgį ir bitų formatus, galėjau parašyti programinę įrangą specialiai jiems. Vietoj to nusprendžiau pažiūrėti, ar galėčiau jį parašyti, kad sutvarkyčiau sinchronizavimo ilgį ir automatiškai išsiaiškintų duomenų bitus. Tai turėtų palengvinti pakeitimus, jei norėčiau bandyti aptikti kitus formatus. Svarbu pažymėti, kad programinė įranga nežino, ar pirmasis pranešimo bitas yra 1, ar 0. Ji daro prielaidą, kad tai yra 1, tačiau, jei paaiškės, kad tai turėjo būti nulis, ji apvers bitų užbaigtame pranešime prieš išsiunčiant jį iš serijinio prievado.

Sinchronizavimo impulso ir duomenų bitų laikas nustatomas naudojant INT0 išorinio pertraukimo įvestį, kad būtų suaktyvintas pertraukimo tvarkytojas. INT0 gali suveikti kylant, krintant arba abiejuose kraštuose arba pastoviai žemame lygyje. Programinė įranga nutrūksta abiejuose kraštuose ir matuoja, kiek laiko impulsas lieka žemas. Tai supaprastina dalykus, nes pranešimo pradžia/sinchronizavimas yra žemo lygio impulsas, o bitai gali būti nustatyti pagal jų žemo lygio laiką.

Pertraukų tvarkytojas pirmiausia nustato, ar užfiksuotas skaičius yra pakankamai ilgas, kad būtų pradinis/sinchronizuojantis impulsas. Įvairūs mano turimi įrenginiai naudoja 4, 9, 10 ir 14 milisekundžių sinchronizavimo impulsus. Minimalios/maksimalios leistinos sinchronizavimo reikšmių apibrėžtys yra programinėje įrangoje ir šiuo metu nustatytos 3 ir 16 milisekundžių. Bitų laikas taip pat skiriasi jutikliuose, todėl bitų dekodavimo algoritmas turi į tai atsižvelgti. Išsaugomas pirmojo bitų bitų laikas, kaip ir kito bitų, turinčių reikšmingą skirtumą nuo pirmojo bitų, laikas. Tiesioginis vėlesnių bitų laikų palyginimas neįmanomas, todėl naudojama „fudge factor“apibrėžtis („Variation“). Bitų dekodavimas prasideda darant prielaidą, kad pirmasis duomenų bitas visada įrašomas kaip 1 logika. Ši vertė išsaugoma ir naudojama tolesniems bitams išbandyti. Jei vėlesnis duomenų bitų skaičius yra išsaugotos vertės dispersijos lange, jis taip pat įrašomas kaip logika 1. Jei jis yra už išsaugotos vertės dispersijos lango ribų, jis įrašomas kaip logika 0. Jei logika 0 bitų laikas yra trumpesnis nei pirmasis bitų laikas, tada nustatoma vėliava, nurodanti programinei įrangai, kad prieš rodant baitus reikia apversti. Vienintelis atvejis, kai šis algoritmas nepavyksta, yra tada, kai pranešimo bitai yra visi 0. Mes galime priimti šį apribojimą, nes tokia žinia yra beprasmė.

Visi mane dominantys jutikliai turi 24 duomenų bitų pranešimo ilgį, tačiau programinė įranga tuo neapsiriboja. Yra buferis iki septynių baitų (gali būti pridėta daugiau) ir nustato minimalų ir maksimalų pranešimo ilgį baitais. Programinė įranga yra sukurta rinkti bitus, konvertuoti juos į baitus, laikinai saugoti ir tada išvesti juos ASCII formatu per nuoseklųjį prievadą. Įvykis, sukeliantis pranešimo išvestį, yra naujo pradžios/sinchronizavimo impulso gavimas.

4 žingsnis: duomenų registravimas

Duomenų registravimas
Duomenų registravimas

Programinė įranga yra sukurta taip, kad konvertuotus duomenis išvestų kaip ASCII simbolius per „Arduino“serijos (TX) išvestį. Kai sukūriau PIC versiją, turėjau prisijungti prie kompiuterio terminalo programos, kad galėčiau rodyti duomenis. Vienas iš „Arduino IDE“pranašumų yra tas, kad jame yra įmontuota serijinio monitoriaus funkcija. Nustatiau nuoseklaus prievado greitį 115,2 k, o tada serijinio monitoriaus lange nustatiau tą patį greitį. Ekrano kopijoje čia rodomas tipiškas ekranas su išėjimais iš įvairių mano turimų jutiklių. Kaip matote, duomenys kartais nėra tobuli, tačiau galite lengvai nustatyti, kokia turėtų būti tikroji kiekvieno jutiklio vertė.

5 veiksmas: imtuvo programinės įrangos pavyzdys

Imtuvo programinės įrangos pavyzdys
Imtuvo programinės įrangos pavyzdys

Įtraukiau programinės įrangos sąrašo pavyzdį, kuriame parodyta, kaip galite naudoti surinktą informaciją, kad gautumėte konkretų programos kodų rinkinį. Šis pavyzdys yra sukurtas imituoti vieną iš mano „Etekcity“nuotolinių parduotuvių. Viena komanda įjungia „Nano“įmontuotą šviesos diodą (D13), o kita komanda išjungia šviesos diodą. Jei jūsų „Arduino“nėra įmontuotas šviesos diodas, pridėkite rezistorių ir šviesos diodą, kaip parodyta diagramoje. Tikroje programoje ši funkcija įjungtų/išjungtų elektros lizdą (naudojant relę arba triacą). Sinchronizavimo laikas, bitų laikas ir numatomi duomenų baitai yra iš anksto apibrėžti, kad būtų lengviau modifikuoti. Galite naudoti bet kurią iš likusių duomenų eilučių, kad įjungtumėte/išjungtumėte konkrečią programą. Tiesiog pridėkite taikomą komandų kodą ir pakeiskite LED įjungimo/išjungimo logiką „cikle“, kad atitiktų jūsų poreikius.

Rekomenduojamas: