Obsah:

Super jednoduchá domáca automatizácia Raspberry Pi 433 MHz: 7 krokov
Super jednoduchá domáca automatizácia Raspberry Pi 433 MHz: 7 krokov

Video: Super jednoduchá domáca automatizácia Raspberry Pi 433 MHz: 7 krokov

Video: Super jednoduchá domáca automatizácia Raspberry Pi 433 MHz: 7 krokov
Video: Высокая плотность 2022 2024, November
Anonim
Super jednoduchá domáca automatizácia Raspberry Pi 433 MHz
Super jednoduchá domáca automatizácia Raspberry Pi 433 MHz

Tento návod je jedným z mnohých, pokiaľ ide o používanie Raspberry Pi na ovládanie bezdrôtových zariadení v domácnosti. Rovnako ako mnoho ďalších vám ukáže, ako používať lacný pár vysielača/prijímača pripojený k vášmu Pi na interakciu so zariadeniami, ktoré pracujú v bežne používanom rádiovom frekvenčnom pásme 433 MHz. Konkrétne vám ukáže, ako zapnúť alebo vypnúť akékoľvek elektrické zariadenie pomocou vášho Pi prenosom príkazov do sady diaľkovo ovládaných zásuviek 433 MHz.

Prečo som vytvoril tento návod, ak ich už existuje toľko? Hlavne preto, že sa zdalo, že skoro všetky ostatné návody, na ktoré som prišiel, veci príliš komplikujú, najmä po softvérovej stránke. Všimol som si, že pri všetkej práci sa veľmi spoliehajú na knižnice, skripty alebo úryvky kódu tretích strán. Mnohí by ani nevysvetlili, čo robí príslušný kód - jednoducho by vás požiadali, aby ste na svoj Pi vložili dva alebo tri kusy softvéru a vykonali množstvo príkazov, bez otázok. Naozaj som sa chcel pokúsiť použiť svoje Pi na zapínanie a vypínanie elektrických zariadení v okolí môjho domu pomocou sady 433 MHz diaľkovo ovládaných zásuviek, ale chcel som vytvoriť vlastnú verziu systému, ktorému by som rozumel, dúfajme, že eliminujem potrebu používať knižnice alebo skripty niekoho iného.

O tom je tento návod. Softwarová stránka tohto systému pozostáva z dvoch veľmi jednoduchých skriptov Python - jedného na príjem a záznam signálov a druhého na prenos týchto signálov späť do bezdrôtových zásuviek. Skutočný príjem/prenos signálu závisí iba od ľahko použiteľnej knižnice RPi. GPIO, ktorá bola, aspoň pre mňa, predinštalovaná s programom Raspbian. Túto knižnicu je možné importovať aj priamo do Pythonu.

Na tento projekt budete potrebovať:

Malinový Pi. Každý model by mal fungovať, použil som štartovaciu sadu všetko v jednom, ale možno budete potrebovať iba centrálnu jednotku

Pár vysielača/prijímača 433 MHz. Zdá sa, že najčastejšie používané v tomto type projektu sú tieto. Kúpa balenia piatich kusov, ako je ten, ktorý je prepojený, zaistí, že budete mať niekoľko náhradných dielov

Sada diaľkovo ovládaných zásuviek 433 MHz. Použil som tieto, ktoré by som veľmi odporučil, ale k dispozícii je nespočetné množstvo modelov. Len sa uistite, že fungujú na tejto frekvencii

Niektoré doplnky pre stavbu obvodov. Odporúčam vám použiť prepojovaciu dosku a niekoľko prepojovacích káblov, aby bol proces budovania obvodu čo najľahší.

[Ak sa rozhodnete kúpiť niektorý z týchto produktov, veľmi by som ocenil, keby ste sa k záznamom dostali pomocou vyššie uvedených odkazov - takto získam malý podiel na zisku bez ďalších nákladov!]

Krok 1: Nastavenie prijímacej jednotky

Inštalácia prijímacej jednotky
Inštalácia prijímacej jednotky

Predtým, ako budete môcť používať svoj Pi na odosielanie príkazov do diaľkovo ovládaných zásuviek, musíte vedieť, na aké konkrétne signály reagujú. Väčšina diaľkovo ovládaných zásuviek sa dodáva so slúchadlom, ktoré je možné použiť na zapnutie alebo vypnutie konkrétnych jednotiek. V prípade tých, ktoré som kúpil, má telefón štyri rady spárovaných tlačidiel ON/OFF, z ktorých každé vysiela signál ON alebo OFF do konkrétnej zásuvkovej jednotky.

Naskytá sa otázka - ako zistíme, ktoré tlačidlá zodpovedajú ktorej zásuvke? To skutočne závisí od modelu, ktorý máte. Jeden z hlavných dôvodov, prečo som si vybral svoj konkrétny štýl zásuvky (spojený v úvode), je ten, že jednotky je možné nakonfigurovať pomocou fyzického prepínača, aby konkrétna zásuvka reagovala na konkrétnu sadu tlačidiel ON/OFF na slúchadle. To tiež znamená, že zásuvky môžete odpojiť a premiestňovať po dome s vedomím, že každá jednotka bude vždy reagovať na rovnaké signály ZAP/VYP.

Akonáhle zistíte, ako vaše zásuvky interagujú so slúchadlom, budete musieť použiť svoju prijímaciu jednotku 433 MHz (na obrázku vyššie) na „oňuchanie“kódov odosielaných telefónom. Akonáhle ste zaznamenali priebeh týchto kódov, môžete ich replikovať pomocou Pythonu a odoslať ich pomocou vysielacej jednotky.

Prvá vec, ktorú musíte urobiť, je prepojiť kolíky na vašom prijímači so správnymi pinmi GPIO na Pi. Prijímacia jednotka má štyri piny, ale sú potrebné iba tri z nich. Myslím, že oba centrálne piny majú rovnaký výstup, takže sa stačí pripojiť iba k jednému z nich (pokiaľ nechcete streamovať prijaté signály na dva samostatné piny GPIO).

Obrázok vyššie do značnej miery sumarizuje zapojenie. Každý pin na prijímači môže byť prepojený priamo s príslušným pinom na Pi. Aby bol postup o niečo elegantnejší, používam nepájivú dosku a prepojovacie káble. Všimnite si toho, že si môžete vybrať ľubovoľný dátový pin GPIO na pripojenie k jednému z pinov centrálneho prijímača. Na svojej hlavičke Pi som použil kolík označený ako „23“.

DÔLEŽITÉ: Ak pripojíte pin označený na vyššie uvedenom obrázku ako „3v3“k pinu vyššieho napätia na Pi (napr. 5v), pravdepodobne poškodíte Pi, pretože kolíky GPIO nemôžu tolerovať napätie vyššie ako 3v3. Alternatívne ho môžete napájať 5 V a nastaviť delič napätia na odoslanie bezpečného napätia na pin DATA.

Dosah prijímača pri tomto napätí nebude príliš veľký, najmä ak nie je pripojená anténa. Tu však nepotrebujete dlhý dosah - pokiaľ prijímač dokáže zachytiť signály zo slúchadla, keď sú držané tesne vedľa seba, to je všetko, čo potrebujeme.

Krok 2: Čuchanie kódov prenosnej časti

Čuchanie kódov slúchadla
Čuchanie kódov slúchadla

Teraz, keď je váš prijímač pripojený k Pi, môžete začať prvú vzrušujúcu fázu tohto projektu - čuchanie. To zahŕňa použitie priloženého skriptu Python na zaznamenanie signálu prenášaného prenosnou časťou po stlačení každého tlačidla. Skript je veľmi jednoduchý a dôrazne vám odporúčam, aby ste si ho pred spustením pozreli - koniec koncov, ide o to, že nebudete len slepo spúšťať kód niekoho iného!

Pred spustením tohto procesu sa budete musieť uistiť, že máte knižnice Pythonu potrebné na spustenie skriptu sniffer. Sú uvedené v hornej časti skriptu:

z datetime import datetime

import matplotlib.pyplot ako pyplot import RPi. GPIO ako GPIO

Knižnice RPi. GPIO a datetime boli súčasťou mojej distribúcie Raspbian, ale knižnicu matplotlib som musel nainštalovať nasledovne:

sudo apt-get install python-matplotlib

Táto knižnica je bežne používanou knižnicou na vykresľovanie grafov, ktorá je veľmi užitočná aj mimo tohto projektu, takže jej inštalácia rozhodne nemôže uškodiť! Akonáhle sú vaše knižnice aktualizované, ste pripravení začať zaznamenávať údaje. Skript funguje takto:

Keď je spustený (pomocou príkazu 'python ReceiveRF.py'), nakonfiguruje definovaný pin GPIO ako vstup údajov (štandardne je pin 23). Potom bude nepretržite vzorkovať pin a zaznamenávať, či prijíma digitálne číslo 1 alebo 0. Toto pokračuje po stanovenú dobu (štandardne 5 sekúnd). Po dosiahnutí tohto časového limitu skript zastaví zaznamenávanie údajov a zatvorí vstup GPIO. Potom vykoná malé následné spracovanie a vykreslí prijatú vstupnú hodnotu proti času. Opäť platí, že ak máte otázky o tom, čo scenár robí, pravdepodobne si na ne odpoviete sami po tom, ako sa pozriete na to, ako funguje. Snažil som sa, aby bol kód čo najčitateľnejší a najjednoduchší.

Čo musíte urobiť, je dávať si pozor, keď skript naznačuje, že ** začalo nahrávanie **. Hneď ako sa zobrazí táto správa, mali by ste asi na sekundu stlačiť a podržať jedno z tlačidiel na slúchadle. Uistite sa, že ho držíte blízko prijímača. Akonáhle skript dokončí nahrávanie, použije matplotlib na vykreslenie grafického priebehu signálu, ktorý dostal počas intervalu záznamu. Upozorňujeme, že ak ste k svojmu Pi pripojení pomocou klienta SSH, ako je napríklad PuTTY, budete tiež musieť otvoriť aplikáciu X11, aby sa priebeh vlny mohol zobrazovať. Na to používam xMing (a na iné veci, ako je vzdialená plocha môjho Pi). Ak chcete povoliť zobrazenie grafu, jednoducho spustite xMing pred spustením skriptu a počkajte, kým sa nezobrazia výsledky.

Akonáhle sa zobrazí vaše okno matplotlib, oblasť záujmu na pozemku by mala byť celkom zrejmá. Na priblíženie môžete použiť ovládacie prvky v spodnej časti okna, kým nebudete schopní rozoznať výšky a pády signálu prenášaného prenosným telefónom, zatiaľ čo bolo tlačidlo stlačené. Príklad kompletného kódu nájdete na vyššie uvedenom obrázku. Signál bude pravdepodobne pozostávať z veľmi krátkych impulzov oddelených podobnými časovými obdobiami, v ktorých nie je prijímaný žiadny signál. Tento blok krátkych impulzov bude pravdepodobne nasledovať dlhším obdobím, kedy sa nič neprijíma, a potom sa vzor opakuje. Akonáhle identifikujete vzor patriaci k jednej inštancii kódu, urobte takú snímku obrazovky v hornej časti tejto stránky a pokračujte ďalším krokom k jej interpretácii.

Krok 3: Prepis výsledného signálu

Prepis výsledného signálu
Prepis výsledného signálu

Teraz, keď ste identifikovali blok periodických výšok a minim zodpovedajúci signálu konkrétneho tlačidla, budete potrebovať spôsob jeho uloženia a interpretácie. V uvedenom príklade signálu si všimnete, že existujú iba dva jedinečné vzory, ktoré tvoria celý signálny blok. Niekedy vidíte krátke maximum, po ktorom nasleduje dlhé minimum, a niekedy je to naopak - dlhé maximum, po ktorom nasleduje krátke minimum. Keď som prepisoval svoje signály, rozhodol som sa použiť nasledujúcu konvenciu pomenovania:

1 = short_on + long_off0 = long_on + short_off

Znova sa pozrite na označený priebeh a uvidíte, čo tým myslím. Akonáhle ste vo svojom signáli identifikovali ekvivalentné vzorce, stačí, ak spočítate 1 a 0, aby ste vytvorili sekvenciu. Pri prepisovaní môže byť vyššie uvedený signál zapísaný nasledovne:

1111111111111010101011101

Teraz stačí tento postup zopakovať, aby ste zaznamenali a prepisovali signály zodpovedajúce iným tlačidlám na vašom slúchadle, a dokončili ste prvú časť procesu!

Predtým, ako budete môcť znova odoslať signály pomocou vysielača, musíte vykonať ešte trochu práce. Načasovanie medzi maximami a minimami zodpovedajúcimi 1 alebo 0 je veľmi dôležité a musíte sa uistiť, že viete, ako dlho trvá „short_on“alebo „long_off“. Pre moje kódy boli potrebné tri informácie o časovaní, ktoré som potreboval extrahovať, aby som mohol replikovať signály:

  • Trvanie „krátkeho“intervalu, tj. Začiatok 1 alebo koniec 0.
  • Trvanie „dlhého“intervalu, tj. Koniec 1 alebo začiatok 0.
  • Trvanie „predĺženého“intervalu. Všimol som si, že keď som podržal tlačidlo na slúchadle, medzi každým opakovaným výskytom signálového bloku bola prestávka „extended_off“. Toto oneskorenie sa používa na synchronizáciu a má pevné trvanie.

Na určenie týchto hodnôt časovania môžete použiť funkciu priblíženia v okne matplotlib na úplné priblíženie a umiestnenie kurzora na príslušné časti signálu. Odčítanie polohy kurzora v spodnej časti okna by vám malo umožniť určiť, ako široká je každá časť signálu, ktorá zodpovedá dlhému, krátkemu alebo predĺženému intervalu. Všimnite si toho, že os x grafu predstavuje čas a zložka x ukazovateľa kurzora je v jednotkách sekúnd. Šírky boli pre mňa nasledujúce (v sekundách):

  • short_delay = 0,00045
  • long_delay = 0,00090 (dvakrát tak dlho ako 'short')
  • extended_delay = 0,0096

Krok 4: Nastavenie jednotky vysielača

Inštalácia jednotky vysielača
Inštalácia jednotky vysielača

Akonáhle získate svoje kódy a údaje o časovaní, môžete svoju prijímaciu jednotku odpojiť, pretože ju už nebudete potrebovať. Potom môžete vysielač zapojiť priamo na príslušné piny Pi GPIO, ako je znázornené na obrázku vyššie. Zistil som, že kolíky na jednotkách vysielača sú označené, čo uľahčuje postup.

V tomto prípade je v poriadku napájať jednotku pomocou napájania 5 V z Pi, pretože pin DATA nebude do Pi odosielať signály, iba ich prijímať. Napájanie 5v tiež poskytne väčší prenosový rozsah ako použitie napájania 3v3. Opäť môžete pin DATA pripojiť k akémukoľvek vhodnému kolíku na Pi. Použil som pin 23 (rovnaký ako pre prijímač).

Ďalšia vec, ktorú by som odporučil urobiť, je pridať anténu do malého otvoru v pravom hornom rohu vysielača. Použil som 17 cm dlhý kus rovného drôtu. Niektoré zdroje odporúčajú stočený drôt podobnej dĺžky. Nie som si istý, čo je lepšie, ale rovný drôt mi poskytuje dostatočný dosah na zapnutie/vypnutie zásuviek z akéhokoľvek miesta v mojom malom byte. Najlepšie je spájkovať anténu, ale ja som len odstránil časť plastu z drôtu a prevliekol meď cez otvor.

Akonáhle je vysielač zapojený, je hotové nastavenie hardvéru! Jediné, čo teraz musíte urobiť, je nastaviť zásuvky okolo domu a pozrieť sa na program vysielača.

Krok 5: Prenos signálov pomocou Pi

Tu prichádza na rad druhý skript Pythonu. Je navrhnutý tak, aby bol rovnako jednoduchý ako prvý, ak nie ešte viac. Znova si ho stiahnite a pozrite sa na kód. Skript budete musieť upraviť tak, aby prenášal správne signály podľa údajov, ktoré ste zaznamenali v kroku 3, takže teraz je ten správny čas sa naň rýchlo pozrieť.

Knižnice potrebné na spustenie tohto skriptu boli všetky vopred nainštalované na mojom Pi, takže nebola potrebná žiadna ďalšia inštalácia. Sú uvedené v hornej časti skriptu:

čas importu

import sys import RPi. GPIO ako GPIO

Pod importom knižnice sú informácie, ktoré budete musieť upraviť. Takto to vyzerá v predvolenom nastavení (toto sú informácie zodpovedajúce mojim zásuvkám určeným pomocou kroku 3):

a_on = '111111111111101010101011101'

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

Tu máme osem kódových reťazcov (dva pre každý pár tlačidiel zapnutia/vypnutia na mojom telefóne - môžete mať viac alebo menej kódov), za ktorými nasledujú tri informácie o časovaní, ktoré sú určené aj v kroku 3. Nájdite si čas a uistite sa, že máte zadal tieto informácie správne.

Keď ste spokojní s kódmi/oneskoreniami, ktoré ste zadali do skriptu (premenné reťazca kódov môžete premenovať, ak chcete), ste skoro pripravení systém vyskúšať! Než to urobíte, pozrite sa na funkciu transmit_code () v skripte. Tu dochádza k skutočnej interakcii s vysielačom. Táto funkcia očakáva, že jeden z reťazcov kódu bude odoslaný ako argument. Potom otvorí definovaný pin ako výstup GPIO a prelína každým znakom v reťazci kódu. Potom zapne alebo vypne vysielač podľa informácií o časovaní, ktoré ste zadali, aby ste vytvorili priebeh vlny zodpovedajúci reťazcu kódu. Každý kód odosiela viackrát (v predvolenom nastavení 10), aby sa znížila pravdepodobnosť jeho zmeškania, a medzi každým blokom kódu sa ponechá extended_delay, rovnako ako slúchadlo.

Na spustenie skriptu môžete použiť nasledujúcu syntax príkazu:

python TransmitRF.py code_1 code_2…

Jedným spustením skriptu môžete prenášať viac reťazcov kódu. Ak napríklad chcete zapnúť sokety (a) a (b) a sokety (c) vypnúť, spustite skript pomocou nasledujúceho príkazu:

python TransmitRF.py a_on b_on c_off

Krok 6: Poznámka k presnosti načasovania

Ako už bolo spomenuté, načasovanie medzi prenášanými impulzmi zapnutia/vypnutia je dosť dôležité. Skript TransmitRF.py používa funkciu python's time.sleep () na vytváranie priebehov so správnymi intervalmi impulzov, treba však poznamenať, že táto funkcia nie je úplne presná. Dĺžka, počas ktorej skript čaká na vykonanie ďalšej operácie, môže závisieť od zaťaženia procesora v danom okamihu. To je ďalší dôvod, prečo TransmitRF.py odosiela každý kód viackrát - len v prípade, že funkcia time.sleep () nie je schopná správne zostaviť danú inštanciu kódu.

Osobne som nikdy nemal problémy s time.sleep (), pokiaľ ide o odosielanie kódov. Viem však, že môj time.sleep () má tendenciu mať chybu asi 0,1 ms. Určil som to pomocou priloženého skriptu SleepTest.py, ktorý je možné použiť na odhad, ako presná je funkcia time.sleep () vášho Pi. Pre moje konkrétne diaľkovo ovládané zásuvky bolo najkratšie oneskorenie, ktoré som potreboval implementovať, 0,45 ms. Ako som povedal, nemal som problémy s nereagujúcimi zásuvkami, takže sa zdá, že 0,45 ± 0,1 ms je dosť dobré.

Existujú aj iné metódy na zabezpečenie presnosti oneskorenia; napríklad na generovanie kódov môžete použiť vyhradený čip PIC, ale podobné veci presahujú rámec tohto tutoriálu.

Krok 7: Záver

Záver
Záver

Tento projekt predstavil spôsob ovládania akéhokoľvek elektrického zariadenia pomocou Raspberry Pi a sady 433 MHz diaľkovo ovládaných zásuviek so zameraním na jednoduchosť a transparentnosť. Toto je najzaujímavejší a najflexibilnejší projekt, na ktorý som použil svoj Pi, a existuje naň neobmedzené množstvo aplikácií. Tu je niekoľko vecí, ktoré teraz môžem robiť vďaka svojmu Pi:

  • Pol hodiny pred spustením budíka zapnite vedľa postele elektrický ohrievač.
  • Vypnite kúrenie hodinu po tom, ako som zaspal.
  • Keď sa mi spustí alarm, zapnite mi nočné svetlo, aby som znova nezaspal.
  • a mnoho ďalších…

Na väčšinu týchto úloh používam funkciu crontab v systéme Linux. To vám umožní nastaviť automatické naplánované úlohy na spustenie skriptu TransmitRF.py v konkrétnych časoch. Príkaz Linux at môžete použiť aj na spustenie jednorazových úloh (ktoré bolo pre mňa potrebné nainštalovať samostatne pomocou príkazu „sudo apt-get install at“). Ak napríklad potrebujem zapnúť ohrievač pol hodiny pred budíkom nasledujúce ráno, stačí napísať:

o 05:30

python TransmitRF.py c_on

Tento projekt by ste mohli použiť aj v spojení s mojím domácim monitorovacím systémom Dropbox na ovládanie spotrebičov cez internet! Ďakujeme za prečítanie a ak by ste chceli niečo objasniť alebo sa podeliť o svoj názor, napíšte komentár!

Odporúča: