Turinys:

Super paprasta „Raspberry Pi“433 MHz namų automatika: 7 žingsniai
Super paprasta „Raspberry Pi“433 MHz namų automatika: 7 žingsniai

Video: Super paprasta „Raspberry Pi“433 MHz namų automatika: 7 žingsniai

Video: Super paprasta „Raspberry Pi“433 MHz namų automatika: 7 žingsniai
Video: Высокая плотность 2022 2024, Lapkritis
Anonim
Super paprasta „Raspberry Pi“433 MHz namų automatika
Super paprasta „Raspberry Pi“433 MHz namų automatika

Ši pamoka yra viena iš daugelio, kai reikia naudoti „Raspberry Pi“belaidžiams įrenginiams valdyti namuose. Kaip ir daugelis kitų, jis parodys, kaip naudotis pigia siųstuvo/imtuvo pora, prijungta prie jūsų „Pi“, kad galėtumėte bendrauti su įrenginiais, veikiančiais dažniausiai naudojamoje 433 MHz radijo dažnių juostoje. Tai konkrečiai parodys, kaip įjungti arba išjungti bet kurį elektrinį įrenginį naudojant „Pi“, perduodant komandas į 433 MHz nuotoliniu būdu valdomų maitinimo lizdų rinkinį.

Kodėl sukūriau šią pamoką, jei tiek daug jau yra? Daugiausia todėl, kad beveik visos kitos pamokos, su kuriomis susidūriau, atrodė pernelyg sudėtingos, ypač programinės įrangos pusėje. Pastebėjau, kad jie labai pasitikėjo trečiųjų šalių bibliotekomis, scenarijais ar kodo fragmentais, kad atliktų visą darbą. Daugelis net nepaaiškintų, ką daro pagrindinis kodas - jie tiesiog paprašytų jūsų į „Pi“įkelti dvi ar tris programinės įrangos dalis ir vykdyti daugybę komandų, be jokių klausimų. Aš tikrai norėjau išbandyti ir naudoti savo „Pi“, kad įjungčiau ir išjungčiau elektros prietaisus aplink savo namus, naudodamas 433 MHz nuotoliniu būdu valdomų lizdų rinkinį, tačiau norėjau sukurti savo sistemos versiją, kurią galėčiau suprasti, tikiuosi, kad nebereikės naudotis kažkieno bibliotekomis ar scenarijais.

Apie tai ši pamoka. Šios sistemos programinę įrangą sudaro du labai paprasti „Python“scenarijai - vienas signalams priimti ir įrašyti, kitas - perduoti šiuos signalus atgal į belaidžius maitinimo lizdus. Tikrasis signalo priėmimas/perdavimas priklauso tik nuo lengvai naudojamos RPi. GPIO bibliotekos, kuri, bent jau man, buvo iš anksto įdiegta kartu su „Raspbian“. Šią biblioteką taip pat galima importuoti tiesiai į „Python“.

Šiam projektui jums reikės:

Aviečių Pi. Bet koks modelis turėtų veikti, aš naudojau „viskas viename“pradinį rinkinį, bet galbūt jums reikia tik centrinio įrenginio

433MHz siųstuvo/imtuvo pora. Atrodo, kad dažniausiai naudojami tokio tipo projektai. Pirkdami pakuotę iš penkių, kaip nurodyta susieta, užtikrinsite keletą atsarginių dalių

433MHz nuotoliniu būdu valdomų maitinimo lizdų rinkinys. Aš naudoju šiuos, kuriuos labai rekomenduočiau, tačiau yra daugybė modelių. Tiesiog įsitikinkite, kad jie veikia šiuo dažniu

Kai kurie grandinės kūrimo priedai. Kad grandinės kūrimo procesas būtų kuo lengvesnis, rekomenduočiau naudoti duonos lentą ir kai kuriuos trumpiklius.

[Jei nuspręsite įsigyti bet kurį iš šių produktų, būčiau labai dėkingas, jei pateksite į sąrašus naudodami aukščiau pateiktas nuorodas - tokiu būdu aš gausiu nedidelę pelno dalį be jokių papildomų mokesčių!]

1 veiksmas: imtuvo įrenginio nustatymas

Imtuvo įrenginio nustatymas
Imtuvo įrenginio nustatymas

Prieš naudodami „Pi“komandoms siųsti į nuotolinio valdymo lizdus, turite žinoti, į kokius konkrečius signalus jie reaguoja. Dauguma nuotolinio valdymo lizdų tiekiami su rageliu, kuriuo galima įjungti arba išjungti tam tikrus įrenginius. Kalbant apie tuos, kuriuos nusipirkau, ragelyje yra keturios suporuotų įjungimo/išjungimo mygtukų eilės, iš kurių kiekvienas siunčia įjungimo arba išjungimo signalą tam tikram lizdo blokui.

Tai kelia klausimą - kaip mes žinome, kurie mygtukai atitinka kurį lizdą? Tai iš tikrųjų priklauso nuo jūsų turimo modelio. Viena iš pagrindinių priežasčių, kodėl pasirinkau savo lizdo stilių (susietą įžangoje), yra tas, kad įrenginius galima sukonfigūruoti naudojant fizinį jungiklį, kad tam tikras lizdas reaguotų į tam tikrą ragelio įjungimo/išjungimo mygtukų rinkinį. Tai taip pat reiškia, kad galite atjungti ir perkelti lizdus po namus žinodami, kad kiekvienas įrenginys visada reaguos į tuos pačius įjungimo/išjungimo signalus.

Kai suprasite, kaip jūsų lizdai sąveikauja su rageliu, turėsite naudoti 433MHz imtuvo bloką (pavaizduotą aukščiau), kad „užuostumėte“ragelio siunčiamus kodus. Įrašę šių kodų bangų formas, galite juos pakartoti naudodami „Python“ir išsiųsti naudodami siųstuvo bloką.

Pirmas dalykas, kurį reikia padaryti, yra prijungti imtuvo kaiščius prie tinkamų „GP“kaiščių. Imtuvas turi keturis kaiščius, tačiau jų reikia tik trijų. Manau, kad abu centriniai kaiščiai duoda tą pačią išvestį, todėl jums reikia prisijungti tik prie vieno iš jų (nebent norite perduoti gautus signalus į du atskirus GPIO kaiščius).

Aukščiau pateiktas vaizdas beveik apibendrina laidus. Kiekvienas imtuvo kaištis gali būti prijungtas tiesiai prie atitinkamo Pi kaiščio. Aš naudoju duonos lentą ir trumpiklius, kad procesas būtų šiek tiek elegantiškesnis. Atminkite, kad galite pasirinkti bet kurį GPIO duomenų kaištį, kad galėtumėte prisijungti prie bet kurio centrinio imtuvo kaiščio. Aš naudoju smeigtuką, pažymėtą „23“savo „Pi“antraštėje.

SVARBU: Jei prijungsite kaištį, pažymėtą „3v3“aukščiau esančiame paveikslėlyje, prie aukštesnės įtampos kaiščio ant Pi (pvz., 5v), greičiausiai sugadinsite Pi, nes GPIO kaiščiai negali toleruoti didesnės nei 3v3 įtampos. Arba galite maitinti 5 V įtampa ir nustatyti įtampos skirstytuvą, kad DATA kaištis būtų saugiai nusiųstas.

Prie šios įtampos imtuvo diapazonas nebus labai didelis, ypač jei antena nėra prijungta. Tačiau čia nereikia didelio nuotolio - kol imtuvas gali priimti signalus iš ragelio, kai jie yra laikomi vienas šalia kito, tai yra viskas, ko mums reikia.

2 veiksmas: ragelio kodų uostymas

Ragelio kodų uostymas
Ragelio kodų uostymas

Dabar, kai jūsų imtuvas prijungtas prie „Pi“, galite pradėti pirmąjį jaudinantį šio projekto etapą - uostyti. Tai apima pridedamo „Python“scenarijaus naudojimą, norint įrašyti ragelio perduodamą signalą, kai paspaudžiamas kiekvienas mygtukas. Scenarijus yra labai paprastas, ir aš labai rekomenduoju jums jį pažiūrėti prieš jį paleidžiant - juk šio projekto esmė yra ta, kad ne tik aklai paleisite kažkieno kodą!

Prieš pradėdami šį procesą, turėsite įsitikinti, kad turite „Python“bibliotekas, reikalingas paleisti „sniffer“scenarijų. Jie išvardyti scenarijaus viršuje:

nuo datos laiko importavimo datos laiko

importuoti matplotlib.pyplot kaip pyplot importuoti RPi. GPIO kaip GPIO

RPi. GPIO ir datetime bibliotekos buvo įtrauktos į mano Raspbian platinimą, tačiau turėjau įdiegti matplotlib biblioteką taip:

sudo apt-get install python-matplotlib

Ši biblioteka yra dažniausiai naudojama grafikų braižymo biblioteka, kuri yra labai naudinga net ir už šio projekto ribų, todėl jos įdiegimas tikrai nepakenks! Kai jūsų bibliotekos bus atnaujintos, būsite pasirengę pradėti įrašyti duomenis. Štai kaip veikia scenarijus:

Kai jis paleidžiamas (naudojant komandą „python ReceiveRF.py“), jis sukonfigūruos apibrėžtą GPIO kaištį kaip duomenų įvestį (pagal numatytuosius nustatymus 23 kontaktas). Tada jis nuolat ims kaiščio mėginius ir registruos, ar jis gauna skaitmeninį 1, ar 0. Tai tęsiasi nustatytą laiką (pagal numatytuosius nustatymus - 5 sekundes). Pasiekus šį terminą, scenarijus nustos įrašyti duomenis ir uždarys GPIO įvestį. Tada jis atlieka nedidelį papildomą apdorojimą ir nubraižo gautą įvesties vertę pagal laiką. Vėlgi, jei turite klausimų apie tai, ką daro scenarijus, tikriausiai galite patys į juos atsakyti, pažiūrėję, kaip jis veikia. Aš stengiausi, kad kodas būtų kuo suprantamesnis ir paprastesnis.

Ką reikia padaryti, tai atkreipti dėmesį, kai scenarijus rodo, kad jis ** Pradėjo įrašinėti **. Kai pasirodys šis pranešimas, turėtumėte maždaug sekundę paspausti ir palaikyti vieną iš ragelio mygtukų. Būtinai laikykite jį arti imtuvo. Kai scenarijus bus baigtas įrašyti, jis naudos matplotlib, kad sudarytų grafinę signalo, gauto per įrašymo intervalą, bangos formą. Atminkite, kad jei esate prisijungę prie „Pi“naudodami SSH klientą, pvz., „PuTTY“, taip pat turėsite atidaryti „X11“programą, kad būtų rodoma bangos forma. Tam naudoju „xMing“(ir kitiems dalykams, pvz., Nuotoliniam darbalaukio įvedimui į „Pi“). Kad būtų galima rodyti schemą, prieš paleisdami scenarijų tiesiog paleiskite „xMing“ir palaukite, kol pasirodys rezultatai.

Kai pasirodys jūsų matplotlib langas, sklypo interesų sritis turėtų būti gana akivaizdi. Galite naudoti lango apačioje esančius valdiklius, kad padidintumėte tol, kol galėsite nustatyti ragelio perduodamo signalo aukštumas ir žemumas, kai mygtukas laikomas nuspaustas. Viso kodo pavyzdį rasite aukščiau esančiame paveikslėlyje. Signalas tikriausiai susideda iš labai trumpų impulsų, atskirtų panašiais laikotarpiais, kai signalas nėra priimamas. Tikėtina, kad po šio trumpų impulsų bloko bus ilgesnis laikotarpis, kai nieko nebus gauta, o po to modelis kartosis. Nustačius šabloną, priklausantį vienam kodo egzemplioriui, šio puslapio viršuje padarykite tokią ekrano kopiją ir tęskite kitą žingsnį, kad jį interpretuotumėte.

3 žingsnis: gauto signalo perrašymas

Gauto signalo perrašymas
Gauto signalo perrašymas

Dabar, kai nustatėte tam tikro mygtuko signalą atitinkančių periodinių aukštų ir žemų dažnių bloką, jums reikės jo išsaugojimo ir aiškinimo būdo. Aukščiau pateiktame signalo pavyzdyje pastebėsite, kad yra tik du unikalūs modeliai, sudarantys visą signalo bloką. Kartais matai trumpą aukščiausią lygį, po kurio eina ilgas žemas, o kartais būna priešingai - ilgą aukštą, o po to - trumpą žemą. Kai perrašinėjau savo signalus, nusprendžiau naudoti šią pavadinimo taisyklę:

1 = trumpas_įjungtas + ilgas_0

Pažvelkite dar kartą į pažymėtą bangos formą ir pamatysite, ką turiu omenyje. Nustačius lygiaverčius modelius savo signale, tereikia suskaičiuoti 1 ir 0, kad būtų sukurta seka. Perrašant aukščiau pateiktą signalą galima parašyti taip:

1111111111111010101011101

Dabar jums tereikia pakartoti šį procesą, kad įrašytumėte ir perrašytumėte signalus, atitinkančius kitus ragelio mygtukus, ir baigėte pirmąją proceso dalį!

Prieš iš naujo siunčiant signalus naudojant siųstuvą, reikia šiek tiek daugiau nuveikti. Laikas tarp aukštumų ir žemumų, atitinkančių 1 arba 0, yra labai svarbus, ir jūs turite įsitikinti, kad žinote, kiek laiko „short_on“arba „long_off“iš tikrųjų trunka. Mano kodams buvo trys laiko informacijos duomenys, kuriuos turėjau išgauti, kad galėčiau pakartoti signalus:

  • Trumpo intervalo trukmė, ty 1 pradžia arba 0 pabaiga.
  • „Ilgo“intervalo trukmė, ty 1 pabaiga arba 0 pradžia.
  • „Išplėstinio“intervalo trukmė. Pastebėjau, kad kai laikiau nuspaudęs ragelio mygtuką, tarp kiekvieno pakartotinio signalo bloko egzemplioriaus buvo „pratęstas išjungimo“laikotarpis. Šis uždelsimas naudojamas sinchronizavimui ir turi fiksuotą trukmę.

Norėdami nustatyti šias laiko reikšmes, galite naudoti mastelio keitimo funkciją matplotlib lange, kad priartintumėte iki galo ir užveskite žymeklį ant atitinkamų signalo dalių. Žymeklio vietos nuskaitymas lango apačioje turėtų leisti nustatyti, kokio pločio kiekviena signalo dalis atitinka ilgą, trumpą ar prailgintą intervalą. Atminkite, kad grafiko x ašis reiškia laiką, o žymeklio rodinio x komponentas yra sekundžių vienetais. Man pločiai buvo tokie (sekundėmis):

  • trumpas delsimas = 0,00045
  • long_delay = 0,00090 (dvigubai ilgesnis už „trumpą“)
  • prailgintas delsimas = 0,0096

4 žingsnis: siųstuvo įrenginio nustatymas

Siųstuvo įrenginio nustatymas
Siųstuvo įrenginio nustatymas

Surinkę kodus ir laiko duomenis, galite atjungti imtuvą, nes jums jo nebereikės. Tada galite prijungti siųstuvą tiesiai prie atitinkamų Pi GPIO kaiščių, kaip parodyta aukščiau esančiame paveikslėlyje. Radau, kad siųstuvo blokų kaiščiai yra paženklinti, o tai palengvina procesą.

Tokiu atveju įrenginį galima maitinti naudojant 5 V maitinimo šaltinį iš „Pi“, nes DATA kaištis nesiunčia signalų į „Pi“, o tik juos priima. Be to, 5 V maitinimo šaltinis suteiks didesnį perdavimo diapazoną nei naudojant 3 V3 maitinimo šaltinį. Vėlgi, galite prijungti DATA kaištį prie bet kurio tinkamo „Pi“kaiščio. Aš naudojau 23 kaištį (tą patį kaip ir imtuvui).

Kitas dalykas, kurį rekomenduočiau padaryti, yra pridėti anteną prie mažos skylės viršutiniame dešiniajame siųstuvo kampe. Aš naudojau 17 cm ilgio tiesios vielos gabalą. Kai kurie šaltiniai rekomenduoja panašaus ilgio ritę. Aš nesu tikras, kuris yra geresnis, tačiau tiesi viela suteikia pakankamai galimybių, kad galėčiau įjungti/išjungti lizdus iš bet kurios mažo buto vietos. Geriausia lituoti anteną, bet aš ką tik pašalinau plastiką nuo vielos ir apvyniojau varį per skylę.

Kai siųstuvas yra prijungtas, visa aparatūros sąranka atlikta! Vienintelis dalykas, kurį dabar reikia padaryti, yra pastatyti lizdus aplink namą ir pažvelgti į siųstuvo programą.

5 žingsnis: signalų perdavimas naudojant „Pi“

Čia atsiranda antrasis „Python“scenarijus. Jis sukurtas taip, kad būtų toks pat paprastas, kaip ir pirmasis, jei ne daugiau. Vėlgi, atsisiųskite jį ir peržiūrėkite kodą. Turėsite redaguoti scenarijų, kad perduotumėte teisingus signalus pagal duomenis, kuriuos įrašėte atlikdami 3 veiksmą, todėl dabar tinkamas laikas greitai į jį pažvelgti.

Visos bibliotekos, reikalingos šiam scenarijui paleisti, buvo iš anksto įdiegtos mano „Pi“, todėl tolesnio diegimo nereikėjo. Jie išvardyti scenarijaus viršuje:

importo laikas

importuoti sys importuoti RPi. GPIO kaip GPIO

Po bibliotekos importu yra informacija, kurią turėsite redaguoti. Štai kaip jis atrodo pagal numatytuosius nustatymus (tai informacija, atitinkanti mano lizdus, nustatytus naudojant 3 veiksmą):

a_on = '1111111111111010101011101'

a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 long_delay = 0,00090 extended_delay = 0,0096

Čia yra aštuonios kodo eilutės (dvi kiekvienai įjungimo/išjungimo mygtukų porai mano ragelyje - gali būti, kad turite daugiau ar mažiau kodų), o po to trys laiko informacijos dalys, taip pat nustatytos 3 veiksme. Skirkite laiko ir įsitikinkite, kad teisingai įvedė šią informaciją.

Kai būsite patenkinti į scenarijų įvestais kodais/vėlavimais (jei norite, galite pervardyti kodo eilutės kintamuosius), esate beveik pasiruošę išbandyti sistemą! Prieš tai pažiūrėkite į scenarijaus funkciją „send_code ()“. Čia vyksta tikroji sąveika su siųstuvu. Ši funkcija tikisi, kad viena iš kodo eilučių bus išsiųsta kaip argumentas. Tada jis atveria apibrėžtą kaištį kaip GPIO išvestį ir eina per kiekvieną kodo eilutės simbolį. Tada jis įjungia arba išjungia siųstuvą pagal jūsų įvestą laiko informaciją, kad sukurtų bangos formą, atitinkančią kodo eilutę. Jis siunčia kiekvieną kodą kelis kartus (10 pagal numatytuosius nustatymus), kad sumažėtų tikimybė, kad jis bus praleistas, ir palieka pratęstą delsą tarp kiekvieno kodo bloko, kaip ir ragelis.

Norėdami paleisti scenarijų, galite naudoti šią komandų sintaksę:

python TransmitRF.py code_1 code_2…

Vienu scenarijaus vykdymu galite perduoti kelias kodo eilutes. Pavyzdžiui, norėdami įjungti lizdus (a) ir (b) ir lizdą (c), paleiskite scenarijų naudodami šią komandą:

python TransmitRF.py a_on b_on c_off

6 žingsnis: pastaba apie laiko tikslumą

Kaip minėta, laikas tarp perduodamų įjungimo/išjungimo impulsų yra gana svarbus. TransmitRF.py scenarijus naudoja „python“laiko.sleep () funkciją, kad sukurtų bangų formas su teisingais impulsų intervalais, tačiau reikia pažymėti, kad ši funkcija nėra visiškai tiksli. Ilgis, per kurį scenarijus turi laukti prieš atliekant kitą operaciją, gali priklausyti nuo procesoriaus apkrovos tą akimirką. Tai dar viena priežastis, kodėl „TransmitRF.py“siunčia kiekvieną kodą kelis kartus - tik tuo atveju, jei funkcija time.sleep () negali tinkamai sukonstruoti tam tikro kodo egzemplioriaus.

Aš asmeniškai niekada neturėjau problemų su time.sleep (), kai reikia siųsti kodus. Tačiau aš žinau, kad mano time.sleep () klaidos būna apie 0,1 ms. Aš tai nustatiau naudodamas pridėtą „SleepTest.py“scenarijų, kuris gali būti naudojamas norint įvertinti, kiek tiksliai yra jūsų „Pi's time.sleep“() funkcija. Mano konkrečiai nuotoliniu būdu valdomų lizdų atveju trumpiausias delsimas, kurį man reikėjo įgyvendinti, buvo 0,45 ms. Kaip jau sakiau, neturėjau problemų dėl nereaguojančių lizdų, todėl atrodo, kad 0,45 ± 0,1 ms yra pakankamai geras.

Yra ir kitų metodų, užtikrinančių, kad vėlavimas būtų tikslesnis; Pavyzdžiui, kodams generuoti galite naudoti tam skirtą PIC mikroschemą, tačiau tokie dalykai nepatenka į šio vadovo taikymo sritį.

7 žingsnis: Išvada

Išvada
Išvada

Šiame projekte pristatytas bet kurio elektros prietaiso valdymo metodas naudojant „Raspberry Pi“ir 433 MHz nuotoliniu būdu valdomų lizdų rinkinį, daugiausia dėmesio skiriant paprastumui ir skaidrumui. Tai yra pats įdomiausias ir lankstiausias projektas, kuriam naudoju savo „Pi“, ir jam yra beribės programos. Štai keletas dalykų, kuriuos dabar galiu padaryti savo „Pi“dėka:

  • Įjunkite elektrinį šildytuvą šalia mano lovos likus pusvalandžiui iki mano žadintuvo.
  • Išjunkite šildytuvą praėjus valandai po to, kai užmigau.
  • Įsijungus žadintuvui, įjunkite nakties šviesą, kad neužmigčiau.
  • ir daug daugiau…

Daugeliui šių užduočių aš naudoju „crontab“funkciją „Linux“. Tai leidžia nustatyti automatines suplanuotas užduotis, kad „TransmitRF.py“scenarijus būtų paleistas tam tikru laiku. Taip pat galite naudoti komandą „Linux“komandai atlikti vienkartines užduotis (kurias man reikėjo įdiegti atskirai naudojant „sudo apt-get install at“). Pavyzdžiui, norėdamas įjungti šildytuvą pusvalandį prieš žadintuvo išjungimą kitą rytą, turiu tik įvesti:

05:30 val

python TransmitRF.py c_on

Jūs taip pat galėtumėte naudoti šį projektą kartu su mano „Dropbox“namų stebėjimo sistema, kad galėtumėte valdyti prietaisus internetu! Dėkojame, kad perskaitėte, ir jei norite ką nors paaiškinti ar pasidalinti savo nuomone, rašykite komentarą!

Rekomenduojamas: