Sisällysluettelo:

Erittäin yksinkertainen Raspberry Pi 433 MHz: n kotiautomaatio: 7 vaihetta
Erittäin yksinkertainen Raspberry Pi 433 MHz: n kotiautomaatio: 7 vaihetta

Video: Erittäin yksinkertainen Raspberry Pi 433 MHz: n kotiautomaatio: 7 vaihetta

Video: Erittäin yksinkertainen Raspberry Pi 433 MHz: n kotiautomaatio: 7 vaihetta
Video: Высокая плотность 2022 2024, Marraskuu
Anonim
Erittäin yksinkertainen Raspberry Pi 433 MHz: n kotiautomaatio
Erittäin yksinkertainen Raspberry Pi 433 MHz: n kotiautomaatio

Tämä opetusohjelma on yksi monista, kun on kyse Raspberry Pi: n käyttämisestä kotona olevien langattomien laitteiden ohjaamiseen. Kuten monet muutkin, se näyttää, kuinka voit käyttää halpaa lähetin/vastaanotinparia, joka on kytketty Pi -laitteeseesi vuorovaikutukseen yleisesti käytetyllä 433 MHz: n radiotaajuuskaistalla toimivien laitteiden kanssa. Se näyttää erityisesti, kuinka voit kytkeä minkä tahansa sähkölaitteen päälle tai pois päältä Pi: lläsi lähettämällä komentoja 433 MHz: n kauko-ohjattaville pistorasioille.

Miksi loin tämän opetusohjelman, jos niin monta on jo olemassa? Lähinnä siksi, että melkein kaikki muut tutustumisohjeet tuntuivat liian monimutkaisilta, etenkin ohjelmistopuolella. Huomasin, että he luottivat vahvasti kolmansien osapuolten kirjastoihin, komentosarjoihin tai koodinpätkiin tehdäkseen kaiken työn. Monet eivät edes selitä, mitä taustalla oleva koodi teki - he vain pyysivät sinua työntämään kaksi tai kolme ohjelmistoa Pi -laitteellesi ja suorittamaan joukon komentoja, ilman kysymyksiä. Halusin todella kokeilla ja käyttää Pi-laitettani sähkölaitteiden kytkemiseen päälle ja pois päältä kotini ympärillä käyttämällä 433 MHz: n kauko-ohjattavia pistorasioita, mutta halusin luoda oman versioni järjestelmästä, jonka ymmärsin, toivottavasti poistamalla tarvetta käyttää jonkun toisen kirjastoja tai komentosarjoja.

Siitä tässä opetusohjelmassa on kyse. Tämän järjestelmän ohjelmistopuoli koostuu kahdesta hyvin yksinkertaisesta Python -komentosarjasta - toinen signaalien vastaanottamiseen ja tallentamiseen ja toinen näiden signaalien lähettämiseen takaisin langattomiin pistorasioihin. Signaalin todellinen vastaanotto/lähetys perustuu vain helppokäyttöiseen RPi. GPIO-kirjastoon, joka ainakin minulle oli esiasennettu Raspbianin kanssa. Tämä kirjasto voidaan myös tuoda suoraan Pythoniin.

Tätä projektia varten tarvitset:

Raspberry Pi. Kaikkien mallien pitäisi toimia, käytin all-in-one-aloituspakettia, mutta ehkä tarvitset vain keskusyksikön

433MHz lähetin/vastaanotinpari. Tällaisissa hankkeissa yleisimmin käytetyt näyttävät olevan nämä. Ostamalla viiden pakkauksen, kuten linkitetty, varmistat, että sinulla on muutama varaosa

Joukko 433 MHz: n kauko-ohjattavia pistorasioita. Käytin näitä, joita suosittelen, mutta saatavilla on lukemattomia malleja. Varmista vain, että ne toimivat tällä taajuudella

Jotkut piirin rakentamisen lisävarusteet. Suosittelen leipälevyn ja joidenkin hyppykaapeleiden käyttöä, jotta piirin rakentamisprosessi olisi mahdollisimman helppo.

