Spisu treści:

Dekoder czujnika Arduino RF: 5 kroków
Dekoder czujnika Arduino RF: 5 kroków

Wideo: Dekoder czujnika Arduino RF: 5 kroków

Wideo: Dekoder czujnika Arduino RF: 5 kroków
Wideo: Kurs Arduino #4: DHT11/DHT22 - Czujnik temperatury i wilgotności + Stacja pogodowa 2024, Lipiec
Anonim
Dekoder czujnika Arduino RF
Dekoder czujnika Arduino RF

Mój poprzedni dom miał preinstalowany system bezpieczeństwa, który miał czujniki drzwi, czujnik ruchu i panel sterowania. Wszystko było na stałe podłączone do dużej skrzynki z elektroniką w szafie i były instrukcje podłączenia telefonu stacjonarnego, aby automatycznie wybierał numer w przypadku alarmu. Kiedy próbowałem się z nim bawić, odkryłem, że jeden z czujników drzwi był niekompletnie zainstalowany, a drugi był przerywany z powodu niewłaściwego wyrównania. Tyle jeśli chodzi o profesjonalną instalację reklamowaną na wizytówce firmy ochroniarskiej. Moim rozwiązaniem w tamtym czasie było kupienie kilku internetowych kamer bezpieczeństwa i taniego bezprzewodowego alarmu bezpieczeństwa.

Przewiń do dzisiaj i ten bezprzewodowy alarm leży w pudełku w mojej piwnicy. Po nabyciu taniego odbiornika RF postanowiłem sprawdzić, czy mogę odkodować wiadomości przesyłane przez różne czujniki alarmowe i piloty, które posiadam. Pomyślałem, że skoro wszyscy pracowali z tanią skrzynką alarmową, wszyscy muszą używać tego samego formatu wiadomości z tylko innym identyfikatorem. Szybko dowiedziałem się, że są one podobne jedynie w ogólnej strukturze wiadomości. Tak więc projekt szybko przeszedł od banalnego do bardzo interesującego.

Krok 1: Moduły czujników

Moduły czujników
Moduły czujników
Moduły czujników
Moduły czujników
Moduły czujników
Moduły czujników
Moduły czujników
Moduły czujników

Jak widać na zdjęciach powyżej, nadajniki zawierają czujniki otwarcia drzwi, czujniki ruchu, piloty do uzbrojenia oraz bezprzewodową klawiaturę służącą do programowania skrzynki alarmowej. Jak się okazuje, żadne dwa z tych urządzeń nie używają tej samej długości synchronizacji lub czasu trwania bitów. Jedyną cechą wspólną, inną niż długość wiadomości, jest podstawowy format bitów. Każdy bit zajmuje ustalony okres czasu, przy czym różnica między zerem a jedynką stanowi cykl pracy części o wysokiej/niskiej wartości.

Ładna fala pokazana powyżej NIE jest tym, co po raz pierwszy otrzymałem. Ponieważ w paśmie częstotliwości 433 MHz jest tak duży ruch, musiałem upewnić się, że aktywowałem czujnik tuż przed ustawieniem oscyloskopu na pojedynczy wyzwalacz. Na szczęście czujniki po aktywacji wysyłają kilka kopii wiadomości danych, a piloty i klawiatura kontynuują wysyłanie wiadomości tak długo, jak długo naciskany jest klawisz. Korzystając z zakresu, udało mi się określić długość synchronizacji i czas trwania bitów danych dla każdego elementu. Jak wspomniano wcześniej, czasy synchronizacji są różne, a czasy bitów są różne, ale wszystkie formaty wiadomości mają synchronizację niskiego poziomu, po której następują 24 bity danych i jeden bit stopu. To wystarczyło, abym był w stanie zbudować ogólny dekoder w oprogramowaniu bez konieczności kodowania na stałe wszystkich różnych szczegółów dla każdego urządzenia.

Krok 2: Sprzęt

Sprzęt komputerowy
Sprzęt komputerowy
Sprzęt komputerowy
Sprzęt komputerowy

Pierwotnie zbudowałem dekoder czujnika przy użyciu mikrokontrolera PIC i języka asemblera. Ostatnio bawiłem się wariantami Arduino, więc pomyślałem, że zobaczę, czy uda mi się to powtórzyć. Prosty schemat pokazany jest powyżej, jest też zdjęcie mojego prototypu. Wszystko, co zrobiłem, to użyć trzech wspólnych przewodów połączeniowych, aby przejść z Arduino Nano do płytki odbiornika RF. Zasilanie i pojedyncza linia danych to wszystko, co jest potrzebne.

Jeśli przeczytasz mój Instructable na „Wyświetlaczu czasu i pogody 3 w 1”, zobaczysz, że używam wspólnego odbiornika RXB6, 433 MHz. Być może uda Ci się uzyskać naprawdę tanie odbiorniki do pracy na krótkim zasięgu potrzebnym do tego projektu, ale nadal polecam używanie odbiornika superheterodynowego.

Krok 3: Oprogramowanie

Oprogramowanie konwertuje odebrane bity na możliwe do wyświetlenia znaki ASCII. Wyprowadza wartość długości synchronizacji oraz długości bitów 1 i 0. Ponieważ znałem już długości synchronizacji i formaty bitowe, mogłem napisać oprogramowanie specjalnie dla nich. Zamiast tego postanowiłem sprawdzić, czy mogę to napisać, aby uporządkować długości synchronizacji i automatycznie obliczyć bity danych. Powinno to ułatwić modyfikację na wypadek, gdybym chciał kiedyś spróbować wykryć inne formaty. Należy zauważyć, że oprogramowanie nie wie, czy pierwszy bit wiadomości to 1 czy 0. Zakłada, że jest to 1, ale jeśli stwierdzi, że powinno to być zero, odwróci bitów w ukończonej wiadomości przed wysłaniem jej przez port szeregowy.

Czasy impulsu synchronizacji i bitów danych są określane za pomocą wejścia zewnętrznego przerwania INT0 do wyzwalania obsługi przerwań. INT0 może wyzwalać się przy wzroście, spadku lub obu krawędziach, lub przy stałym niskim poziomie. Oprogramowanie zostaje przerwane na obu krawędziach i mierzy czas, przez jaki impuls pozostaje niski. Upraszcza to, ponieważ początek/synchronizacja wiadomości jest impulsem niskiego poziomu, a bity można określić na podstawie ich czasu niskiego poziomu.

Procedura obsługi przerwań najpierw określa, czy przechwycona liczba jest wystarczająco długa, aby być impulsem startu/synchronizacji. Różne urządzenia, których używam, używają impulsów synchronizacji o długości 4, 9, 10 i 14 milisekund. Instrukcje define dla min./maks. dozwolonych wartości synchronizacji znajdują się na początku w oprogramowaniu i są obecnie ustawione na 3 i 16 milisekund. Czasy bitów również różnią się między czujnikami, więc algorytm dekodowania bitów musi to uwzględniać. Czas bitu pierwszego bitu jest zapisywany tak samo, jak czas kolejnego bitu, który znacznie różni się od bitu pierwszego. Bezpośrednie porównanie kolejnych czasów bitów nie jest możliwe, dlatego stosowana jest definicja „współczynnika fudge” („Variation”). Dekodowanie bitów rozpoczyna się od założenia, że pierwszy bit danych jest zawsze rejestrowany jako logiczna 1. Wartość ta jest zapisywana, a następnie używana do testowania kolejnych bitów. Jeśli kolejna liczba bitów danych mieści się w oknie wariancji zapisanej wartości, to jest również rejestrowana jako logiczna 1. Jeśli znajduje się poza oknem wariancji zapisanej wartości, jest rejestrowana jako logiczne 0. Jeśli logiczne 0 czas bitowy jest krótszy niż czas pierwszego bitu, wtedy ustawiana jest flaga informująca oprogramowanie, że bajty muszą zostać odwrócone przed wyświetleniem. Jedynym przypadkiem, w którym ten algorytm zawodzi, jest sytuacja, gdy wszystkie bity w wiadomości są zerami. Możemy zaakceptować to ograniczenie, ponieważ tego rodzaju przesłanie jest bez znaczenia.

Wszystkie czujniki, które mnie interesują, mają długość komunikatu 24 bity danych, ale oprogramowanie nie jest ograniczone do tej długości. Istnieje bufor na maksymalnie siedem bajtów (można dodać więcej) i określa minimalną i maksymalną długość wiadomości w bajtach. Oprogramowanie jest skonfigurowane do zbierania bitów, konwertowania ich na bajty, tymczasowego przechowywania, a następnie wysyłania ich w formacie ASCII przez port szeregowy. Zdarzeniem wyzwalającym wyjście komunikatu jest odebranie nowego impulsu start/synchronizacji.

Krok 4: Rejestrowanie danych

Rejestracja danych
Rejestracja danych

Oprogramowanie jest skonfigurowane do wysyłania przekonwertowanych danych jako znaków ASCII za pośrednictwem wyjścia szeregowego (TX) Arduino. Kiedy stworzyłem wersję PIC, musiałem połączyć się z programem terminala na komputerze w celu wyświetlenia danych. Jedną z zalet Arduino IDE jest to, że ma wbudowaną funkcję Serial Monitor. Ustawiam szybkość portu szeregowego na 115,2 k, a następnie ustawiam okno Serial Monitor na tę samą szybkość. Zrzut ekranu tutaj pokazuje typowy wyświetlacz z wyjściami z różnych czujników, które mam. Jak widać, dane czasami nie są idealne, ale łatwo można określić, jaka powinna być rzeczywista wartość każdego czujnika.

Krok 5: Przykładowe oprogramowanie odbiornika

Przykładowe oprogramowanie odbiornika
Przykładowe oprogramowanie odbiornika

Dołączyłem przykładowy wykaz oprogramowania, który pokazuje, w jaki sposób możesz wykorzystać zebrane informacje, aby otrzymać określony zestaw kodów do swojej aplikacji. Ten przykład jest skonfigurowany do emulacji jednego z moich zdalnych gniazd Etekcity. Jedno polecenie włącza diodę LED wbudowaną w Nano (D13), a drugie polecenie wyłącza diodę LED. Jeśli nie masz wbudowanej diody LED w Arduino, dodaj rezystor i diodę LED, jak pokazano na schemacie. W prawdziwej aplikacji ta funkcja włącza/wyłącza zasilanie gniazdka elektrycznego (za pomocą przekaźnika lub triaka). Czasy synchronizacji, czasy bitów i oczekiwane bajty danych są zdefiniowane z góry w celu ułatwienia modyfikacji. Możesz użyć dowolnej z pozostałych linii danych, aby włączyć/wyłączyć itp. dla swojej konkretnej aplikacji. Wystarczy dodać odpowiedni kod polecenia, który definiuje i zamienić logikę włączania/wyłączania diody LED w „pętli”, aby dopasować ją do swoich potrzeb.

Zalecana: