- urządzenie wytwarza wiązkę modulowanego świata podczerwonego (IR),
- zintegrowany nadajnik i odbiornik wiązki IR,
- przełączenie styków przekaźnika po odbiciu wiązki IR lub jej przecięciu,
- dwa tryby pracy wybierane zworką: odbiciowy i transmisyjny,
- zasilanie 12 V.
Najprostszym rozwiązaniem automatycznego załączenia oświetlenia jest użycie gotowego czujnika ruchu. Niestety, mają one wyjścia monostabilne, załączane na ustawiony czas.
W niektórych sytuacjach jest to bardzo irytujące – na przykład, w piwnicy (podczas dłuższych poszukiwań) albo w toalecie.
Zaprezentowany układ działa bistabilnie, czyli zmienia stan przekaźnika pod wpływem określonego bodźca. W każdym ze stanów (zwarty lub rozwarty) może trwać dowolnie długo.
W przeciwieństwie do zwykłych czujników ruchu, wysyła wiązkę światła IR i oczekuje jej odbicia lub przecięcia. Dlatego można wybrać jeden z dwóch trybów pracy: odbiciowy albo transmisyjny. Nadajnik (dioda LED świecąca w podczerwieni) oraz odbiornik, tworzą bramkę optoelektroniczną.
Zasadę działania obu trybów pokazuje rysunek 1. W trybie odbiciowym, nadajnik światła i czujnik są umieszczone obok siebie, a ich czoła są skierowane w przestrzeń. Pojawienie się dostatecznie blisko obiektu o odpowiednio dużych gabarytach powoduje odbicie części emitowanego światła w kierunku odbiornika.
Tryb transmisyjny polega na stałej widoczności między nadajnikiem a odbiornikiem, gdyż są umieszczone naprzeciw siebie. Nadajnik wysyła do odbiornika impulsy, zaś ten odbiera każdy z nich. Nadejście obiektu, który na chwilę przerwie tę „rozmowę”, jest interpretowane jako konieczność zmiany stanu przekaźnika.
Oba stany pracy mają swoje wady oraz zalety. Niewątpliwą zaletą trybu odbiciowego jest umieszczenie nadajnika i odbiornika obok siebie, w jednej obudowie. Mogą za to wystąpić problemy, jeżeli nadzorowane przejście jest bardzo szerokie – człowiek, który przejdzie przez nie daleko od elementów optoelektronicznych, może zostać przez nie niezauważony. Tryb transmisyjny nie ma tego ograniczenia, ponieważ dystans między nadajnikiem a odbiornikiem może wynieść 2 m lub więcej. Niestety, wiąże się to z koniecznością dołączenia dodatkowego przewodu dla odbiornika.
Można zmodyfikować tryb transmisyjny poprzez pozostawienie nadajnika i odbiornika obok siebie, ale z lusterkiem umieszczonym na przeciwległej ścianie (rysunek 2). Jest to pewne rozwiązanie, ale również nie do końca idealne. Zaparowanie, przekrzywienie lub zabrudzenie lusterka spowoduje „oślepnięcie” układu.
Budowa i działanie
Schemat ideowy całego układu został pokazany na rysunku 3. Zasilanie dla półprzewodnikowej części tego urządzenia stabilizuje układ US1 – zwykły stabilizator liniowy 78M05, ponieważ pobór prądu z jego wyjścia jest niewielki. Dioda D1 zabezpiecza urządzenie przed uszkodzeniem w przypadku odwrotnego podłączenia zasilania.
Wyjściem układu są styki przekaźnika PK1. Jego cewka jest sterowana przez tranzystor T1, którego pojemność bramka-źródło jest rozładowywana przez rezystor R2. Świecenie diody LED1 sygnalizuje załączenie cewki przekaźnika i oznacza zwarcie jego styków.
Iskrzenie powstające na stykach w momencie ich przełączania może być źródłem zakłóceń elektromagnetycznych o charakterze impulsowym. Są one szczególnie groźne dla mikrokontrolerów, ponieważ łatwo zaburzają ich pracę, powodując np. zawieszenie programu. Gasik RC, złożony z elementów R3 i C6, redukuje iskrzenie, a w efekcie również ogranicza energię zakłóceń.
Elementem zarządzającym pracą układu jest popularny, tani i dobrze znany mikrokontroler ATtiny13A. Ma tylko 1 kB pamięci Flash, ale to wystarczająca ilość na potrzeby tego projektu.
Do jego zaprogramowania, metodą ISP, służy złącze J3. Nieużywane wyprowadzenia są podciągnięte przy użyciu rezystorów, aby ustalić ich stan logiczny.
Nadajnikiem wiązki podczerwieni jest pojedyncza dioda LED typu L53F3C. Długość fali emitowanego światła wynosi 940 nm, co niemal idealnie wpasowuje się w maksimum czułości zastosowanego odbiornika (950 nm). Nie ma przeszkód, by użyć innej diody, ale o tej samej lub zbliżonej długości fali emitowanego światła podczerwonego. Tranzystor T2 załącza diodę LED2, a połączone równolegle rezystory R8 i R9 ograniczają jej prąd. Zadaniem kondensatora C7 jest zmniejszenie tętnień prądu pobieranego ze stabilizatora.
Odbiornik podczerwieni to specjalizowany do tego celu układ TSOP4836 produkcji Vishay. Reaguje na zmodulowany sygnał o częstotliwości nośnej 36 kHz. Elementy R13, C8 i C9 filtrują dla niego zasilanie, co czyni jego pracę bardziej stabilną. Pobór prądu przez ten układ nie przekracza 1 mA, więc rezystor o wartości 220 Ω nie wprowadzi zauważalnego spadku napięcia.
Ponieważ czujnik może zostać odcięty od głównej płytki i wyprowadzony na przewodach, zadbano o odpowiednie tłumienie zakłóceń, jakie mogą zaindukować się w długich przewodach.
Diody D3 i D4 ograniczają ich amplitudę, a rezystory R10, R11 i R14 zwiększają czas narastania napięcia i ograniczają prąd diod zabezpieczających – przy czym rezystor R10 jest przeznaczony dla diod wbudowanych w mikrokontroler. Złącza J4 i J5 umożliwiają połączenie czujnika z płytką główną, o czym dalej.
Montaż i uruchomienie
Układ został zmontowany na dwustronnej płytce drukowanej o wymiarach 80×30 mm, przy czym część o wymiarach 10×30 mm jest przeznaczona na czujnik i może zostać odcięta wzdłuż przerywanej linii. Wzór ścieżek tej płytki oraz jej schemat montażowy został pokazany na rysunku 4. W odległości 3 mm od krawędzi głównej części płytki znalazły się otwory montażowe o średnicy 3,2 mm, a w części z czujnikiem jeszcze jeden, gdyby zaszła potrzeba jego przykręcenia.
Montaż rozpoczynamy od przylutowania elementów w obudowach SMD, które znajdują się tylko na wierzchniej stronie płytki. Potem można przejść do wlutowania podzespołów w obudowach przewlekanych, według rosnącej ich wysokości. Montaż złącz J4 i J5 nie jest konieczny, o ile od płytki nie będzie odcięty czujnik. Na samym końcu proponuję wlutować diodę LED2 i układ US3 – na możliwie długich wyprowadzeniach, jak na fotografii tytułowej. Wypukła soczewka układu US3 powinna być skierowana „na zewnątrz” płytki, w stronę krawędzi.
Jeżeli montaż przebiegł poprawnie, do złącza J1 można podłączyć zasilanie w postaci napięcia stałego o wartości 12 V lub zbliżonej, a do J3 programator mikrokontrolerów AVR obsługujący ISP. Nowa wartość fuse bitów to:
High Fuse = 0xF9
Low Fuse = 0x7A
Spowoduje to wyłączenie preskalera zegara. Ponadto, ustawi BOD (Brown-Out Detector) na napięcie 4,3 V, co zmniejsza ryzyko zawieszenia się układu w trakcie włączania zasilania, zwłaszcza narastającego powoli. Szczegóły konfiguracji zostały pokazane na rysunku 5, który zawiera widok okna konfiguracji bitów zabezpieczających programu AVR-Burn-O-Mat. Oprócz tego, trzeba też zaprogramować pamięć programu dostarczonym wsadem.
Na złącze J3 można nałożyć zworkę, o czym skrótowo informują napisy na płytce. Kiedy jej nie ma, układ pracuje w trybie odbiciowym (REFLECT). Po jej założeniu, na wyprowadzenia leżące najbliżej złącza J1, układ przechodzi w tryb transmisyjny (TRANSMIT).
W trybie odbiciowym, jak i transmisyjnym z użyciem lusterka, może wystąpić niekorzystne zjawisko bezpośredniego oświetlania odbiornika przez diodę nadawczą, co czyni układ niewrażliwym na otoczenie. Można to wyeliminować poprzez dobór rezystorów R8 i R9. W układzie prototypowym uzyskano dobre wyniki po zastąpieniu ich przez jeden rezystor o wartości 820 Ω. Warto również osłonić diodę nadawczą poprzez nałożenie na nią odcinka rurki termokurczliwej, aby ograniczyć promieniowanie światła na boki.
Pobór prądu przez układ prototypowy, z wartościami elementów jak na schemacie, wynosi około 12 mA w stanie spoczynku i około 42 mA po załączeniu przekaźnika, przy zasilaniu napięciem 12 V. Można go przystosować do napięcia 24 V – wystarczy wymienić przekaźnik PK1 na identyczny model, ale z cewką przystosowaną do tego napięcia. Inne zmiany nie są potrzebne.
Po włączeniu zasilania, przekaźnik jest wyłączony, a układ sonduje otoczenie zgodnie z ustawionym trybem pracy. Po wykryciu odbicia lub przecięcia wiązki, przekaźnik przełącza się, a układ na niedługi czas od tego zdarzenia, wynoszący 500 ms, przestaje reagować na cokolwiek. Ma to na celu zapobieganie przełączaniu pod wpływem np. włączającego się oświetlenia.
Ponowna zmiana stanu styków przekaźnika będzie możliwa po jednoczesnym spełnieniu dwóch warunków. Pierwszym z nich jest upływ czasu „martwego”. Drugim jest powrót bariery optoelektronicznej do normalnej pracy, tj. bez żadnych obiektów w jej zasięgu. Dzięki temu, zatrzymanie się w drzwiach na dłuższą chwilę nie spowoduje cyklicznego przełączania przekaźnika, ponieważ przeszkoda będzie cały czas „widoczna”.
Proponuję umieścić nadajnik i odbiornik na wysokości rzędu 80…120 cm nad poziomem podłogi pomieszczenia. Umieszczenie ich niżej może powodować dwukrotne zarejestrowanie człowieka w pomieszczeniu, a dokładniej kroczących po kolei jego nóg.
Dla dociekliwych
Kod programu dla mikrokontrolera został napisany w języku C i skompilowany w AVR-GCC przy użyciu popularnego środowiska WinAVR. Znajduje się na listingu 1, a po skompilowaniu zajmuje niecałe 400 B. Jak łatwo zauważyć, użyto w nim funkcji opóźniających typu delay(), ponieważ mikrokontroler nie synchronizuje się z innymi układami, a kod jest dzięki temu znacznie czytelniejszy.
#include <avr/io.h>
#include <util/delay.h>
//załączenie przekaźnika
#define RELAY_ON PORTB|=(1<<PORTB4)
//wyłączenie przekaźnika
#define RELAY_OFF PORTB&=~(1<<PORTB4)
//sterowanie diodą nadawczą
#define IR_OFF PORTB&=~(1<<PORTB0);TCCR0A=0;TCCR0B=0
#define IR_ON TCCR0A=(1<<COM0A0)|(1<<WGM01);TCCR0B=(1<<CS00)
//tryb pracy: odbiciowy
#define MODE_REFLECT bit_is_set(PINB,PINB2)
//tryb pracy: transmisyjny
#define MODE_TRANSMIT bit_is_clear(PINB,PINB2)
//stan wyjścia odbiornika: czy niski?
#define PULSE_LO bit_is_clear(PINB,PINB3)
#define DELAY_LOOP 400 //czas nadawania w mikrosekundach
#define TIMES_LOOP 5 //liczba nadanych "paczek"
//ile powtórzeć pętli jest potrzebne do podjęcia decyzji
#define DECISION 2
//opóźnienie w milisekundach po przełączeniu
#define DELAY_AFTER_CHANGE_STATE 500
//opóźnienie pętli głównej w milisekundach
#define DELAY_MAIN 5
#define OCR_VALUE 121 //dla uzyskania 36kHz
volatile uint8_t loop; //licznik wysłanych "paczek"
//licznik poprawnie odebranych "paczek"
volatile uint8_t counter;
//0 - przekaźnik wyłączony, 1 załączony
volatile uint8_t onoff = 0;
//licznik do podjęcia decyzji o przełączeniu
volatile uint8_t decide_cnt = 0;
//0 - stan spoczynku
//1 - zgoda na przełączenie przekaźnika
//2 - oczekiwanie po przełączeniu przekaźnika
//3 - oczekiwanie na powrót do stanu spoczynku
volatile uint8_t change_state = 0;
//=================================================
int main(void){
DDRB = (1 << DDB4) | (1 << DDB0); //konfiguracja portów
PORTB = (1 << PORTB2);
OCR0A = OCR_VALUE; //ustawienie wartości rejestru OCR0A
while(1){
counter = 0; //przygotowanie zmiennych
loop = TIMES_LOOP;
while(loop){
loop--;
IR_ON; //załączenie diody nadawczej
//oczekiwanie na ustalenie stanu logicznego
//wyjścia odbiornika
_delay_us(DELAY_LOOP);
if(PULSE_LO){ //jeżeli reakcja jest prawidłowa
//inkrementuj licznik poprawnie odebranych "paczek"
counter++;
}
IR_OFF; //wyłącz diodę nadawczą
//oczekiwanie między poszczególnymi "paczkami"
_delay_us(5*DELAY_LOOP);
}
if(MODE_REFLECT){ //w trybie odbiciowym
//jeżeli odebrano prawidłową paczkę impulsów
if(counter == TIMES_LOOP){
//zainkrementuj - z ograniczeniem do nasycenia
if(decide_cnt < DECISION) decide_cnt++;
} else { //jeżeli paczka jest nieprawidłowa
decide_cnt = 0; //wróć do stanu spoczynku
change_state = 0;
}
}
if(MODE_TRANSMIT){ //w trybie transmisyjnym
//jeżeli odebrano nieprawidłową paczkę impulsów
if(counter < TIMES_LOOP){
//zainkrementuj - z ograniczeniem do nasycenia
if(decide_cnt < DECISION) decide_cnt++;
} else { //jeżeli paczka jest prawidłowa
decide_cnt = 0; //wróć do stanu spoczynku
change_state = 0;
}
}
//po podjęciu decyzji o zmianie stanu
if(decide_cnt == DECISION && change_state == 0){
//wyraź zgodę na zmianę stanu przekaźnika
change_state = 1;
}
if(change_state == 1){
//przełączenie przekaźnika w stan przeciwny
onoff ^= 1;
change_state = 2;
}
if(onoff) RELAY_ON;
else RELAY_OFF;
//oczekiwanie po przełączeniu, aby reakcja
//układu była natychmiastowa
if(change_state == 2){
_delay_ms(DELAY_AFTER_CHANGE_STATE);
change_state = 3;
} else {
//w stanie spoczynku ustal odstępy
//między grupami "paczek"
_delay_ms(DELAY_MAIN);
}
}
}
Jedyny licznik dostępny w Attiny13A to Timer0 i służy do generowania sygnału o częstotliwości 36 kHz. Włączając i wyłączając ten licznik można łatwo sterować diodą. Świecenie z odpowiednią częstotliwością powoduje reakcję odbiornika i ustawienie na jego wyjściu stanu niskiego. Istotne jest wyłączenie wyjścia po zatrzymaniu licznika, aby dioda nie świeciła cały czas.
Sprawdzenie otoczenia odbywa się poprzez wysłanie pięciu impulsów IR o długości 400 µs każdy, z odstępami po 2 ms. Ten cykl jest powtarzany co 5 ms. Schematycznie pokazuje to rysunek 6. Strzałki to momenty sprawdzenia stanu wyjścia odbiornika. Zarejestrowanie świecenia diody przez odbiornik to stan niski.
Pięć następujących po sobie odczytów w postaci stanu niskiego to jeden poprawny odbiór. Dwa następujące po sobie odbiory umożliwiają zmianę stanu styków przekaźnika. Jak łatwo zauważyć, w trybie odbiciowym układ czeka na dwa poprawne odbiory, a w transmisyjnym – na dwa niepoprawne.
Odstęp czasowy między grupami impulsów jest wymagany do poprawnego działania odbiornika. Powodem jest automatyczna regulacja wzmocnienia, która ma na celu eliminację zakłóceń pochodzących np. od lamp fluorescencyjnych. Zarówno długość ciągu impulsów nadawanych przez diodę, jak i odstępy między nimi, muszą być odpowiednio dobrane. Z noty katalogowej użytego układu odbiorczego (TSOP4836) dowiadujemy się, że jest typu AGC2. Szczegóły dotyczące tego oznaczenia objaśnia dokument „Circuit Description of the IR Receiver Modules”, opublikowany przez firmę Vishay. Jego fragmenty zostały pokazane na rysunku 7.
Różne typy czujników są odpowiednie nie tylko dla konkretnych długości fali, ale też dla różnych systemów kodowania transmisji, np. RC5, RC6 czy NEC. Pierwsza tabela określa warunki, jakie musi spełniać sygnał, aby układ automatycznej regulacji wzmocnienia (AGC) nie uznał go za zakłócenie. Długość jednego ciągu impulsów może wynosić nie więcej jak 1,8 ms, a odstęp między kolejnymi ciągami musi być, co najmniej, czterokrotnie większy od nich samych.
Druga tabela określa minimalne parametry sygnału, aby prawidłowo zadziałał integrator znajdujący się za filtrem środkowoprzepustowym. Jeden ciąg impulsów musi mieć minimum 10 okresów (czyli, w tym wypadku, musi trwać 0,36 ms), zaś między kolejnymi ciągami muszą być odstępy wynoszące nie mniej niż 12 okresów (0,432 ms).
Jest jeszcze jeden wymóg, dotyczący poprawnego działania automatycznej regulacji progu przerzutu (ATC) komparatora obsługującego wyjście. Powrót do stanu spoczynku zajmuje mu około 10 ms, zaś w tym układzie kolejne sekwencje są nadawane co 5 ms. Nie ma jednak ryzyka nieprawidłowego działania układu z tego powodu, ponieważ próg przerzutu po prostu ustali się na odpowiedniej wartości podczas długotrwałego odbioru impulsów. Zagęszczając zaś kolejne sekwencje uzyskano większą czułość układu na obiekty szybko przemieszczające się, gdyby np. ktoś do pomieszczenia wbiegł lub wjechał.
Michał Kurzela, EP
- R1, R2, R4…R7, R12: 10 kΩ SMD0805
- R3: 33 Ω 2 W THT
- R8, R9: 220 Ω SMD0805 (opis w tekście)
- R10, R11, R13, R14: 220 Ω SMD0805
- C1: 220 µF 35 V raster 3,5 mm
- C2, C3, C5, C9: 100 nF SMD0805
- C4, C7, C8: 10 µF 16 V SMD0805
- C6: 100 nF 310 V AC X2 raster 15 mm
- D1: SS14 DO-214AC lub podobna
- D2…D4: 1N4148 MiniMELF
- LED1: czerwona SMD0805
- LED2: L53F3C
- T1, T2: BSS123
- US1: 78M05 DPAK
- US2: ATtiny13A-SSU SO8
- US3: TSOP4836
- J1, J2: ARK2/500
- J3: goldpin 5 pin 2,54 mm męski THT
- J4, J5: goldpin 3 pin 2,54 mm męski THT (opis w tekście)
- PK1: JQC3FF 12 V (opis w tekście)
- Zworka 2,54 mm