Tartalomjegyzék:

Szuper egyszerű Raspberry Pi 433 MHz otthoni automatizálás: 7 lépés
Szuper egyszerű Raspberry Pi 433 MHz otthoni automatizálás: 7 lépés

Videó: Szuper egyszerű Raspberry Pi 433 MHz otthoni automatizálás: 7 lépés

Videó: Szuper egyszerű Raspberry Pi 433 MHz otthoni automatizálás: 7 lépés
Videó: Беспроводная zigbee кнопка для для автоматизаций умного дома - компактная и бюджетная 2024, November
Anonim
Szuper egyszerű Raspberry Pi 433 MHz otthoni automatizálás
Szuper egyszerű Raspberry Pi 433 MHz otthoni automatizálás

Ez az oktatóanyag egy a sok közül, amikor a Raspberry Pi használatáról van szó az otthoni vezeték nélküli eszközök vezérléséhez. Sok máshoz hasonlóan ez is megmutatja, hogyan használhatja a Pi -hez csatlakoztatott olcsó adó -vevő párost az általánosan használt 433 MHz -es rádiófrekvenciás sávban működő eszközökkel való interakcióhoz. Ez kifejezetten megmutatja, hogyan lehet be- vagy kikapcsolni bármely elektromos eszközt a Pi segítségével úgy, hogy parancsokat továbbít egy 433 MHz-es távirányítású hálózati aljzatba.

Miért hoztam létre ezt az oktatóanyagot, ha már sok ilyen létezik? Főleg azért, mert az összes többi oktatóanyag, amellyel találkoztam, túlbonyolította a dolgokat, különösen a szoftveres oldalon. Észrevettem, hogy nagymértékben támaszkodtak külső könyvtárakra, szkriptekre vagy kódrészletekre az összes munka elvégzéséhez. Sokan nem is magyarázzák el, mit csinál a mögöttes kód - csak arra kérnének, hogy helyezzen két vagy három szoftvert a Pi -re, és hajtson végre egy csomó parancsot. Nagyon szerettem volna kipróbálni a Pi-t, hogy 433 MHz-es távirányítású konnektorok segítségével be- és kikapcsoljam az elektromos készülékeket otthonom körül, de létre akartam hozni a rendszer saját, érthető verzióját, remélhetőleg megszüntetve annak szükségességét. használja valaki más könyvtárát vagy szkriptjét.

Ez az oktatóanyag erről szól. Ennek a rendszernek a szoftveres oldala két nagyon egyszerű Python -szkriptből áll - az egyik a jelek fogadására és rögzítésére, a másik pedig ezeknek a jeleknek a vezeték nélküli hálózati aljzatokhoz történő továbbítására. A jel tényleges vétele/továbbítása csak a könnyen használható RPi. GPIO könyvtárra támaszkodik, amely legalábbis számomra előre telepítve volt a Raspbian-szal. Ez a könyvtár közvetlenül importálható a Pythonba is.

Ehhez a projekthez szüksége lesz:

A Raspberry Pi. Bármelyik modellnek működnie kell, én all-in-one kezdő készletet használtam, de talán csak a központi egységre van szüksége

433 MHz -es adó/vevő pár. Az ilyen típusú projektekben leggyakrabban használt típusok ezek. Ha egy ötös csomagot vásárol, mint a linkelt, akkor néhány tartalékkal rendelkezik

433 MHz-es távirányítású konnektorokból álló készlet. Én ezeket használtam, amit nagyon ajánlok, de számtalan modell áll rendelkezésre. Csak győződjön meg róla, hogy ezen a frekvencián működnek

Néhány áramkörépítő tartozék. Azt javaslom, hogy használjon kenyértáblát és néhány áthidaló kábelt, hogy az áramkörépítési folyamat a lehető legegyszerűbb legyen.

[Ha úgy dönt, hogy ezen termékek bármelyikét megvásárolja, nagyon megköszönném, ha a fenti linkek segítségével hozzáférne a listákhoz - így a nyereség egy apró részét megkapom, külön költségek nélkül!]

1. lépés: A vevőegység beállítása

A vevőegység beállítása
A vevőegység beállítása

Mielőtt a Pi-vel parancsokat küldhet a távirányítású aljzatokhoz, tudnia kell, hogy milyen konkrét jelekre válaszol. A legtöbb távirányítású aljzathoz kézibeszélő tartozik, amellyel bizonyos egységek be- és kikapcsolhatók. A vásárolt készülékek esetében a kézibeszélőben négy sor párosított BE/KI gomb található, amelyek mindegyike ON vagy OFF jelet küld egy adott aljzatnak.

Ez felvet egy kérdést - honnan tudjuk, hogy melyik gomb melyik foglalatnak felel meg? Ez valójában a modelltől függ. Az egyik fő ok, amiért a saját foglalat -stílusomat választottam (a bevezetőben linkeltem), hogy az egységek fizikai kapcsolóval konfigurálhatók, hogy egy adott foglalat reagáljon a kézibeszélő bizonyos BE/KI gombjaira. Ez azt is jelenti, hogy kihúzhatja és áthelyezheti a konnektorokat a ház körül annak tudatában, hogy minden egység mindig ugyanazokra a BE/KI jelzésekre reagál.

Miután kitalálta, hogy az aljzatok hogyan hatnak a kézibeszélőre, a 433 MHz -es vevőegység (a fenti képen) használatával kell a készülék által küldött kódokat „szippantani”. Miután rögzítette ezen kódok hullámformáit, megismételheti azokat a Python használatával, és elküldheti őket az adóegység segítségével.

Az első dolog, amit itt meg kell tenni, a vevőkészülék csapjait a Pi GPIO megfelelő csatlakozóira kell kötni. A vevőegység négy érintkezővel rendelkezik, de csak három szükséges. Azt hiszem, mindkét központi érintkező ugyanazt a kimenetet adja, így csak az egyikhez kell csatlakoznia (kivéve, ha a fogadott jeleket két különálló GPIO tűre szeretné továbbítani).

A fenti kép nagyjából összefoglalja a kábelezést. A vevő minden csapja közvetlenül a Pi megfelelő tűjéhez köthető. Kenyérsütő deszkát és jumper kábeleket használok, hogy kicsit elegánsabbá tegyem a folyamatot. Ne feledje, hogy bármelyik GPIO adattű kiválasztható a központi vevő bármelyik csatlakozójához való csatlakozáshoz. A Pi fejlécemben a „23” jelű tüskét használtam.

FONTOS: Ha a fenti képen a „3v3” jelű tüskét egy magasabb feszültségű tűhöz csatlakoztatja a Pi -n (pl. 5v), akkor valószínűleg megsérül a Pi, mivel a GPIO csapok nem tolerálják a 3v3 feletti feszültséget. Alternatív megoldásként 5 V -ról is táplálhatja, és beállíthat egy feszültségosztót, hogy biztonságos feszültséget küldjön a DATA -tűre.

A vevő hatótávolsága nem lesz túl nagy ezen a feszültségen, különösen akkor, ha nincs csatlakoztatva antenna. Itt azonban nem kell nagy hatótávolság - mindaddig, amíg a vevőegység fel tudja venni a jeleket a kézibeszélőről, amikor azokat egymás mellett tartják.

2. lépés: A kézibeszélő kódjainak szippantása

A kézibeszélő kódjainak szippantása
A kézibeszélő kódjainak szippantása

Most, hogy a vevőkészülék a Pi -hez van csatlakoztatva, elkezdheti a projekt első izgalmas szakaszát - a szippantást. Ez magában foglalja a csatolt Python -szkript használatát a kézibeszélő által továbbított jel rögzítésére, amikor minden gombot megnyomnak. A szkript nagyon egyszerű, és nagyon ajánlom, hogy nézze meg, mielőtt futtatná - elvégre ennek a projektnek az a lényege, hogy nem csak vakon futtatja valaki más kódját!

Mielőtt elkezdené ezt a folyamatot, meg kell győződnie arról, hogy rendelkezik a sniffer parancsfájl futtatásához szükséges Python könyvtárakkal. Ezek a forgatókönyv tetején találhatók:

dátum és idő dátum importálása

importálja a matplotlib.pyplot pyplotként importálja RPi. GPIO -t GPIO -ként

Az RPi. GPIO és a datetime könyvtárak szerepeltek a Raspbian disztribúciómban, de a matplotlib könyvtárat a következőképpen kellett telepítenem:

sudo apt-get install python-matplotlib

Ez a könyvtár egy általánosan használt gráfrajzoló könyvtár, amely nagyon hasznos még a projekten kívül is, így a telepítése biztosan nem árthat! Miután a könyvtárai naprakészek, készen áll az adatok rögzítésére. A szkript a következőképpen működik:

Futtatásakor (a 'python ReceiveRF.py' paranccsal) konfigurálja a megadott GPIO tűt adatbevitelként (alapértelmezés szerint 23. pin). Ezután folyamatosan mintát vesz a tűből, és naplózza, hogy digitális 1 -et vagy 0 -t kap. Ez egy meghatározott ideig (alapértelmezés szerint 5 másodperc) folytatódik. Ezen időkorlát elérésekor a szkript leállítja az adatok rögzítését, és lezárja a GPIO bemenetet. Ezután egy kis utófeldolgozást hajt végre, és ábrázolja a kapott bemeneti értéket az idő függvényében. Ismét, ha kérdései vannak a szkript tevékenységével kapcsolatban, akkor valószínűleg maga válaszolhat rájuk, miután megnézte, hogyan működik. Megpróbáltam a kódot a lehető legegyszerűbbé és legegyszerűbbé tenni.

Mit kell tennie, figyeljen arra, amikor a szkript azt jelzi, hogy ** Elkezdte a felvételt **. Amint ez az üzenet megjelenik, nyomja meg és tartsa lenyomva a kézibeszélő egyik gombját körülbelül egy másodpercig. Feltétlenül tartsa a vevő közelében. Miután a szkript befejezte a felvételt, a matplotlib segítségével ábrázolja a felvételi intervallumban kapott jel grafikus hullámformáját. Kérjük, vegye figyelembe, hogy ha a Pi -hez SSH -ügyfél, például PuTTY segítségével csatlakozik, akkor egy X11 alkalmazást is meg kell nyitnia, hogy a hullámforma megjelenjen. Erre használom az xMing-et (és más dolgokra, például a távoli asztali gépelésre a Pi-be). A diagram megjelenítésének engedélyezéséhez egyszerűen indítsa el az xMing programot a szkript futtatása előtt, és várja meg az eredmények megjelenését.

Amint megjelenik a matplotlib ablaka, a parcellán belüli érdeklődési területnek elég nyilvánvalónak kell lennie. Az ablak alján található vezérlők segítségével nagyíthat, amíg ki nem tudja választani a kézibeszélő által továbbított jel csúcs- és mélypontjait, miközben a gombot lenyomva tartja. Lásd a fenti képet a teljes kód példájához. A jel valószínűleg nagyon rövid impulzusokból fog állni, amelyeket hasonló időszakok választanak el egymástól, ha nincs jel. A rövid impulzusok blokkját valószínűleg egy hosszabb periódus követi, amikor nem érkezik semmi, és ezután a minta megismétlődik. Miután azonosította a kód egyetlen példányához tartozó mintát, készítsen egy ilyen képernyőképet az oldal tetején, és folytassa a következő lépéssel annak értelmezéséhez.

3. lépés: A kapott jel átírása

A kapott jel átírása
A kapott jel átírása

Most, hogy azonosította az adott gomb jelzésének megfelelő időszakos magas és mély blokkot, szüksége lesz egy tárolási és értelmezési módszerre. A fenti jelpéldában észreveheti, hogy csak két egyedi minta létezik, amelyek az egész jelblokkot alkotják. Néha rövid csúcsot lát, amelyet hosszú mélypont követ, néha pedig éppen ellenkezőleg - hosszú csúcsot rövid mélypont követ. Amikor átírtam a jeleimet, úgy döntöttem, hogy a következő elnevezési módszert használom:

1 = short_on + long_off0 = long_on + short_off

Nézze meg újra a feliratos hullámformát, és látni fogja, mire gondolok. Miután azonosította a jelben szereplő egyenértékű mintákat, mindössze annyit kell tennie, hogy számolja az 1 -eseket és a 0 -kat a sorozat felépítéséhez. Átíráskor a fenti jel a következőképpen írható fel:

1111111111111010101011101

Most csak meg kell ismételnie ezt a folyamatot, hogy rögzítse és átírja a kézibeszélő többi gombjának megfelelő jeleket, és befejezte a folyamat első részét!

Mielőtt újra elküldené a jeleket az adó segítségével, még egy kis munka vár rá. Az 1 -nek vagy 0 -nak megfelelő csúcsok és mélypontok közötti időzítés nagyon fontos, és meg kell győződnie arról, hogy tudja, mennyi ideig tart egy „short_on” vagy a „long_off”. A kódjaimhoz három időzítési információt kellett kinyernem a jelek megismétlése érdekében:

  • A „rövid” intervallum időtartama, azaz az 1 eleje vagy a 0 vége.
  • A „hosszú” intervallum időtartama, azaz az 1 vége vagy a 0 eleje.
  • A „kiterjesztett” intervallum időtartama. Észrevettem, hogy amikor lenyomtam a gombot a kézibeszélőn, a jelblokk minden ismétlődő példánya között volt egy „meghosszabbított ki” időszak. Ez a késleltetés a szinkronizálásra szolgál, és rögzített időtartamú.

Ezen időzítési értékek meghatározásához használhatja a matplotlib ablak zoom funkcióját, hogy teljesen nagyítson, és vigye a kurzort a jel megfelelő részeire. A kurzor helyének leolvasása az ablak alján lehetővé teszi annak meghatározását, hogy a jel egyes részei milyen szélesek, hosszú, rövid vagy hosszabb intervallumnak felelnek meg. Vegye figyelembe, hogy a diagram x tengelye az időt jelöli, és a kurzor leolvasásának x összetevője másodpercekben van megadva. Számomra a szélességek a következők voltak (másodpercben):

  • rövid_késleltetés = 0,00045
  • hosszú_késés = 0,00090 (kétszer olyan hosszú, mint egy rövid)
  • kiterjesztett késleltetés = 0,0096

4. lépés: Az adóegység beállítása

Az adóegység beállítása
Az adóegység beállítása

Miután összegyűjtötte a kódokat és az időzítési adatokat, leválaszthatja a vevőegységet, mivel már nem lesz rá szüksége. Ezután a távadót közvetlenül a megfelelő Pi GPIO érintkezőkhöz kötheti, a fenti képen látható módon. Azt tapasztaltam, hogy az adóegységek csapjai meg vannak jelölve, ami megkönnyíti a folyamatot.

Ebben az esetben rendben van a készülék 5V -os tápegységről történő áramellátása a Pi -ből, mivel a DATA pin nem küld jeleket a Pi -nek, csak fogadja azokat. Ezenkívül az 5 V -os tápegység nagyobb átviteli tartományt biztosít, mint a 3 V3 -as tápegység. Ismét csatlakoztathatja a DATA tűt a Pi bármely megfelelő tűjéhez. A 23 -as tűt használtam (ugyanaz, mint a vevőnél).

A másik dolog, amit javaslok, az antenna hozzáadása az adó jobb felső sarkában lévő kis lyukhoz. 17 cm hosszú egyenes drótot használtam. Egyes források hasonló hosszúságú tekercselt huzalt javasolnak. Nem tudom, melyik a jobb, de az egyenes vezeték elegendő hatótávolságot biztosít ahhoz, hogy a konnektorokat a kis lakásom bármely pontjáról be- és kikapcsolhassam. A legjobb, ha forrasztjuk az antennát, de most eltávolítottam a műanyag egy részét a huzalból, és a rézbe csavartam a lyukat.

Miután az adó be van kapcsolva, ennyi a hardver beállítása! Már csak az a dolga, hogy felhelyezze a konnektorokat a ház körül, és nézze meg az adóprogramot.

5. lépés: Jelek továbbítása a Pi segítségével

Itt jön be a második Python -szkript. Olyan egyszerű, mint az első, ha nem egyszerűbb. Ismét kérjük, töltse le és nézze át a kódot. Szerkesztenie kell a szkriptet, hogy a megfelelő jeleket továbbítsa a 3. lépésben rögzített adatoknak megfelelően, így most itt az ideje, hogy gyorsan ránézzen.

A szkript futtatásához szükséges könyvtárak mindegyike előre telepítve volt a Pi-re, így további telepítésre nem volt szükség. Ezek a forgatókönyv tetején találhatók:

importálási idő

import sys import RPi. GPIO mint GPIO

A könyvtár importálása alatt vannak azok az információk, amelyeket szerkeszteni kell. Így néz ki alapértelmezés szerint (ez a 3. lépésben meghatározott socketemnek megfelelő információ):

a_on = '111111111111111010101011101'

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

Itt van nyolc kódlánc (kettő a kézibeszélőm minden egyes ki- és bekapcsoló gombjára - lehet, hogy több vagy kevesebb kódja van), majd a három lépésben meghatározott időzítési információ, amelyet szintén a 3. lépésben határoztak meg. helyesen adta meg ezeket az információkat.

Ha elégedett a szkriptbe beírt kódokkal/késésekkel (tetszés szerint átnevezheti a kódlánc -változókat), nagyjából készen áll a rendszer kipróbálására! Mielőtt ezt megtenné, nézze meg a script átviteli_kód () függvényét. Itt következik be a tényleges kölcsönhatás az adóval. Ez a függvény elvárja, hogy az egyik kódláncot argumentumként küldjék be. Ezután GPIO kimenetként megnyitja a meghatározott tűt, és végigmegy a kódlánc minden karakterén. Ezután be- vagy kikapcsolja a távadót a megadott időzítési információk alapján, hogy a kódláncnak megfelelő hullámformát hozzon létre. Mindegyik kódot többször (alapértelmezés szerint 10) elküldi, hogy csökkentse annak kimaradásának esélyét, és kiterjesztett késleltetést hagy az egyes kódblokkok között, akárcsak a kézibeszélőt.

A szkript futtatásához a következő parancsszintaxist használhatja:

python TransmitRF.py code_1 code_2…

A szkript egyetlen futtatásával több kódláncot is továbbíthat. Például az (a) és (b) foglalatok be- és aljzat (c) kikapcsolásához futtassa a parancsfájlt a következő paranccsal:

python TransmitRF.py a_on b_on c_off

6. lépés: Megjegyzés az időzítés pontosságáról

Amint már említettük, az átvitt be/ki impulzusok közötti idő nagyon fontos. A TransmitRF.py szkript a python time.sleep () függvényét használja fel a hullámformák megfelelő impulzusintervallumokkal való felépítéséhez, de meg kell jegyezni, hogy ez a függvény nem teljesen pontos. Az a hosszúság, amelyre a parancsfájl a következő művelet végrehajtása előtt vár, függhet a processzor terhelésétől az adott pillanatban. Ez egy másik ok, amiért a TransmitRF.py többször is elküldi az egyes kódokat - arra az esetre, ha a time.sleep () függvény nem képes megfelelően létrehozni a kód adott példányát.

Nekem személy szerint soha nem volt gondom a time.sleep () -el a kódok elküldése kapcsán. Azt azonban tudom, hogy az én time.sleep () hibája körülbelül 0,1 ms. Ezt a mellékelt SleepTest.py szkript segítségével határoztam meg, amellyel becslést lehet adni a Pi time.sleep () függvény pontos működéséről. A távirányítású aljzatok esetében a legrövidebb késleltetés, amelyet megvalósítanom kellett, 0,45 ms volt. Mint mondtam, nem volt problémám a nem reagáló aljzatokkal, így úgy tűnik, hogy 0,45 ± 0,1 ms elég jó.

Vannak más módszerek is a késleltetés pontosabb biztosítására; például használhat egy dedikált PIC chipet a kódok előállításához, de az ilyesmi túlmutat ezen oktatóanyag keretein.

7. lépés: Következtetés

Következtetés
Következtetés

Ez a projekt bemutatott egy módszert bármely elektromos készülék vezérlésére Raspberry Pi és egy 433 MHz-es távirányítású aljzat segítségével, az egyszerűségre és az átláthatóságra összpontosítva. Ez a legizgalmasabb és legrugalmasabb projekt, amire a Pi -t használtam, és határtalan alkalmazások vannak erre. Íme néhány dolog, amit most meg tudok tenni a Pi -nek köszönhetően:

  • Kapcsolja be a villanyfűtést az ágyam mellett fél órával az ébresztés megszólalása előtt.
  • Kapcsolja ki a fűtést egy órával azután, hogy elaludtam.
  • Kapcsolja be az éjjeli lámpát, amikor megszólal az ébresztő, hogy ne aludjak vissza.
  • és még sok más…

A legtöbb ilyen feladathoz a crontab függvényt használom Linuxon belül. Ez lehetővé teszi, hogy beállítson automatikus ütemezett feladatokat a TransmitRF.py parancsfájl futtatásához meghatározott időpontokban. Használhatja a Linux at parancsot is egyszeri feladatok futtatásához (ezeket nekem külön kellett telepíteni a 'sudo apt-get install at' használatával). Például, hogy másnap reggel fél órával az ébresztő hangjelzésem előtt bekapcsoljam a fűtőt, csak annyit kell tennem, hogy:

05:30 órakor

python TransmitRF.py c_on

Ezt a projektet a Dropbox otthoni felügyeleti rendszeremmel együtt is használhatja a készülékek interneten keresztüli vezérlésére! Köszönjük, hogy elolvasta, és ha valamit tisztázni szeretne, vagy véleményét szeretné megosztani, írjon megjegyzést!

Ajánlott: