LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

[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]
Inżynier elektronik, absolwent Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. Swoje życie zawodowe i hobby związał z elektroniką i mechatroniką. Specjalizuje się w projektowaniu i utrzymywaniu systemów testowania produkcyjnego w firmie SoMLabs, jest autorem artykułów poświęconych elektronice, programowaniu i systemom wbudowanym (embedded).