[Jos päätät ostaa jonkin näistä tuotteista, olisin erittäin kiitollinen, jos pääsisit listauksiin yllä olevien linkkien avulla - näin saan pienen osan voitoista ilman lisäkustannuksia!]

Vaihe 1: Vastaanotinyksikön asentaminen

Vastaanotinyksikön asentaminen
Vastaanotinyksikön asentaminen

Ennen kuin voit käyttää Pi: tä komentojen lähettämiseen kauko-ohjattaviin pistorasioihin, sinun on tiedettävä, mihin erityisiin signaaleihin ne vastaavat. Useimmat kauko-ohjattavat pistorasiat toimitetaan luurin kanssa, jolla voidaan kytkeä tiettyjä laitteita päälle tai pois päältä. Ostamieni tapauksessa luurissa on neljä riviä pareittain kytkettyjä ON/OFF -painikkeita, joista jokainen lähettää ON- tai OFF -signaalin tietylle pistorasialle.

Tämä herättää kysymyksen - mistä tiedämme, mitkä painikkeet vastaavat jotakin kantaa? Tämä riippuu todella siitä, mikä malli sinulla on. Yksi tärkeimmistä syistä, miksi valitsin tietyn pistorasiatyylin (linkitetty johdantoon), on se, että yksiköt voidaan konfiguroida fyysisellä kytkimellä, jotta tietty pistorasia reagoi luurin tiettyihin ON/OFF -painikkeisiin. Tämä tarkoittaa myös sitä, että voit irrottaa pistorasiat ja siirtää niitä ympäri taloa tietäen, että jokainen yksikkö reagoi aina samoihin ON/OFF -signaaleihin.

Kun olet selvittänyt, miten pistorasiat ovat vuorovaikutuksessa luurin kanssa, sinun on käytettävä 433 MHz: n vastaanotinyksikköäsi (kuvassa yllä) luurin lähettämien koodien haistamiseen. Kun olet tallentanut näiden koodien aaltomuodot, voit toistaa ne Pythonilla ja lähettää ne lähetinyksikön avulla.

Ensimmäinen asia tässä on kytkeä vastaanottimen nastat Pi: n oikeisiin GPIO -nastoihin. Vastaanotinyksikössä on neljä nastaa, mutta niitä tarvitaan vain kolme. Luulen, että molemmat keskusnastat antavat saman lähdön, joten sinun tarvitsee vain muodostaa yhteys yhteen niistä (ellet halua lähettää vastaanotettuja signaaleja kahteen erilliseen GPIO -nastaan).

Yllä oleva kuva tiivistää johdotuksen. Jokainen vastaanottimen nasta voidaan kytkeä suoraan Pi: n vastaavaan nastaan. Käytän leipälautaa ja hyppyjohtoja, jotta prosessista tulee hieman tyylikkäämpi. Huomaa, että voit valita minkä tahansa GPIO -datanastan liitettäväksi kumpaan tahansa keskusvastaanottimen nastaan. Käytin Pi -otsikossani merkintää '23'.

TÄRKEÄÄ: Jos liität yllä olevassa kuvassa '3v3' merkityn nastan Pi: n korkeamman jännitteen nastaan (esim. 5v), vahingoitat todennäköisesti Pi: tä, koska GPIO -nastat eivät siedä yli 3v3 jännitettä. Vaihtoehtoisesti voit kytkeä siihen virran 5 voltilla ja asettaa jännitteenjakajan lähettämään turvallisen jännitteen DATA -nastaan.

Vastaanottimen kantama ei ole kovin suuri tällä jännitteellä, varsinkin jos antennia ei ole kytketty. Tässä ei kuitenkaan tarvita pitkää kantamaa - niin kauan kuin vastaanotin voi noutaa luurin signaalit, kun niitä pidetään vierekkäin, se on kaikki mitä tarvitsemme.

Vaihe 2: Luurin koodien haistelu

Luurin koodien haistelu
Luurin koodien haistelu

Nyt kun vastaanotin on kytketty Pi -laitteeseen, voit aloittaa tämän projektin ensimmäisen jännittävän vaiheen - haistaa. Tämä edellyttää liitetyn Python -komentosarjan käyttämistä luurin lähettämän signaalin tallentamiseen, kun kutakin painiketta painetaan. Käsikirjoitus on hyvin yksinkertainen, ja suosittelen, että tutustut siihen ennen sen suorittamista - loppujen lopuksi tämän projektin tarkoitus on, ettet suorita vain sokeasti toisen koodia!

Ennen kuin aloitat tämän prosessin, sinun on varmistettava, että sinulla on sniffer -komentosarjan suorittamiseen tarvittavat Python -kirjastot. Ne on lueteltu käsikirjoituksen yläosassa:

datetime tuonti datetime

Tuo matplotlib.pyplot pyplotiksi tuoda RPi. GPIO GPIO: ksi

RPi. GPIO- ja päivämääräkirjastot sisältyivät Raspbian -jakeluun, mutta minun täytyi asentaa matplotlib -kirjasto seuraavasti:

sudo apt-get install python-matplotlib

Tämä kirjasto on yleisesti käytetty kuvaajakirjasto, joka on erittäin hyödyllinen myös tämän projektin ulkopuolella, joten sen asentaminen ei todellakaan voi satuttaa! Kun kirjastot ovat ajan tasalla, olet valmis aloittamaan tietojen tallentamisen. Skripti toimii seuraavasti:

Kun se suoritetaan (käyttämällä komentoa 'python ReceiveRF.py'), se määrittää määritetyn GPIO -nastan datatuloksi (nasta 23 oletuksena). Sitten se ottaa jatkuvasti näytteenottoa ja kirjaa, vastaanotetaanko digitaalinen 1 vai 0. Tämä jatkuu tietyn ajan (oletusarvoisesti 5 sekuntia). Kun tämä aikaraja saavutetaan, komentosarja lopettaa tietojen tallennuksen ja sulkee GPIO -tulon. Sitten se suorittaa pienen jälkikäsittelyn ja piirtää vastaanotetun syöttöarvon ajan suhteen. Jälleen kerran, jos sinulla on kysyttävää siitä, mitä käsikirjoitus tekee, voit todennäköisesti vastata niihin itse, kun olet tarkastellut sen toimintaa. Olen yrittänyt tehdä koodista mahdollisimman luettavan ja yksinkertaisen.

Sinun tarvitsee vain varoa, kun komentosarja osoittaa ** Aloittanut tallennuksen **. Kun tämä viesti tulee näkyviin, paina ja pidä luurin painiketta painettuna noin sekunnin ajan. Pidä sitä lähellä vastaanotinta. Kun komentosarja on lopettanut tallennuksen, se piirtää matplotlibin avulla graafisen aaltomuodon tallennusvälin aikana vastaanotetusta signaalista. Huomaa, että jos olet yhteydessä Pi -laitteeseesi käyttämällä SSH -asiakasta, kuten PuTTY: tä, sinun on myös avattava X11 -sovellus, jotta aaltomuoto voidaan näyttää. Käytän xMingia tähän (ja muihin asioihin, kuten etätyöpöytäkäyttöön Pi: hen). Jotta kuvaaja voidaan näyttää, käynnistä xMing ennen komentosarjan suorittamista ja odota tulosten ilmestymistä.

Kun matplotlib -ikkunasi tulee näkyviin, tontin kiinnostavan alueen pitäisi olla melko ilmeinen. Voit lähentää ikkunan alaosassa olevilla säätimillä, kunnes pystyt valitsemaan luurin lähettämän signaalin huipput ja matalat, kun painiketta pidetään painettuna. Katso yllä olevasta kuvasta esimerkki täydellisestä koodista. Signaali koostuu todennäköisesti hyvin lyhyistä pulsseista, jotka on erotettu toisistaan vastaavilla ajanjaksoilla, kun signaalia ei vastaanoteta. Tätä lyhyiden pulssien lohkoa seuraa todennäköisesti pidempi jakso, jolloin mitään ei vastaanoteta, minkä jälkeen kuvio toistuu. Kun olet tunnistanut kuvion, joka kuuluu koodin yksittäiseen esiintymään, ota kuvakaappaus tämän sivun yläreunasta ja jatka seuraavaan vaiheeseen tulkitaksesi sen.

Vaihe 3: Tulosignaalin transkriptio

Tulosmerkin transkriptio
Tulosmerkin transkriptio

Nyt kun olet tunnistanut tietyn painikkeen signaalia vastaavan jaksollisen ylä- ja alamäen lohkon, tarvitset tavan tallentaa ja tulkita se. Yllä olevassa signaaliesimerkissä huomaat, että on vain kaksi ainutlaatuista kuviota, jotka muodostavat koko signaalilohkon. Joskus näet lyhyen korkeuden, jota seuraa pitkä alin, ja joskus se on päinvastoin - pitkä korkeus, jota seuraa lyhyt alin. Kun kirjoitin signaaleja, päätin käyttää seuraavaa nimeämiskäytäntöä:

1 = lyhyt_on + pitkä_ pois0 = pitkä_on + lyhyt pois

Katso uudelleen merkittyä aaltomuotoa, niin näet mitä tarkoitan. Kun olet tunnistanut vastaavat kuviot signaalissasi, sinun tarvitsee vain laskea 1: t ja 0: t rakentaaksesi sekvenssin. Transkriptoituna yllä oleva signaali voidaan kirjoittaa seuraavasti:

1111111111111010101011101

Nyt sinun tarvitsee vain toistaa tämä prosessi tallentaaksesi ja transkriptoidaksesi luurin muita painikkeita vastaavat signaalit, ja olet suorittanut prosessin ensimmäisen osan!

Ennen kuin voit lähettää signaaleja uudelleen lähettimen avulla, on vielä vähän tehtävää. Aika, joka vastaa ylä- ja alamäkiä, jotka vastaavat arvoa 1 tai 0, on erittäin tärkeä, ja sinun on varmistettava, että tiedät kuinka kauan lyhyt_on tai pitkä_poisto todella kestää. Koodeissani oli kolme ajoitustietoa, jotka minun piti poimia signaalien toistamiseksi:

  • 'Lyhyen' välin kesto eli 1: n alku tai 0: n loppu.
  • Pitkän aikavälin kesto eli 1: n loppu tai 0: n alku.
  • Pidennetyn väliajan kesto. Huomasin, että kun pidin luurin painiketta painettuna, signaalilohkon jokaisen toistetun esiintymän välillä oli "pidennetty pois" -jakso. Tätä viivettä käytetään synkronointiin ja sillä on kiinteä kesto.

Voit määrittää nämä ajoitusarvot käyttämällä zoomaustoimintoa matplotlib -ikkunan zoomaukseen kokonaan ja asettamalla kohdistimen signaalin osien päälle. Kohdistimen sijainnin lukeminen ikkunan alaosassa antaa sinun määrittää, kuinka leveä jokainen signaalin osa on pitkä, lyhyt tai pidennetty. Huomaa, että käyrän x-akseli edustaa aikaa ja kohdistimen lukeman x-komponentti on sekunteina. Minulle leveydet olivat seuraavat (sekunneissa):

  • lyhyt viive = 0,00045
  • pitkä_viive = 0,00090 (kaksi kertaa pidempi kuin lyhyt)
  • pidennetty viive = 0,0096

Vaihe 4: Lähetinyksikön asentaminen

Lähetinyksikön asentaminen
Lähetinyksikön asentaminen

Kun olet kerännyt koodit ja ajoitustiedot, voit irrottaa vastaanotinyksikön, koska et enää tarvitse sitä. Voit sitten kytkeä lähettimen suoraan asianomaisiin Pi GPIO -nastoihin yllä olevan kuvan mukaisesti. Olen huomannut, että lähettimen nastat on merkitty, mikä helpottaa prosessia.

Tässä tapauksessa on OK kytkeä yksikköön virta 5 V: n virtalähteellä Pi: stä, koska DATA -nasta ei lähetä signaaleja Pi: lle, vain vastaanottaa ne. Lisäksi 5 voltin virtalähde tarjoaa enemmän lähetysaluetta kuin 3v3 -virtalähteen käyttö. Jälleen voit liittää DATA -nastan mihin tahansa Pi: n sopivaan nastaan. Käytin nasta 23 (sama kuin vastaanottimessa).

Toinen asia, jonka suosittelen, on lisätä antenni pieneen reikään lähettimen oikeassa yläkulmassa. Käytin 17 cm pitkää suoraa lankaa. Jotkut lähteet suosittelevat saman pituista kierrelankaa. En ole varma kumpi on parempi, mutta suora johto tarjoaa riittävän kantaman, jotta voin kytkeä pistorasiat päälle/pois mistä tahansa pienen asuntoni paikasta. On parasta juottaa antenni, mutta poistin juuri osan muovista langasta ja käärin kuparin reiän läpi.

Kun lähetin on kytketty, kaikki laitteiston asetukset on tehty! Ainoa asia, joka on nyt tehtävä, on asettaa pistorasiat ympäri taloa ja katsoa lähettimen ohjelmaa.

Vaihe 5: Signaalien lähettäminen Pi: n avulla

Tässä tulee toinen Python -komentosarja. Se on suunniteltu olemaan yhtä yksinkertainen kuin ensimmäinen, jos ei enemmän. Lataa se uudelleen ja katso koodi. Sinun on muokattava komentosarjaa välittääksesi oikeat signaalit vaiheessa 3 tallentamiesi tietojen mukaan, joten nyt on hyvä hetki vilkaista sitä.

Tämän komentosarjan suorittamiseen tarvittavat kirjastot olivat kaikki esiasennettu Pi-laitteeseeni, joten lisäasennusta ei tarvittu. Ne on lueteltu käsikirjoituksen yläosassa:

tuonnin aika

tuonti sys tuonti RPi. GPIO GPIO: na

Kirjaston tuonnin alla on tiedot, joita sinun on muokattava. Tältä se näyttää oletuksena (nämä tiedot vastaavat pistorasiani, jotka on määritetty vaiheessa 3):

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

Tässä meillä on kahdeksan koodijonoa (kaksi jokaiselle luurini päälle/pois -painikeparille - sinulla voi olla enemmän tai vähemmän koodeja), jota seuraa kolme ajoitustietoa, jotka määritetään myös vaiheessa 3. Käytä aikaa varmistaaksesi, että sinulla on syöttänyt nämä tiedot oikein.

Kun olet tyytyväinen koodiin/viiveisiin, jotka olet kirjoittanut komentosarjaan (voit nimetä koodijonomuuttujat uudelleen, jos haluat), olet melko valmis kokeilemaan järjestelmää! Ennen kuin teet, tutustu komentosarjan lähetyskoodi () -toimintoon. Tässä tapahtuu todellinen vuorovaikutus lähettimen kanssa. Tämä toiminto odottaa, että yksi koodimerkkijono lähetetään argumenttina. Sitten se avaa määritetyn nastan GPIO -lähdönä ja kiertää koodimerkkijonon jokaisen merkin läpi. Sen jälkeen se kytkee lähettimen päälle tai pois päältä syöttämiesi ajoitustietojen mukaan muodostaaksesi koodimerkkijonoa vastaavan aaltomuodon. Se lähettää jokaisen koodin useita kertoja (oletuksena 10) vähentääkseen sen menettämisen mahdollisuutta ja jättää jokaisen koodilohkon väliin pidennetyn viiveen, aivan kuten luurin.

Voit suorittaa komentosarjan käyttämällä seuraavaa komentosyntaksia:

python TransmitRF.py code_1 code_2…

Voit lähettää useita koodijonoja yhdellä komentosarjan suorituksella. Jos esimerkiksi haluat kytkeä pistorasiat (a) ja (b) päälle ja pistorasia (c) pois päältä, suorita komentosarja seuraavalla komennolla:

python TransmitRF.py a_on b_on c_off

Vaihe 6: Huomautus ajoitustarkkuudesta

Kuten mainittiin, lähetettyjen päälle/pois -pulssien välinen ajoitus on varsin tärkeä. TransmitRF.py -skripti käyttää pythonin time.sleep () -funktiota aaltomuotojen muodostamiseen oikeilla pulssiväleillä, mutta on huomattava, että tämä toiminto ei ole täysin tarkka. Se, kuinka kauan se saa komentosarjan odottamaan ennen seuraavan toiminnon suorittamista, voi riippua suorittimen kuormituksesta kyseisellä hetkellä. Tämä on toinen syy, miksi TransmitRF.py lähettää jokaisen koodin useita kertoja - siltä varalta, että time.sleep () -toiminto ei pysty muodostamaan koodin tiettyä esiintymää oikein.

Minulla ei henkilökohtaisesti ole koskaan ollut ongelmia time.sleep (): n kanssa koodien lähettämisen suhteen. Tiedän kuitenkin, että time.sleep (): n virhe on yleensä noin 0,1 ms. Määritin tämän käyttämällä liitteenä olevaa SleepTest.py -skriptiä, jota voidaan käyttää arvioimaan Pi: n time.sleep () -funktion tarkkuus. Erityisesti kauko-ohjattavilla pistorasioillani lyhyin viive, jonka tarvitsin toteuttaa, oli 0,45 ms. Kuten sanoin, minulla ei ole ollut ongelmia ei-reagoivissa pistorasioissa, joten näyttää siltä, että 0,45 ± 0,1 ms on tarpeeksi hyvä.

On myös muita tapoja varmistaa viiveen tarkkuus; voit esimerkiksi käyttää omaa PIC -sirua koodien luomiseen, mutta sellaiset asiat eivät kuulu tämän opetusohjelman piiriin.

Vaihe 7: Johtopäätös

Johtopäätös
Johtopäätös

Tässä projektissa on esitetty menetelmä sähkölaitteiden ohjaamiseksi Raspberry Pi -laitteella ja 433 MHz: n kauko-ohjattavilla pistorasioilla, keskittyen yksinkertaisuuteen ja läpinäkyvyyteen. Tämä on jännittävin ja joustavin projekti, johon olen käyttänyt Pi: tä, ja siihen on rajattomasti sovelluksia. Tässä on joitain asioita, joita voin nyt tehdä Pi: n ansiosta:

  • Kytke sähkölämmitin päälle sängyn vieressä puoli tuntia ennen herätyksen soimista.
  • Sammuta lämmitin tunnin kuluttua nukahtamisesta.
  • Sytytä sängyn valo, kun herätys soi, jotta en nukahda takaisin.
  • ja paljon muuta…

Useimmissa näistä tehtävistä käytän crontab -toimintoa Linuxissa. Tämän avulla voit määrittää automaattiset ajoitetut tehtävät suorittamaan TransmitRF.py -komentosarjan tiettyinä aikoina. Voit käyttää Linux-komentoa myös kertaluonteisten tehtävien suorittamiseen (jotka minun piti asentaa erikseen käyttämällä "sudo apt-get install at"). Esimerkiksi kytkeäkseni lämmittimen päälle puoli tuntia ennen herätyksen soimista seuraavana aamuna, minun tarvitsee vain kirjoittaa:

klo 05:30

python TransmitRF.py c_on

Voit myös käyttää tätä projektia yhdessä Dropbox -kodin seurantajärjestelmäni kanssa laitteiden ohjaamiseen Internetissä! Kiitos, että luit, ja jos haluat selventää jotain tai jakaa mielipiteesi, lähetä kommentti!

Suositeltava: