Spisu treści:

Super prosta automatyka domowa Raspberry Pi 433 MHz: 7 kroków
Super prosta automatyka domowa Raspberry Pi 433 MHz: 7 kroków

Wideo: Super prosta automatyka domowa Raspberry Pi 433 MHz: 7 kroków

Wideo: Super prosta automatyka domowa Raspberry Pi 433 MHz: 7 kroków
Wideo: [BONUS] Raspberry Pi w Domu z papieru?! Analiza 2024, Lipiec
Anonim
Super prosta automatyka domowa Raspberry Pi 433 MHz
Super prosta automatyka domowa Raspberry Pi 433 MHz

Ten samouczek jest jednym z wielu, jeśli chodzi o używanie Raspberry Pi do sterowania urządzeniami bezprzewodowymi w domu. Podobnie jak wiele innych, pokaże Ci, jak używać taniej pary nadajnik/odbiornik podłączonej do Twojego Pi do interakcji z urządzeniami działającymi w powszechnie używanym paśmie częstotliwości radiowej 433 MHz. W szczególności pokaże Ci, jak włączać lub wyłączać dowolne urządzenie elektryczne za pomocą Pi, przesyłając polecenia do zestawu zdalnie sterowanych gniazdek 433 MHz.

Dlaczego stworzyłem ten samouczek, skoro tak wiele już istnieje? Głównie dlatego, że prawie wszystkie inne samouczki, z którymi się spotkałem, wydawały się nadmiernie komplikować, zwłaszcza po stronie oprogramowania. Zauważyłem, że przy wykonywaniu całej pracy polegali oni w dużej mierze na bibliotekach, skryptach lub fragmentach kodu innych firm. Wielu nawet nie wyjaśniło, co robi kod bazowy – po prostu poprosiliby o wrzucenie dwóch lub trzech programów do swojego Pi i wykonanie kilku poleceń, bez zadawania pytań. Naprawdę chciałem spróbować użyć mojego Pi do włączania i wyłączania urządzeń elektrycznych w moim domu za pomocą zestawu zdalnie sterowanych gniazd 433 MHz, ale chciałem stworzyć własną wersję systemu, którą mógłbym zrozumieć, mając nadzieję, że eliminując potrzebę korzystać z cudzych bibliotek lub skryptów.

O tym jest ten samouczek. Strona oprogramowania tego systemu składa się z dwóch bardzo prostych skryptów Pythona - jednego do odbierania i rejestrowania sygnałów, a drugiego do przesyłania tych sygnałów z powrotem do bezprzewodowych gniazd zasilania. Rzeczywisty odbiór/transmisja sygnału opiera się tylko na łatwej w użyciu bibliotece RPi. GPIO, która, przynajmniej dla mnie, została wstępnie zainstalowana z Raspbianem. Tę bibliotekę można również zaimportować bezpośrednio do Pythona.

Do tego projektu będziesz potrzebować:

Raspberry Pi. Każdy model powinien działać, użyłem zestawu startowego all-in-one, ale być może potrzebujesz tylko jednostki centralnej

Para nadajnik/odbiornik 433 MHz. Wydaje się, że najczęściej używane w tego typu projektach są właśnie te. Kupienie zestawu pięciu sztuk, takich jak ten połączony, zapewnia, że masz kilka zapasowych

Zestaw zdalnie sterowanych gniazd zasilających 433MHz. Użyłem tych, które gorąco polecam, ale dostępnych jest niezliczona ilość modeli. Tylko upewnij się, że działają na tej częstotliwości

Niektóre akcesoria do budowy obwodów. Zalecam użycie płytki stykowej i kilku kabli połączeniowych, aby proces budowania obwodu był jak najłatwiejszy.

[Jeśli zdecydujesz się na zakup któregokolwiek z tych produktów, będę bardzo wdzięczny, jeśli uzyskasz dostęp do aukcji za pomocą powyższych linków - w ten sposób otrzymuję niewielką część zysków bez dodatkowych kosztów!]

Krok 1: Konfiguracja odbiornika

Konfiguracja odbiornika
Konfiguracja odbiornika

Zanim będziesz mógł używać swojego Pi do wysyłania poleceń do zdalnie sterowanych gniazd, musisz wiedzieć, na jakie konkretne sygnały reagują. Większość zdalnie sterowanych gniazd jest dostarczana ze słuchawką, której można używać do włączania lub wyłączania określonych jednostek. W przypadku tych, które kupiłem, słuchawka ma cztery rzędy sparowanych przycisków ON/OFF, z których każdy wysyła sygnał ON lub OFF do konkretnego gniazda.

Nasuwa się pytanie - skąd wiemy, które przyciski odpowiadają jakiemu gniazdu? To faktycznie zależy od posiadanego modelu. Jednym z głównych powodów, dla których wybrałem mój konkretny styl gniazda (połączony we wstępie), jest to, że urządzenia można skonfigurować za pomocą fizycznego przełącznika, aby określone gniazdo reagowało na określony zestaw przycisków ON/OFF na słuchawce. Oznacza to również, że możesz odłączyć i przenosić gniazdka w całym domu, wiedząc, że każda jednostka zawsze będzie reagowała na te same sygnały ON/OFF.

Gdy już zorientujesz się, w jaki sposób twoje gniazda współdziałają ze słuchawką, będziesz musiał użyć jednostki odbiorczej 433 MHz (na zdjęciu powyżej), aby „wywęszyć” kody wysyłane przez słuchawkę. Po zarejestrowaniu przebiegów tych kodów można je replikować za pomocą Pythona i wysyłać za pomocą nadajnika.

Pierwszą rzeczą do zrobienia jest podłączenie pinów odbiornika do właściwych pinów GPIO na Pi. Jednostka odbiorcza ma cztery piny, ale potrzebne są tylko trzy z nich. Myślę, że oba środkowe piny dają to samo wyjście, więc wystarczy podłączyć tylko do jednego z nich (chyba że chcesz przesyłać odebrane sygnały do dwóch oddzielnych pinów GPIO).

Powyższy obrazek w dużym stopniu podsumowuje okablowanie. Każdy pin odbiornika można podłączyć bezpośrednio do odpowiedniego pinu w Pi. Używam płytki stykowej i kabli połączeniowych, aby proces był nieco bardziej elegancki. Zwróć uwagę, że możesz wybrać dowolny pin danych GPIO do podłączenia do jednego z środkowych pinów odbiornika. Użyłem pinu oznaczonego jako „23” na moim nagłówku Pi.

WAŻNE: Jeśli podłączysz pin oznaczony „3v3” na powyższym obrazku do pinu o wyższym napięciu w Pi (np. 5v), prawdopodobnie uszkodzisz Pi, ponieważ piny GPIO nie tolerują napięć powyżej 3v3. Alternatywnie możesz zasilić go napięciem 5 V i ustawić dzielnik napięcia, aby wysłać bezpieczne napięcie do pinu DATA.

Zasięg odbiornika przy tym napięciu nie będzie bardzo duży, zwłaszcza jeśli antena nie jest podłączona. Jednak nie potrzebujesz tutaj dużego zasięgu - tak długo, jak odbiornik może odbierać sygnały ze słuchawki, gdy są one trzymane obok siebie, to wszystko, czego potrzebujemy.

Krok 2: Wąchanie kodów słuchawki

Wąchanie kodów słuchawki
Wąchanie kodów słuchawki

Teraz, gdy Twój odbiornik jest podłączony do Pi, możesz rozpocząć pierwszy ekscytujący etap tego projektu - wąchanie. Wiąże się to z użyciem dołączonego skryptu Pythona do rejestrowania sygnału przesyłanego przez słuchawkę po naciśnięciu każdego przycisku. Skrypt jest bardzo prosty i bardzo polecam rzucić okiem na niego przed jego uruchomieniem - w końcu celem tego projektu jest to, że nie będziesz po prostu ślepo uruchamiać czyjegoś kodu!

Zanim zaczniesz ten proces, musisz upewnić się, że masz biblioteki Pythona potrzebne do uruchomienia skryptu sniffer. Są one wymienione na górze skryptu:

from datetime import datetime

importuj matplotlib.pyplot jako pyplot importuj RPi. GPIO jako GPIO

Biblioteki RPi. GPIO i datetime zostały dołączone do mojej dystrybucji Raspbian, ale musiałem zainstalować bibliotekę matplotlib w następujący sposób:

sudo apt-get zainstaluj python-matplotlib

Ta biblioteka jest powszechnie używaną biblioteką do tworzenia wykresów, która jest bardzo przydatna nawet poza tym projektem, więc jej zainstalowanie zdecydowanie nie zaszkodzi! Gdy biblioteki są zaktualizowane, możesz rozpocząć nagrywanie danych. Oto jak działa skrypt:

Po uruchomieniu (za pomocą polecenia 'python ReceiveRF.py'), skonfiguruje zdefiniowany pin GPIO jako wejście danych (domyślnie pin 23). Następnie będzie stale próbkować pin i rejestrować, czy odbiera cyfrę 1 czy 0. Trwa to przez określony czas (domyślnie 5 sekund). Po osiągnięciu tego limitu czasu skrypt przestanie rejestrować dane i zamknie wejście GPIO. Następnie wykonuje niewielkie przetwarzanie końcowe i wykreśla otrzymaną wartość wejściową w funkcji czasu. Ponownie, jeśli masz pytania dotyczące tego, co robi skrypt, prawdopodobnie możesz odpowiedzieć na nie samodzielnie po zapoznaniu się z jego działaniem. Starałem się, aby kod był jak najbardziej czytelny i prosty.

Musisz uważać, gdy skrypt wskazuje, że **Rozpoczęto nagrywanie**. Po wyświetleniu tego komunikatu należy nacisnąć i przytrzymać przez około sekundę jeden z przycisków na słuchawce. Pamiętaj, aby trzymać go blisko odbiornika. Gdy skrypt zakończy nagrywanie, użyje matplotlib do wykreślenia graficznego kształtu fali sygnału, który otrzymał w okresie nagrywania. Pamiętaj, że jeśli jesteś połączony z Pi za pomocą klienta SSH, takiego jak PuTTY, musisz również otworzyć aplikację X11, aby umożliwić wyświetlanie przebiegu. Do tego używam xMing (i do innych rzeczy, takich jak zdalne pulpity do mojego Pi). Aby umożliwić wyświetlenie wykresu, po prostu uruchom xMing przed uruchomieniem skryptu i poczekaj na pojawienie się wyników.

Gdy pojawi się okno matplotlib, obszar zainteresowania na wykresie powinien być dość oczywisty. Możesz użyć elementów sterujących na dole okna, aby powiększyć, aż będziesz w stanie wychwycić wzloty i upadki sygnału przesyłanego przez słuchawkę, gdy przycisk był wciśnięty. Zobacz powyższy obrazek jako przykład pełnego kodu. Sygnał będzie prawdopodobnie składał się z bardzo krótkich impulsów oddzielonych podobnymi okresami czasu, w których nie jest odbierany żaden sygnał. Po tym bloku krótkich impulsów prawdopodobnie nastąpi dłuższy okres, w którym nic nie zostanie odebrane, po czym wzór się powtórzy. Po zidentyfikowaniu wzorca należącego do pojedynczego wystąpienia kodu, zrób taki zrzut ekranu u góry tej strony i przejdź do następnego kroku, aby go zinterpretować.

Krok 3: Transkrypcja otrzymanego sygnału

Transkrypcja sygnału wynikowego
Transkrypcja sygnału wynikowego

Teraz, gdy już zidentyfikowałeś blok okresowych maksimów i minimów odpowiadający sygnałowi danego przycisku, będziesz potrzebować sposobu na jego przechowywanie i interpretację. W powyższym przykładzie sygnału zauważysz, że istnieją tylko dwa unikalne wzorce, które składają się na cały blok sygnału. Czasami widzisz krótki szczyt, po którym następuje długi dołek, a czasami jest odwrotnie – długi szczyt, po którym następuje krótki dołek. Podczas transkrypcji moich sygnałów zdecydowałem się zastosować następującą konwencję nazewnictwa:

1 = krótko włączone + długie_wyłączone0 = długie_ włączone + krótkie_wyłączone

Spójrz ponownie na oznaczony przebieg, a zobaczysz, o co mi chodzi. Po zidentyfikowaniu równoważnych wzorców w swoim sygnale, wszystko co musisz zrobić, to policzyć jedynki i zera, aby zbudować sekwencję. Po transkrypcji powyższy sygnał można zapisać w następujący sposób:

1111111111111010101011101

Teraz wystarczy powtórzyć ten proces, aby nagrać i przepisać sygnały odpowiadające innym przyciskom na słuchawce, i zakończyłeś pierwszą część procesu!

Zanim będzie można ponownie wysłać sygnały za pomocą nadajnika, jest jeszcze trochę do zrobienia. Czas pomiędzy szczytami i dołkami odpowiadającymi 1 lub 0 jest bardzo ważny i musisz upewnić się, że wiesz, jak długo faktycznie trwa 'short_on' lub 'long_off'. W przypadku moich kodów były trzy informacje o taktowaniu, które musiałem wyodrębnić, aby zreplikować sygnały:

  • Czas trwania „krótkiego” interwału, tj. początek 1 lub koniec 0.
  • Czas trwania „długiego” interwału, tj. koniec 1 lub początek 0.
  • Czas trwania „wydłużonego” interwału. Zauważyłem, że kiedy przytrzymywałem przycisk na słuchawce, był okres „extended_off” między każdym powtórzonym wystąpieniem bloku sygnału. To opóźnienie jest używane do synchronizacji i ma ustalony czas trwania.

Aby określić te wartości czasu, możesz użyć funkcji powiększenia w oknie matplotlib, aby powiększyć do końca i umieścić kursor nad odpowiednimi częściami sygnału. Odczyt położenia kursora na dole okna powinien umożliwić określenie, jak szeroka jest każda część sygnału, która odpowiada długiemu, krótkiemu lub wydłużonemu interwałowi. Zauważ, że oś x wykresu reprezentuje czas, a składnik x odczytu kursora jest wyrażony w sekundach. Dla mnie szerokości były następujące (w sekundach):

  • krótkie_opóźnienie = 0,00045
  • long_delay = 0.00090 (dwukrotnie dłuższy niż 'krótki')
  • rozszerzone_opóźnienie = 0,0096

Krok 4: Konfiguracja jednostki nadajnika

Konfiguracja modułu nadajnika
Konfiguracja modułu nadajnika

Po zebraniu kodów i danych dotyczących czasu możesz odłączyć odbiornik, ponieważ nie będziesz już go potrzebować. Następnie możesz podłączyć nadajnik bezpośrednio do odpowiednich pinów Pi GPIO, jak pokazano na powyższym obrazku. Odkryłem, że styki na jednostkach nadajnika są oznakowane, co ułatwia ten proces.

W takim przypadku można zasilać urządzenie za pomocą zasilania 5 V z Pi, ponieważ pin DATA nie będzie wysyłał sygnałów do Pi, tylko je odbierał. Ponadto zasilacz 5V zapewni większy zasięg transmisji niż przy użyciu zasilacza 3v3. Ponownie możesz podłączyć pin DATA do dowolnego odpowiedniego pinu na Pi. Użyłem pinu 23 (tego samego co do odbiornika).

Inną rzeczą, którą polecam, jest dodanie anteny do małego otworu w prawym górnym rogu nadajnika. Użyłem kawałka prostego drutu o długości 17 cm. Niektóre źródła zalecają zwinięty drut o podobnej długości. Nie jestem pewien, co jest lepsze, ale prosty przewód zapewnia wystarczający zasięg, abym mógł włączać/wyłączać gniazdka z dowolnego miejsca w moim małym mieszkaniu. Najlepiej jest przylutować antenę, ale właśnie usunąłem trochę plastiku z przewodu i owinąłem miedź przez otwór.

Po podłączeniu nadajnika konfiguracja sprzętu jest zakończona! Jedyne, co pozostało do zrobienia, to rozstawić gniazdka w domu i przyjrzeć się programowi nadajnika.

Krok 5: Przesyłanie sygnałów za pomocą Pi

W tym miejscu wkracza drugi skrypt Pythona. Został zaprojektowany tak, aby był tak prosty jak pierwszy, jeśli nie bardziej. Ponownie pobierz go i przejrzyj kod. Będziesz musiał edytować skrypt, aby przesyłał prawidłowe sygnały zgodnie z danymi zarejestrowanymi w kroku 3, więc teraz jest dobry moment, aby rzucić na niego okiem.

Biblioteki potrzebne do uruchomienia tego skryptu zostały wstępnie zainstalowane na moim Pi, więc dalsza instalacja nie była potrzebna. Są one wymienione na górze skryptu:

czas importu

import sys import RPi. GPIO jako GPIO

Pod importem biblioteki znajdują się informacje, które będziesz musiał edytować. Oto jak to wygląda domyślnie (jest to informacja odpowiadająca moim gniazdom określona w kroku 3):

a_on = '11111111111110101001011101'

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

Tutaj mamy osiem ciągów kodów (dwa dla każdej pary przycisków włączania/wyłączania na mojej słuchawce – możesz mieć więcej lub mniej kodów), po których następują trzy fragmenty informacji o czasie, również określone w kroku 3. Poświęć trochę czasu, aby upewnić się, że masz wpisał te informacje poprawnie.

Gdy będziesz zadowolony z kodów/opóźnień wprowadzonych do skryptu (możesz zmienić nazwy zmiennych ciągu kodu, jeśli chcesz), jesteś gotowy do wypróbowania systemu! Zanim to zrobisz, spójrz na funkcję transmit_code() w skrypcie. W tym miejscu zachodzi rzeczywista interakcja z nadajnikiem. Ta funkcja oczekuje, że jeden z ciągów kodu zostanie przesłany jako argument. Następnie otwiera zdefiniowany pin jako wyjście GPIO i przechodzi przez każdy znak w ciągu kodu. Następnie włącza lub wyłącza nadajnik zgodnie z wprowadzonymi informacjami o czasie, aby zbudować przebieg pasujący do ciągu kodu. Wysyła każdy kod wiele razy (domyślnie 10), aby zmniejszyć ryzyko jego pominięcia, i pozostawia wydłużone opóźnienie między każdym blokiem kodu, podobnie jak w słuchawce.

Aby uruchomić skrypt, możesz użyć następującej składni polecenia:

Python TransmitRF.py kod_1 kod_2 …

Możesz przesłać wiele ciągów kodu za pomocą jednego uruchomienia skryptu. Na przykład, aby włączyć gniazda (a) i (b) oraz wyłączyć gniazdo (c), uruchom skrypt za pomocą następującego polecenia:

python TransmitRF.py a_on b_on c_off

Krok 6: Uwaga dotycząca dokładności pomiaru czasu

Jak wspomniano, czas pomiędzy przesyłanymi impulsami włączania/wyłączania jest dość ważny. Skrypt TransmitRF.py używa funkcji time.sleep() Pythona do budowania przebiegów z prawidłowymi interwałami impulsów, ale należy zauważyć, że ta funkcja nie jest całkowicie dokładna. Długość, przez którą skrypt czeka przed wykonaniem następnej operacji, może zależeć od obciążenia procesora w danej chwili. To kolejny powód, dla którego TransmitRF.py wysyła każdy kod wielokrotnie - na wypadek, gdyby funkcja time.sleep() nie była w stanie poprawnie skonstruować danej instancji kodu.

Osobiście nigdy nie miałem problemów z time.sleep(), jeśli chodzi o wysyłanie kodów. Wiem jednak, że mój time.sleep() ma zwykle błąd około 0,1 ms. Ustaliłem to za pomocą dołączonego skryptu SleepTest.py, którego można użyć do oszacowania, jak dokładna jest funkcja time.sleep() twojego Pi. W przypadku moich konkretnych zdalnie sterowanych gniazd, najkrótsze opóźnienie, które musiałem wdrożyć, to 0,45 ms. Jak powiedziałem, nie miałem problemów z niereagującymi gniazdami, więc wydaje się, że 0,45 ± 0,1 ms jest wystarczająco dobre.

Istnieją inne metody zapewnienia dokładniejszego opóźnienia; na przykład możesz użyć dedykowanego układu PIC do generowania kodów, ale takie rzeczy wykraczają poza zakres tego samouczka.

Krok 7: Wniosek

Wniosek
Wniosek

W ramach tego projektu przedstawiono metodę sterowania dowolnym urządzeniem elektrycznym za pomocą Raspberry Pi i zestawu zdalnie sterowanych gniazd 433 MHz, z naciskiem na prostotę i przejrzystość. To najbardziej ekscytujący i elastyczny projekt, do którego używałem mojego Pi, i jest do niego nieskończenie wiele zastosowań. Oto kilka rzeczy, które mogę teraz zrobić dzięki mojemu Pi:

  • Włącz grzejnik elektryczny obok mojego łóżka na pół godziny przed włączeniem budzika.
  • Wyłącz grzejnik godzinę po tym, jak poszedłem spać.
  • Włącz moją lampkę nocną, gdy włączy się budzik, żebym nie zasnęła.
  • i wiele więcej…

Do większości tych zadań używam funkcji crontab w Linuksie. Pozwala to na skonfigurowanie automatycznych zaplanowanych zadań do uruchamiania skryptu TransmitRF.py w określonych godzinach. Możesz także użyć polecenia Linux at, aby uruchomić jednorazowe zadania (które dla mnie musiały zostać zainstalowane osobno za pomocą „sudo apt-get install at”). Na przykład, aby włączyć grzejnik na pół godziny przed alarmem następnego ranka, wystarczy wpisać:

o 05:30

Python TransmitRF.py c_on

Możesz również użyć tego projektu w połączeniu z moim systemem monitorowania domu Dropbox, aby kontrolować urządzenia przez Internet! Dziękujemy za przeczytanie, a jeśli chciałbyś coś wyjaśnić lub podzielić się swoją opinią, napisz komentarz!

Zalecana: