Sadržaj:

Super jednostavna Raspberry Pi 433MHz kućna automatizacija: 7 koraka
Super jednostavna Raspberry Pi 433MHz kućna automatizacija: 7 koraka

Video: Super jednostavna Raspberry Pi 433MHz kućna automatizacija: 7 koraka

Video: Super jednostavna Raspberry Pi 433MHz kućna automatizacija: 7 koraka
Video: Проект интернет-радио ESP32 с дисплеем Nextion 3,5 дюйма 2024, Novembar
Anonim
Super jednostavna Raspberry Pi 433MHz kućna automatizacija
Super jednostavna Raspberry Pi 433MHz kućna automatizacija

Ovaj je vodič jedan od mnogih kada je u pitanju upotreba Raspberry Pi za kontrolu bežičnih uređaja po kući. Kao i mnogi drugi, pokazat će vam kako koristiti jeftin par predajnik/prijemnik spojen na vaš Pi za interakciju s uređajima koji rade na uobičajenom radiofrekvencijskom pojasu od 433MHz. Posebno će vam pokazati kako uključiti ili isključiti bilo koji električni uređaj pomoću vašeg Pi-a odašiljanjem naredbi na set daljinski upravljanih utičnica za 433MHz.

Zašto sam stvorio ovaj vodič ako toliko već postoji? Uglavnom zato što se činilo da su svi drugi vodiči na koje sam naišao komplicirali stvari, posebno na softverskoj strani. Primijetio sam da su se u velikoj mjeri oslanjali na biblioteke trećih strana, skripte ili isječke koda da bi obavili sav posao. Mnogi ne bi ni objasnili šta radi osnovni kôd - samo bi vas zamolili da ubacite dva ili tri komada softvera na svoj Pi i izvršite hrpu naredbi, bez postavljanja pitanja. Zaista sam želio probati upotrijebiti svoj Pi za uključivanje i isključivanje električnih uređaja po svom domu pomoću seta daljinski upravljanih utičnica od 433MHz, ali želio sam stvoriti svoju vlastitu verziju sistema koju bih mogao razumjeti, nadam se da će eliminirati potrebu za koristiti tuđe biblioteke ili skripte.

O tome govori ovaj vodič. Softverska strana ovog sistema sastoji se od dva vrlo jednostavna Python skripta - jednog za prijem i snimanje signala i drugog za prijenos ovih signala natrag u bežične utičnice za napajanje. Stvarni prijem/prijenos signala oslanja se samo na biblioteku RPi. GPIO koja je jednostavna za upotrebu, koja je, barem za mene, unaprijed instalirana s Raspbian-om. Ova biblioteka se takođe može uvesti direktno u Python.

Za ovaj projekat trebat će vam:

A Raspberry Pi. Bilo koji model bi trebao funkcionirati, koristio sam početni komplet sve u jednom, ali možda vam je potrebna samo centralna jedinica

Par predajnik/prijemnik od 433MHz. Čini se da su najčešće korišteni u ovoj vrsti projekata. Kupovinom pakovanja od pet komada poput onog povezanog osiguravate da imate nekoliko rezervnih dijelova

Komplet daljinskih upravljačkih utičnica na 433MHz. Koristio sam ove koje bih toplo preporučio, ali na raspolaganju je bezbroj modela. Samo se pobrinite da rade na ovoj frekvenciji

Neki dodaci za izgradnju kola. Preporučio bih korištenje matične ploče i nekoliko kratkospojnih kabela kako bi proces izgradnje kruga bio što lakši.

[Ako se odlučite za kupnju bilo kojeg od ovih proizvoda, bio bih vam zahvalan ako pristupite popisima pomoću gornjih veza - na taj način dobijam mali dio dobiti bez dodatnih troškova!]

Korak 1: Postavljanje prijemne jedinice

Postavljanje prijemne jedinice
Postavljanje prijemne jedinice

Prije nego što možete koristiti svoj Pi za slanje naredbi u daljinski upravljane utičnice, morate znati na koje specifične signale oni reagiraju. Većina utičnica sa daljinskim upravljanjem isporučuje se sa slušalicom koja se može koristiti za uključivanje ili isključivanje određenih jedinica. U slučaju onih koje sam kupio, slušalica ima četiri reda uparenih tipki za uključivanje/isključivanje, od kojih svaka šalje signal za uključivanje ili isključivanje na određenu utičnicu.

Ovo postavlja pitanje - kako možemo znati koja dugmad odgovaraju kojoj utičnici? To zapravo ovisi o modelu koji imate. Jedan od glavnih razloga zašto sam odabrao svoj stil utičnice (povezan u uvodu) je taj što se jedinice mogu konfigurirati pomoću fizičkog prekidača kako bi određena utičnica reagirala na određeni skup tipki za uključivanje/isključivanje na slušalici. To također znači da možete isključiti i premjestiti utičnice po kući znajući da će svaka jedinica uvijek reagirati na iste ON/OFF signale.

Nakon što ste shvatili kako vaše utičnice komuniciraju sa slušalicom, morat ćete upotrijebiti svoju prijemnu jedinicu od 433MHz (na slici gore) za „njuškanje“kodova koje slušalica šalje. Nakon što snimite valne oblike ovih kodova, možete ih replicirati pomoću Pythona i poslati ih pomoću odašiljačke jedinice.

Prvo što trebate učiniti je spojiti pinove vašeg prijemnika na ispravne GPIO pinove na Pi -u. Prijemna jedinica ima četiri pina, ali su potrebna samo tri. Mislim da oba centralna pina daju isti izlaz, pa se trebate povezati samo na jedan od njih (osim ako ne želite usmjeriti primljene signale na dva odvojena GPIO pina).

Gornja slika prilično sažima ožičenje. Svaki pin na prijemniku može se spojiti direktno na odgovarajući pin na Pi. Koristim matičnu ploču i kratkospojne kabele kako bih postupak učinio elegantnijim. Imajte na umu da možete odabrati bilo koji GPIO pin za povezivanje na bilo koji od pinova centralnog prijemnika. Koristio sam pin označen sa '23' na svom Pi zaglavlju.

VAŽNO: Ako spojite pin označen sa '3v3' na gornjoj slici na pin višeg napona na Pi (npr. 5v), vjerojatno ćete oštetiti Pi jer GPIO pinovi ne mogu tolerirati napone iznad 3v3. Alternativno, možete ga napajati s 5v i postaviti razdjelnik napona za slanje sigurnog napona na DATA pin.

Domet prijemnika neće biti veliki pri ovom naponu, posebno ako antena nije priključena. Međutim, ovdje vam ne treba dug domet - sve dok prijemnik može pokupiti signale sa slušalice kada se drže jedan pored drugog, to je sve što nam treba.

Korak 2: Njuškanje kodova slušalice

Njuškanje kodova slušalice
Njuškanje kodova slušalice

Sada kada je vaš prijemnik spojen na Pi, možete započeti prvu uzbudljivu fazu ovog projekta - njuškanje. Ovo uključuje upotrebu priložene Python skripte za snimanje signala koji prenosi slušalica pri pritisku svakog dugmeta. Skripta je vrlo jednostavna i toplo bih vam preporučio da je pogledate prije nego što je pokrenete - na kraju krajeva, poanta ovog projekta je da nećete samo slijepo pokrenuti tuđi kod!

Prije nego započnete ovaj proces, morat ćete se uvjeriti da imate Python biblioteke potrebne za pokretanje skripte snifera. Navedeni su pri vrhu skripte:

from datetime import datetime

uvoz matplotlib.pyplot kao pyplot uvoz RPi. GPIO kao GPIO

Biblioteke RPi. GPIO i datetime uključene su u moju Raspbian distribuciju, ali morao sam instalirati matplotlib biblioteku na sljedeći način:

sudo apt-get install python-matplotlib

Ova biblioteka je često korištena biblioteka za iscrtavanje grafova koja je vrlo korisna čak i izvan ovog projekta, pa je instaliranje definitivno ne može naštetiti! Kada se vaše biblioteke ažuriraju, spremni ste za početak snimanja podataka. Evo kako skripta funkcionira:

Kada se pokrene (pomoću naredbe 'python ReceiveRF.py'), konfigurirat će definirani GPIO pin kao ulaz podataka (pin 23 prema zadanim postavkama). Zatim će neprestano uzorkovati pin i evidentirati prima li digitalni 1 ili 0. Ovo se nastavlja zadano vrijeme (5 sekundi prema zadanim postavkama). Kada se dosegne ovo vremensko ograničenje, skripta će zaustaviti snimanje podataka i zatvorit će GPIO ulaz. Zatim izvodi malu naknadnu obradu i iscrtava primljenu ulaznu vrijednost u odnosu na vrijeme. Opet, ako imate pitanja o tome šta skripta radi, vjerovatno možete sami odgovoriti na njih nakon što pogledate kako radi. Pokušao sam učiniti kod što čitljivijim i jednostavnijim.

Ono što trebate učiniti je paziti kada skripta pokaže da je ** započelo snimanje **. Nakon što se pojavi ova poruka, trebate pritisnuti i držati jedno dugme na slušalici oko sekunde. Držite ga blizu prijemnika. Kada skripta završi snimanje, ona će koristiti matplotlib za iscrtavanje grafičkog talasnog oblika signala koji je primila tokom intervala snimanja. Imajte na umu da ako ste na svoj Pi povezani putem SSH klijenta, poput PuTTY -a, morat ćete otvoriti i aplikaciju X11 da biste omogućili prikaz valnog oblika. Za to koristim xMing (i za druge stvari, poput udaljenog desktopa u svom Pi-u). Da biste omogućili prikaz zapleta, jednostavno pokrenite xMing prije nego što pokrenete skriptu i pričekajte da se rezultati pojave.

Kada se pojavi vaš prozor za matplotlib, područje interesa unutar crteža bi trebalo biti prilično očito. Pomoću kontrola pri dnu prozora možete zumirati sve dok ne budete u mogućnosti da odaberete uspone i padove signala koji prenosi slušalica dok je dugme držano pritisnuto. Pogledajte gornju sliku za primjer potpunog koda. Signal će se vjerojatno sastojati od vrlo kratkih impulsa odvojenih sličnim vremenskim razdobljima u kojima se ne prima signal. Nakon ovog bloka kratkih impulsa vjerojatno će uslijediti duži period u kojem se ništa ne prima, nakon čega će se obrazac ponoviti. Nakon što ste identificirali uzorak koji pripada jednoj instanci koda, napravite takav snimak ekrana na vrhu ove stranice i nastavite na sljedeći korak kako biste ga protumačili.

Korak 3: Transkripcija rezultirajućeg signala

Transkripcija rezultirajućeg signala
Transkripcija rezultirajućeg signala

Sada kada ste identificirali blok periodičnih uspona i padova koji odgovaraju signalu određene tipke, trebat će vam način pohranjivanja i tumačenja. U gornjem primjeru signala primijetit ćete da postoje samo dva jedinstvena uzorka koji čine cijeli signalni blok. Ponekad vidite kratki high nakon kojeg slijedi long low, a ponekad je suprotno - long high nakon kojeg slijedi short low. Kada sam prepisivao svoje signale, odlučio sam koristiti sljedeću konvenciju imenovanja:

1 = short_on + long_off0 = long_on + short_off

Pogledajte ponovo označeni talasni oblik i videćete na šta mislim. Nakon što ste identificirali ekvivalentne obrasce u svom signalu, sve što trebate učiniti je prebrojati jedinice 1 i 0 kako biste izgradili niz. Kada se transkribira, gornji signal se može zapisati na sljedeći način:

1111111111111010101011101

Sada samo trebate ponoviti ovaj postupak za snimanje i transkripciju signala koji odgovaraju ostalim gumbima na vašoj slušalici i završili ste prvi dio procesa!

Prije nego što možete ponovno poslati signale pomoću odašiljača, potrebno je još malo posla. Tajming između uspona i padova koji odgovara 1 ili 0 je vrlo važan i morate biti sigurni da znate koliko dugo 'short_on' ili 'long_off' zapravo traje. Za moje kodove, postojale su tri informacije o vremenu koje sam trebao izdvojiti da bih replicirao signale:

  • Trajanje 'kratkog' intervala, tj. Početak 1 ili kraj 0.
  • Trajanje 'dugog' intervala, tj. Kraj 1 ili početak 0.
  • Trajanje 'produženog' intervala. Primijetio sam da je, kada sam pritisnuo dugme na slušalici, postojao period "produženog_isključivanja" između svake ponovljene instance signalnog bloka. Ovo kašnjenje se koristi za sinhronizaciju i ima fiksno trajanje.

Da biste odredili ove vremenske vrijednosti, možete koristiti funkciju zumiranja u prozoru matplotlib da biste uvećali prikaz i postavili kursor na relevantne dijelove signala. Očitavanje lokacije kursora na dnu prozora trebalo bi vam omogućiti da odredite koliko je širok svaki dio signala koji odgovara dugom, kratkom ili produženom intervalu. Imajte na umu da x-os grafikona predstavlja vrijeme, a x komponenta očitavanja kursora je u jedinicama sekundi. Za mene su širine bile sljedeće (u sekundama):

  • short_delay = 0,00045
  • long_delay = 0,00090 (dvostruko duže od 'kratkog')
  • produženo_kašnjenje = 0,0096

Korak 4: Postavljanje odašiljačke jedinice

Postavljanje jedinice predajnika
Postavljanje jedinice predajnika

Nakon što prikupite kodove i podatke o vremenu, možete isključiti prijemnu jedinicu jer vam više neće trebati. Zatim možete povezati predajnik direktno na odgovarajuće Pi GPIO pinove kao što je prikazano na gornjoj slici. Otkrio sam da su pinovi na odašiljačkim jedinicama označeni, što olakšava proces.

U ovom slučaju, u redu je napajati jedinicu pomoću napajanja od 5V iz Pi jer DATA pin neće slati signale na Pi, već ih samo prima. Također, napajanje od 5 V osigurat će veći prijenosni opseg od korištenja napajanja 3v3. Opet, možete spojiti DATA pin na bilo koji odgovarajući pin na Pi -u. Koristio sam pin 23 (isto kao i za prijemnik).

Još jedna stvar koju bih preporučio je dodavanje antene u malu rupu u gornjem desnom kutu odašiljača. Koristio sam komad ravne žice dugačak 17 cm. Neki izvori preporučuju namotanu žicu slične dužine. Nisam siguran šta je bolje, ali ravna žica pruža dovoljan domet za uključivanje/isključivanje utičnica s bilo koje lokacije u mom stanu. Najbolje je lemiti antenu, ali samo sam uklonio dio plastike sa žice i omotao bakar kroz rupu.

Kada se odašiljač poveže, to je sve što je hardversko podešavanje obavljeno! Jedino što sada treba učiniti je postaviti utičnice po kući i pogledati program odašiljača.

Korak 5: Prijenos signala pomoću Pi

Ovdje dolazi druga Python skripta. Dizajnirana je tako da bude jednostavna kao i prva, ako ne i više. Opet, preuzmite ga i pregledajte kôd. Morat ćete urediti skriptu za prijenos ispravnih signala u skladu s podacima koje ste zabilježili u koraku 3, pa je sada pravo vrijeme za brzi pogled na nju.

Biblioteke potrebne za pokretanje ove skripte bile su unaprijed instalirane na mom Pi, tako da nije bila potrebna dodatna instalacija. Navedeni su pri vrhu skripte:

vreme uvoza

uvoz sys uvoz RPi. GPIO kao GPIO

Ispod uvoza biblioteke nalaze se informacije koje ćete morati urediti. Evo kako to izgleda prema zadanim postavkama (ovo su informacije koje odgovaraju mojim utičnicama utvrđene pomoću koraka 3):

a_on = '1111111111111010101011111'

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

Ovdje imamo osam nizova kodova (dva za svaki par dugmadi za uključivanje/isključivanje na mojoj slušalici - možda imate više ili manje kodova) nakon čega slijede tri informacije o vremenu koje su također određene u koraku 3. Odvojite vrijeme da provjerite imate li ispravno uneo ove podatke.

Kad budete zadovoljni kodovima/kašnjenjima koja ste unijeli u skriptu (ako želite, možete preimenovati varijable niza koda), spremni ste za isprobavanje sistema! Prije nego što to učinite, pogledajte funkciju transmit_code () u skripti. Tu dolazi do stvarne interakcije s odašiljačem. Ova funkcija očekuje da se jedan od nizova koda pošalje kao argument. Zatim otvara definirani pin kao GPIO izlaz i petlja kroz svaki znak u nizu koda. Zatim uključuje ili isključuje odašiljač u skladu s vremenskim podacima koje ste unijeli za stvaranje valnog oblika koji odgovara kodnom nizu. Svaki kod šalje više puta (10 prema zadanim postavkama) kako bi se smanjila mogućnost njegovog propuštanja i ostavlja produženo_kašnjenje između svakog bloka koda, baš kao i slušalica.

Da biste pokrenuli skriptu, možete koristiti sljedeću sintaksu naredbe:

python TransmitRF.py kod_1 kod_2 …

Možete prenijeti više nizova koda s jednim pokretanjem skripte. Na primjer, da biste uključili utičnice (a) i (b) i isključili utičnicu (c), pokrenite skriptu sa sljedećom naredbom:

python TransmitRF.py a_on b_on c_off

Korak 6: Napomena o tačnosti vremena

Kao što je spomenuto, vrijeme između emitiranih impulsa za uključivanje/isključivanje je vrlo važno. Skripta TransmitRF.py koristi pythonovu funkciju time.sleep () za izgradnju valnih oblika s ispravnim intervalima impulsa, ali treba napomenuti da ova funkcija nije potpuno točna. Dužina na koju skriva čeka prije izvršavanja sljedeće operacije može ovisiti o opterećenju procesora u tom trenutku. To je još jedan razlog zašto TransmitRF.py šalje svaki kod više puta - samo u slučaju da funkcija time.sleep () ne može pravilno konstruirati datu instancu koda.

Ja lično nikada nisam imao problema sa time.sleep () kada je u pitanju slanje kodova. Međutim, znam da moje vrijeme.sleep () ima grešku od oko 0,1 ms. To sam utvrdio pomoću priložene skripte SleepTest.py koja se može koristiti za procjenu koliko je tačna funkcija Pi's time.sleep (). Za moje posebne utičnice na daljinsko upravljanje, najkraće kašnjenje koje sam trebao implementirati bilo je 0,45 ms. Kao što sam rekao, nisam imao problema s utičnicama koje ne reagiraju, pa se čini da je 0,45 ± 0,1 ms dovoljno dobro.

Postoje i druge metode za osiguravanje preciznijeg kašnjenja; na primjer, mogli biste koristiti namjenski PIC čip za generiranje kodova, ali takve stvari izlaze iz okvira ovog vodiča.

Korak 7: Zaključak

Zaključak
Zaključak

Ovaj projekt je predstavio metodu upravljanja bilo kojim električnim uređajem pomoću Raspberry Pi-a i seta daljinski upravljanih utičnica od 433MHz, s naglaskom na jednostavnosti i transparentnosti. Ovo je najuzbudljiviji i najfleksibilniji projekt za koji sam koristio svoj Pi, a za to postoje neograničene aplikacije. Evo nekih stvari koje sada mogu učiniti zahvaljujući svom Pi:

  • Uključite električni grijač pored kreveta pola sata prije nego što mi se oglasi alarm.
  • Isključite grijač sat vremena nakon što sam zaspao.
  • Uključi moje noćno svjetlo kad se alarm oglasi kako ne bih zaspao.
  • i još mnogo toga…

Za većinu ovih zadataka koristim funkciju crontab unutar Linuxa. Ovo vam omogućuje postavljanje automatskih planiranih zadataka za pokretanje skripte TransmitRF.py u određeno vrijeme. Također možete koristiti naredbu Linux at za pokretanje jednokratnih zadataka (koji su za mene morali biti instalirani zasebno pomoću 'sudo apt-get install at'). Na primjer, da bih uključio grijač pola sata prije nego što mi se alarm ugasi sljedećeg jutra, sve što trebam učiniti je upisati:

u 05:30

python TransmitRF.py c_on

Ovaj projekt možete koristiti i zajedno s mojim Dropbox sistemom za nadzor doma za kontrolu uređaja preko interneta! Hvala vam na čitanju, a ako želite nešto pojasniti ili podijeliti svoje mišljenje, postavite komentar!

Preporučuje se: