[PROJEKT] Czujnik ruchu PIR z wykorzystaniem modHC-SR501
Moduł modHC-SR501 jest czujnikiem zawierającym sensor pasywny podczerwieni (PIR), wraz z soczewką Fresnela oraz układem BIS0001 interpretującym sygnały z fotoelementu. Na zewnątrz modułu wyprowadzone jest złącze 3-pinowe, przez które układ jest zasilany oraz podaje stan logiczny odpowiadający wykryciu ruchu obiektu. Dwa potencjometry służą do regulacji czułości oraz czasu opóźnienia przed następnym załączeniem przy wykryciu ruchu, zaś przy pomocy zworki na płytce można przełączyć tryb wyzwalania.
Układ ten podłączony jest do płytki testowej ZL2AVR v.2 zawierającej mikrokontroler Atmel ATMEGA8A. W projekcie został także użyty moduł KamodRPi PwrRelay, z którego wykorzystano jeden przekaźnik do załączania obciążenia (np. lampki biurkowej).
Moduł modHC-SR501 po wykryciu ruchu wystawia stan logiczny „1” na złącze OUT. Układ ten zasilany jest z napięcia 5 V, zaś dzięki wbudowanemu stabilizatorowi pracuje na napięciu 3.3 V (takie też napięcie odpowiada stanowi logicznej jedynki). Sygnał logiczny z czujnika ruchu jest doprowadzony do linia D.2 mikrokontrolera, który obsługuje w przerwaniu pojawienie się zbocza narastającego na tej linii, a także odczytuje wartość napięcia na ślizgaczu potencjometru (linia C.0) i steruje pracą diody, dołączonej do linii D.1.
Moduł PwrRelay jest podłączony do linii D.3 i przy pojawieniu się na tym pinie stanu wysokiego następuje załączenie przekaźnika. Z modułu jest także wyprowadzone złącze służące do dołączenia obciążenia – może pracować zarówno w stanie NO, jak i NC, załączając lub odłączając odbiornik po wykryciu ruchu. Jako przykładowe obciążenie zastosowano lampkę biurkową z zasilaczem 230 VAC / 12 VAC. Moduł z przekaźnikiem jest włączony pomiędzy zasilacz i lampkę.
Program sterujący napisany został w języku Bascom AVR. Na początku są deklarowane parametry pracy mikrokontrolera, w tym częstotliwość taktująca, konfiguracja wejść/wyjść, parametry pracy przetwornika ADC oraz ustawienie i uruchomienie przerwań. Odpowiedzialny za to fragment programu został przedstawiony na listingu 1.
Listing 1. Konfiguracja podstawowych parametrów pracy
[bascomavr] $regfile = "m8adef.dat" $crystal = 8000000 Config Pind.2 = Input Config Pind.3 = Output Config Pind.1 = Output Config Int0 = Rising Enable Interrupts On Int0 Przerwanie Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Czujnik Alias Pind.2 Przekaznik Alias Portd.3 Led Alias Portd.1 Dim Alarm As Bit Dim Czas As Word Dim Wartosc As Word Set Led Reset Przekaznik Enable Int0 [/bascomavr]
W dalszej części programu wykonywane są czynności w pętli Do…Loop. Przy pomocy przetwornika ADC mierzona jest wartość napięcia z potencjometru, podana jako wartość 10-bitowa, która po podzieleniu przez 4 uzyskuje wartości z przedziału 0…255. Służy ona do ustalania czasu działania przekaźnika – po wykryciu ruchu przekaźnik jest załączany, zaś w pętli głównej liczony jest czas (w przybliżeniu 1 sekunda na wykonanie pętli). Jeśli czas ten przekroczy wartość ze zmiennej Wartosc, nastąpi wyłączenie przekaźnika.
Wystąpienie przerwania ustawia wartość Alarm = 1 – ta zostaje każdorazowo sprawdzona w pętli głównej i jeśli zostanie wykryta, wykonywane jest kasowanie licznika czasu i zerowanie wartości alarmu. Dzięki temu przekaźnik pozostanie włączony tak długo, jak wykrywany będzie ruch oraz zliczony czas będzie mniejszy od wartości ustawionej potencjometrem. Pętlę Do…Loop przedstawiono na listingu 2.
Listing 2. Pętla główna programu
[bascomavr] Do Wartosc = Getadc(0) Wartosc = Wartosc / 4 If Alarm = 1 Then Alarm = 0 Czas = 0 End If If Czas > Wartosc Then Reset Przekaznik End If Incr Czas Wait 1 Loop [/bascomavr]
Obsługa zbocza narastającego, pojawiającego się w momencie wykrycia ruchu na linii D.2 mikrokontrolera jest wykonywana w przerwaniu zewnętrznym INT0 – procedura obsługi tego przerwania jest pokazana na listingu 3. Wyłączona zostaje obsługa przerwania, by uniknąć błędów w działaniu wskutek, np. zakłóceń, które mogłyby spowodować pozostanie w przerwaniu przez zbyt długi czas. Następnie ustawiona zostaje wartość Alarm = 1, która sprawdzana jest w pętli głównej i przekazuje informację o wykryciu ruchu. Równocześnie, za pomocy instrukcji Pulseout, generowany jest krótki błysk diody świecącej, by zasygnalizować, że wykryto ruch i licznik czasu zostanie wyzerowany. Załączony zostaje przekaźnik w module PwrRelay, zaś po krótkiej zwłoce kasowany jest rejestr flagi przerwania (w którym mogła pojawić się wartość od momentu wyłączenia przerwań, np. wskutek zakłócenia – bez skasowania rejestru flagi przerwanie mogłoby się powtórzyć w momencie odblokowania INT0). Po odblokowaniu przerwania następuje powrót do pętli głównej.
Listing 3. Przerwanie zewnętrzne INT0
Przerwanie:
[bascomavr] Przerwanie: Disable Int0 Alarm = 1 Pulseout Portd , 1 , 100000 Set Przekaznik Waitms 50 Gifr = &B01000000 Enable Int0 Return [/bascomavr]
Pełny kod programu:
[bascomavr] $regfile = "m8adef.dat" $crystal = 8000000 Config Pind.2 = Input Config Pind.3 = Output Config Pind.1 = Output Config Int0 = Rising Enable Interrupts On Int0 Przerwanie Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Czujnik Alias Pind.2 Przekaznik Alias Portd.3 Led Alias Portd.1 Dim Alarm As Bit Dim Czas As Word Dim Wartosc As Word Set Led Reset Przekaznik Enable Int0 Do Wartosc = Getadc(0) Wartosc = Wartosc / 4 If Alarm = 1 Then Alarm = 0 Czas = 0 End If If Czas > Wartosc Then Reset Przekaznik End If Incr Czas Wait 1 Loop Przerwanie: Disable Int0 Alarm = 1 Pulseout Portd , 1 , 100000 Set Przekaznik Waitms 50 Gifr = &B01000000 Enable Int0 Return [/bascomavr]