Kazalo:

Super preprosta domača avtomatizacija Raspberry Pi 433MHz: 7 korakov
Super preprosta domača avtomatizacija Raspberry Pi 433MHz: 7 korakov

Video: Super preprosta domača avtomatizacija Raspberry Pi 433MHz: 7 korakov

Video: Super preprosta domača avtomatizacija Raspberry Pi 433MHz: 7 korakov
Video: комплект умного дома с платой PLUS для arduino DIY STEM | Keyestudio 2024, November
Anonim
Super preprosta domača avtomatizacija Raspberry Pi 433MHz
Super preprosta domača avtomatizacija Raspberry Pi 433MHz

Ta vadnica je ena izmed mnogih, ko gre za uporabo Raspberry Pi za nadzor brezžičnih naprav doma. Tako kot mnogi drugi, vam bo pokazal, kako uporabiti poceni par oddajnik/sprejemnik, priključen na vaš Pi, za interakcijo z napravami, ki delujejo v pogosto uporabljanem radijskem frekvenčnem pasu 433MHz. Posebej vam bo pokazal, kako vklopite ali izklopite katero koli električno napravo s svojim Pi s prenosom ukazov na niz 433MHz daljinsko vodenih vtičnic.

Zakaj sem ustvaril to vadnico, če jih že obstaja toliko? Predvsem zato, ker so se mi zdile vse druge vaje, na katere sem naletel, preveč zapletene, zlasti na strani programske opreme. Opazil sem, da so se pri svojem delu močno zanašali na knjižnice, skripte ali delčke kode drugih proizvajalcev. Mnogi ne bi niti pojasnili, kaj počne osnovna koda - samo prosili bi vas, da na svoj Pi vstavite dva ali tri kose programske opreme in izvedete kup ukazov, brez vprašanj. Resnično sem želel poskusiti uporabiti svoj Pi za vklop in izklop električnih naprav po svojem domu z uporabo nabora 433MHz daljinsko vodenih vtičnic, vendar sem želel ustvariti svojo različico sistema, ki bi jo lahko razumel, upam, da odpravim potrebo po uporabite knjižnice ali skripte nekoga drugega.

O tem govori ta vadnica. Programsko stran tega sistema sestavljata dva zelo preprosta skripta Python - eden za sprejem in snemanje signalov in drugi za prenos teh signalov nazaj v brezžične vtičnice. Dejanski sprejem/prenos signala je odvisen le od enostavne knjižnice RPi. GPIO, ki je bila vsaj zame vnaprej nameščena z Raspbian. To knjižnico lahko tudi uvozite neposredno v Python.

Za ta projekt boste potrebovali:

Malina Pi. Vsak model bi moral delovati, uporabil sem začetni komplet vse v enem, morda pa potrebujete samo osrednjo enoto

Par oddajnik/sprejemnik 433MHz. Zdi se, da so najpogosteje uporabljeni pri tovrstnih projektih. Če kupite pet paketov, kot je tisti, ki je povezan, boste imeli nekaj rezervnih delov

Komplet 433MHz daljinsko vodenih vtičnic. Uporabil sem jih, ki jih toplo priporočam, vendar je na voljo nešteto modelov. Prepričajte se, da delujejo na tej frekvenci

Nekaj dodatkov za gradnjo vezja. Priporočam uporabo plošče in nekaj mostičnih kablov za čim lažji postopek izgradnje vezja.

[Če se odločite za nakup katerega od teh izdelkov, bi bil zelo hvaležen, če dostopate do njihovih seznamov prek zgornjih povezav - na ta način dobim majhen delež dobička brez dodatnih stroškov!]

1. korak: Nastavitev sprejemne enote

Nastavitev sprejemne enote
Nastavitev sprejemne enote

Preden lahko uporabite svoj Pi za pošiljanje ukazov v daljinsko vodene vtičnice, morate vedeti, na katere posebne signale se odzivajo. Večina daljinsko vodenih vtičnic je opremljena s prenosno enoto, s katero lahko vklopite ali izklopite določene enote. V primeru tistih, ki sem jih kupil, ima slušalka štiri vrstice seznanjenih gumbov za vklop/izklop, od katerih vsaka pošilja signal za vklop ali izklop na določeno vtičnico.

Odpre se vprašanje - kako vemo, kateri gumbi ustrezajo kateri vtičnici? To je dejansko odvisno od modela, ki ga imate. Eden glavnih razlogov, da sem se odločil za svoj poseben slog vtičnice (povezano v uvodu), je, da lahko enote konfigurirate s fizičnim stikalom, da se določena vtičnica odzove na določen nabor gumbov za vklop/izklop na slušalki. To tudi pomeni, da lahko vtičnice odklopite in premaknete po hiši, saj veste, da se bo vsaka enota vedno odzvala na iste signale VKLOP/IZKLOP.

Ko ugotovite, kako vaše vtičnice delujejo s slušalko, boste morali s sprejemno enoto 433MHz (na sliki zgoraj) "vohati" kode, ki jih pošilja prenosna enota. Ko posnamete valovne oblike teh kod, jih lahko podvojite s programom Python in jih pošljete s pomočjo oddajne enote.

Prva stvar, ki jo morate storiti tukaj, je, da priključite zatiče na sprejemniku na pravilne zatiče GPIO na Pi. Sprejemna enota ima štiri zatiče, vendar so potrebni le trije. Mislim, da oba osrednja zatiča dajeta enak izhod, zato se morate povezati le z enim od njiju (razen če želite prejemati prejete signale na dva ločena zatiča GPIO).

Zgornja slika precej povzema ožičenje. Vsak pin na sprejemniku lahko priključite neposredno na ustrezen pin na Pi. Za bolj eleganten postopek uporabljam ploščo in mostične kable. Upoštevajte, da lahko izberete kateri koli podatkovni zatič GPIO za povezavo z enim od osrednjih zatičev sprejemnika. Uporabil sem pin, označen kot "23" na glavi Pi.

POMEMBNO: Če priključite pin z oznako '3v3' na zgornji sliki na pin z višjo napetostjo na Pi (npr. 5v), boste verjetno poškodovali Pi, saj zatiči GPIO ne prenesejo napetosti nad 3v3. Druga možnost je, da ga napajate s 5V in nastavite delilnik napetosti za pošiljanje varne napetosti na pin DATA.

Domet sprejemnika pri tej napetosti ne bo zelo velik, še posebej, če antena ni priključena. Vendar tukaj ne potrebujete dolgega dosega - dokler sprejemnik lahko sprejema signale iz slušalke, ko so tik ob drugem, je to vse, kar potrebujemo.

2. korak: Vdihnite kode slušalk

Vdihavanje kode slušalke
Vdihavanje kode slušalke

Zdaj, ko je vaš sprejemnik priključen na Pi, lahko začnete prvo vznemirljivo fazo tega projekta - vohanje. To vključuje uporabo priloženega skripta Python za snemanje signala, ki ga prenaša prenosna enota, ko pritisnete vsak gumb. Scenarij je zelo preprost in toplo vam priporočam, da ga pogledate, preden ga zaženete - navsezadnje je bistvo tega projekta, da ne boste slepo izvajali kode nekoga drugega!

Preden začnete ta postopek, se boste morali prepričati, da imate knjižnice Python, potrebne za zagon skripta snifferja. Navedeni so na vrhu skripta:

od datuma uvoza datetime

uvoz matplotlib.pyplot kot pyplot uvoz RPi. GPIO kot GPIO

Knjižnice RPi. GPIO in datum in čas so bile vključene v mojo distribucijo Raspbian, vendar sem moral knjižnico matplotlib namestiti na naslednji način:

sudo apt-get install python-matplotlib

Ta knjižnica je pogosto uporabljena knjižnica za risanje grafov, ki je zelo uporabna tudi zunaj tega projekta, zato namestitev zagotovo ne škodi! Ko so knjižnice posodobljene, ste pripravljeni na snemanje podatkov. Takole deluje skript:

Ko se zažene (z ukazom 'python ReceiveRF.py'), bo definirani pin GPIO konfiguriral kot vnos podatkov (privzeto pin 23). Nato bo nenehno vzorčil pin in zapisal, ali sprejema digitalni 1 ali 0. To se nadaljuje nastavljeno trajanje (privzeto 5 sekund). Ko bo ta rok dosežen, bo skript ustavil snemanje podatkov in zaprl vhod GPIO. Nato izvede malo naknadne obdelave in nariše prejeto vhodno vrednost glede na čas. Če imate vprašanja o tem, kaj skript počne, lahko nanje verjetno odgovorite sami, potem ko pogledate, kako deluje. Poskušal sem narediti kodo čim bolj berljivo in preprosto.

Kar morate storiti, je, da pazite, ko skript pokaže, da je ** začelo snemanje **. Ko se prikaže to sporočilo, pritisnite in držite enega od gumbov na prenosni enoti približno sekundo. Držite ga blizu sprejemnika. Ko je skript končal snemanje, bo z matplotlibom narisal grafično valovno obliko signala, ki ga je sprejel med snemalnim intervalom. Upoštevajte: če ste s svojim Pi povezani s odjemalcem SSH, kot je PuTTY, boste morali odpreti tudi aplikacijo X11, da omogočite prikaz valovne oblike. Za to uporabljam xMing (in za druge stvari, na primer za oddaljeno namizje v svojem Pi). Če želite omogočiti prikaz zapleta, preprosto zaženite xMing, preden zaženete skript, in počakajte, da se prikažejo rezultati.

Ko se prikaže vaše okno matplotlib, bi moralo biti območje zanimanja na ploskvi precej očitno. Z gumbi na dnu okna lahko povečate, dokler ne izberete vzponov in padcev signala, ki ga prenaša slušalka, medtem ko je bil gumb pritisnjen. Primer celotne kode si oglejte na zgornji sliki. Signal bo verjetno sestavljen iz zelo kratkih impulzov, ločenih s podobnimi časovnimi obdobji, ko signal ni sprejet. Temu bloku kratkih impulzov bo verjetno sledilo daljše obdobje, ko nič ne bo sprejeto, nato pa se bo vzorec ponovil. Ko ugotovite vzorec, ki pripada enemu primerku kode, naredite takšen posnetek zaslona na vrhu te strani in nadaljujte z naslednjim korakom, da ga razlagate.

3. korak: Prepis rezultatskega signala

Prepis rezultatskega signala
Prepis rezultatskega signala

Zdaj, ko ste identificirali blok periodičnih vzponov in padcev, ki ustreza signalu določenega gumba, ga boste morali shraniti in razlagati. V zgornjem primeru signala boste opazili, da obstajata samo dva edinstvena vzorca, ki sestavljata celoten signalni blok. Včasih vidite kratek high, ki mu sledi dolg low, včasih pa je ravno obratno - dolg high, ki mu sledi kratek low. Ko sem prepisoval svoje signale, sem se odločil uporabiti naslednjo konvencijo poimenovanja:

1 = short_on + long_off0 = long_on + short_off

Ponovno poglejte označeno valovno obliko in videli boste, kaj mislim. Ko določite enakovredne vzorce v svojem signalu, morate le sestaviti 1 in 0, da sestavite zaporedje. Pri prepisu lahko zgornji signal zapišemo na naslednji način:

1111111111111010101011101

Zdaj morate samo ponoviti ta postopek za snemanje in prepisovanje signalov, ki ustrezajo drugim gumbom na vaši slušalki, in zaključili ste prvi del postopka!

Preden lahko znova pošljete signale s pomočjo oddajnika, morate opraviti še nekaj dela. Čas med vzponi in padci, ki ustreza 1 ali 0, je zelo pomemben, zato se morate prepričati, kako dolgo traja 'short_on' ali 'long_off'. Za svoje kode sem potreboval tri podatke o časovnem razporedu, da sem lahko posnemal signale:

  • Trajanje "kratkega" intervala, to je začetek 1 ali konec 0.
  • Trajanje "dolgega" intervala, to je konec 1 ali začetek 0.
  • Trajanje „podaljšanega“intervala. Opazil sem, da je med držanjem gumba na prenosni enoti med vsakim ponovljenim primerom signalnega bloka prišlo do "podaljšanega izklopa". Ta zakasnitev se uporablja za sinhronizacijo in ima določeno trajanje.

Če želite določiti te časovne vrednosti, lahko s funkcijo povečave v oknu matplotlib povečate do konca in postavite kazalec na ustrezne dele signala. Odčitavanje lokacije kazalca na dnu okna vam omogoča, da določite, kako širok je vsak del signala, ki ustreza dolgemu, kratkemu ali podaljšanemu intervalu. Upoštevajte, da os x ploskve predstavlja čas, komponenta x odčitka kurzorja pa je v enotah sekund. Zame so bile širine naslednje (v sekundah):

  • kratek_čas = 0,00045
  • long_delay = 0,00090 (dvakrat dlje kot 'short')
  • podaljšan_čas = 0.0096

4. korak: Nastavitev oddajniške enote

Nastavitev oddajniške enote
Nastavitev oddajniške enote

Ko zberete kode in časovne podatke, lahko sprejemnik odklopite, saj ga ne potrebujete več. Oddajnik lahko nato priključite neposredno na ustrezne zatiče Pi GPIO, kot je prikazano na zgornji sliki. Ugotovil sem, da so zatiči na oddajniških enotah označeni, kar olajša postopek.

V tem primeru je v redu, da napajate enoto s 5 -voltnim napajanjem iz Pi, saj pin DATA ne bo pošiljal signalov na Pi, ampak jih le sprejemal. Prav tako bo napajanje 5v zagotovilo večji prenosni obseg kot uporaba napajanja 3v3. Spet lahko priključite pin DATA na kateri koli ustrezen pin na Pi. Uporabil sem pin 23 (enako kot za sprejemnik).

Priporočam še dodajanje antene v majhno luknjo v zgornjem desnem kotu oddajnika. Uporabil sem 17 cm dolg kos ravne žice. Nekateri viri priporočajo navito žico podobne dolžine. Nisem prepričan, kaj je bolje, toda ravna žica mi ponuja dovolj dosega, da vklopim/izklopim vtičnice s katere koli lokacije v svojem majhnem stanovanju. Najbolje je, da anteno spajkate, vendar sem samo odstranil nekaj plastike iz žice in baker zavil skozi luknjo.

Ko je oddajnik priključen, je to vse, kar je strojne opreme nastavljeno! Edino, kar vam preostane, je, da nastavite vtičnice po hiši in si ogledate oddajniški program.

5. korak: Prenos signalov z uporabo Pi

Tu nastopi drugi skript Python. Zasnovan je tako preprosto kot prvi, če ne celo bolj. Še enkrat prosim prenesite in poglejte kodo. Za prenašanje pravilnih signalov boste morali urediti skript glede na podatke, ki ste jih zabeležili v 3. koraku, zato je zdaj pravi čas, da si ga na hitro ogledate.

Vse knjižnice, potrebne za izvajanje tega skripta, so bile vnaprej nameščene na mojem Pi, zato nadaljnja namestitev ni bila potrebna. Navedeni so na vrhu skripta:

čas uvoza

uvoz sys uvoz RPi. GPIO kot GPIO

Pod uvozi knjižnice so podatki, ki jih boste morali urediti. Tako izgleda privzeto (to so podatki, ki ustrezajo mojim vtičnicam, kot je določeno s 3. korakom):

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

Tukaj imamo osem kodnih nizov (dva za vsak par gumbov za vklop/izklop na moji slušalki - morda imate več ali manj kod), ki mu sledijo tri informacije o času, določene tudi v 3. koraku. Vzemite si čas in se prepričajte, da imate pravilno vnesel te podatke.

Ko ste zadovoljni s kodami/zamudami, ki ste jih vnesli v skript (po želji lahko spremenite spremenljivke niza kode), ste pripravljeni preizkusiti sistem! Preden to storite, si oglejte funkcijo transmit_code () v skriptu. Tu pride do dejanske interakcije s oddajnikom. Ta funkcija pričakuje, da bo eden od kodnih nizov poslan kot argument. Nato odpre definirani pin kot izhod GPIO in se prelevi skozi vsak znak v kodnem nizu. Nato oddajnik vklopi ali izklopi glede na podatke o času, ki ste jih vnesli, da ustvarite valovno obliko, ki ustreza kodnemu nizu. Vsako kodo pošlje večkrat (privzeto 10), da zmanjša možnost zamude, med vsakim kodnim blokom pa tako kot slušalko pusti podaljšan zamik.

Za zagon skripta lahko uporabite naslednjo sintakso ukaza:

python TransmitRF.py koda_1 koda_2…

Z enim zagonom skripta lahko prenesete več kodnih nizov. Če želite na primer vklopiti vtičnice (a) in (b) in vtičnico (c), zaženite skript z naslednjim ukazom:

python TransmitRF.py a_on b_on c_off

Korak 6: Opomba glede časovne natančnosti

Kot smo že omenili, je čas med oddanimi impulzi za vklop/izklop zelo pomemben. Skript TransmitRF.py uporablja pythonovo funkcijo time.sleep () za izgradnjo valovnih oblik s pravilnimi impulznimi intervali, vendar je treba opozoriti, da ta funkcija ni povsem natančna. Dolžina, na katero skript počaka pred izvedbo naslednje operacije, je lahko odvisna od obremenitve procesorja v tem trenutku. To je še en razlog, zakaj TransmitRF.py vsako kodo pošlje večkrat - samo v primeru, da funkcija time.sleep () ne more pravilno zgraditi danega primerka kode.

Osebno nikoli nisem imel težav s time.sleep () pri pošiljanju kod. Vem pa, da ima moj time.sleep () napako približno 0,1 ms. To sem določil s priloženim skriptom SleepTest.py, s katerim lahko ocenimo, kako natančna je funkcija Pi's time.sleep (). Za moje posebne daljinsko vodene vtičnice je bila najkrajša zamuda, ki sem jo potreboval za izvedbo, 0,45 ms. Kot sem rekel, nisem imel težav z neodzivnimi vtičnicami, zato se zdi, da je 0,45 ± 0,1 ms dovolj dobro.

Obstajajo še druge metode za zagotovitev natančnejše zamude; na primer, za ustvarjanje kod lahko uporabite namenski čip PIC, vendar takšne stvari presegajo obseg te vadnice.

7. korak: Zaključek

Zaključek
Zaključek

Ta projekt je predstavil metodo za nadzor vseh električnih naprav z uporabo Raspberry Pi in nizom 433MHz daljinsko vodenih vtičnic s poudarkom na preprostosti in preglednosti. To je najbolj razburljiv in prilagodljiv projekt, za katerega sem uporabil svoj Pi, zanj pa obstaja neomejeno število aplikacij. Tukaj je nekaj stvari, ki jih zdaj lahko počnem zahvaljujoč moji Pi:

  • Vklopite električni grelec poleg moje postelje pol ure, preden se oglasi alarm.
  • Izklopite grelec eno uro po tem, ko sem zaspal.
  • Ko se alarm oglasi, prižgim nočno luč, da ne zaspim.
  • in še veliko več…

Za večino teh opravil uporabljam funkcijo crontab v Linuxu. To vam omogoča nastavitev samodejnih načrtovanih opravil za izvajanje skripta TransmitRF.py ob določenem času. Uporabite lahko tudi ukaz Linux at za izvajanje enkratnih opravil (ki so bila zame nameščena ločeno z uporabo 'sudo apt-get install at'). Na primer, da vklopim grelnik pol ure, preden se naslednje jutro oglasi alarm, moram samo vnesti:

ob 05:30

python TransmitRF.py c_on

Ta projekt bi lahko uporabili tudi v povezavi z mojim sistemom za nadzor doma Dropbox za nadzor naprav po internetu! Hvala za branje, če želite kaj pojasniti ali deliti svoje mnenje, napišite komentar!

Priporočena: