- sterowanie włącz/wyłącz czterema odbiornikami,
- sterowanie jednym przyciskiem,
- możliwość wyboru jednej z czterech sekwencji,
- sygnalizacja stanu układu dwukolorową diodą LED,
- wyjścia przekaźnikowe z gasikami RC,
- zasilanie napięciem stałym lub przemiennym,
- napięcie zasilania 12…40 V.
Układ znajdzie zastosowanie tam, gdzie zamontowane są różne rodzaje oświetlenia: kinkiet na suficie, kinkiet boczny, podświetlenie taśmą LED przy podłodze, oświetlenie przy lustrze itd. Gdybyśmy do każdego z nich chcieli zamontować oddzielny włącznik przy drzwiach wejściowych, ich liczba mogłaby być naprawdę imponująca. Można temu zaradzić stosując tylko jeden przełącznik monostabilny, a to, które punkty świetlne będą aktywne, będziemy wybierać liczbą wciśnięć. Można tak skonfigurować urządzenie, aby np. wchodząc tylko na chwilę wystarczyło nacisnąć przełącznik raz, a w razie potrzeby oświetlenia czegoś dokładniej, nacisnąć go szybko dwa lub więcej razy. Wychodząc z pomieszczenia, zawsze wystarczy jednokrotne naciśnięcie, aby wyłączyć całe oświetlenie.
Budowa i działanie
Schemat układu znajduje się na rysunku 1. Jego zadaniem jest załączanie czterech odbiorników, do czego służą cztery przekaźniki. Ich cewki są przystosowane do zasilania napięciem stałym o wartości 5 V, takim reszta elektroniki. Między styki normalnie otwarte, został włączony układ RC, pełniący rolę gasika. Ogranicza on emisję zakłóceń elektromagnetycznych przez iskrzące (w momencie przełączania) styki, co znacząco zmniejsza prawdopodobieństwo zawieszenia się układu.
Wyprowadzenia styków środkowych przekaźników są przyłączone do jednego złącza J3, a wyjścia na poszczególne odbiorniki – do pojedynczych zacisków w złączach śrubowych J1 i J2.
Zwiększa to wydajność prądową i powoduje, że wszystkie odbiorniki są zasilane jednym, wspólnym napięciem. Może to być zarówno napięcie stałe, jak i przemienne.
Cewki przekaźników są załączane przez niewielkie tranzystory MOSFET typu BSS123, które do tego zadania są całkowicie wystarczające. Rezystory między bramkami, a źródłami, utrzymują te tranzystory w stanie zatkania, kiedy nie dociera do nich sygnał sterujący.
Na płytce przewidziano niewielkie diody LED, sygnalizujące stan każdego przekaźnika. Jeżeli przekaźnik został załączony, co dzieje się, gdy odpowiednia linia OUT1…OUT4 przyjmie wysoki stan logiczny, zworka JP1 umożliwia wyłączenie wszystkich diod – w sytuacji, kiedy płytka ma być dyskretnie zabudowana gdzieś w niewidocznym miejscu, a przebijająca się poświata mogłaby niepotrzebnie zwracać uwagę.
Dwukolorowa dioda LED, podłączona na przewodach do złącza J4, sygnalizuje stan pracy układu. Dioda musi mieć odwracalną polaryzację, co oznacza, że przy przepływie prądu w jedną stronę, świeci jedna z jej struktur, a po zmianie kierunku prądu – druga. Nie jest to realizowane wprost z wyjść mikrokontrolera, ponieważ indukujące się w potencjalnie długim przewodzie zakłócenia, mogłyby zaburzyć jego pracę lub zniszczyć go.
W tym celu użyto dwóch tranzystorów typu BSS123, jako elementy pośredniczące. Potencjały ich bramek mikrokontroler ustala poprzez rezystory R13 i R16, o wartości aż 10 kΩ, a do tego, na drodze ewentualnego zakłócenia stoi jeszcze dielektryk podbramkowy. Załączenie odpowiedniego koloru diody LED, odbywa się poprzez załączenie jednego z tranzystorów, przez co potencjał jego drenu spada niemal do zera. Ta prostota powoduje zwiększony pobór prądu, przez prąd płynący w tym czasie przez R14 lub R15, ale w układzie zasilanym z sieci, dodatkowe 5 mA nie będzie odczuwalne.
Wejście przycisku (J7) również zostało zabezpieczone przed potencjalnymi zakłóceniami i wyładowaniami elektrostatycznymi. Między wyprowadzeniem wejściowym mikrokontrolera, a przyciskiem, znajduje się tranzystor MOSFET, również typu BSS123. Jego bramka jest zabezpieczona przed uszkodzeniem przez dwie diody D5 i D6, które pełnią rolę ogranicznika napięcia. Ich prąd z kolei ogranicza rezystor R19. Rezystor R18 utrzymuje T7 w stanie zatkania. R17 ogranicza natężenie prądu płynącego przez przewód podłączony do złącza J7, w sytuacji gdyby z niewyjaśnionych względów zwarł się on z masą układu.
Wybór trybu pracy odbywa się poprzez nałożenie zworki na jedną z czterech par wyprowadzeń złącza szpilkowego JP2. Wewnętrzne rezystory podciągające mikrokontrolera, zostały uzupełnione zewnętrznymi, o wartości 10 kΩ każdy. Potencjał wybranej przez użytkownika linii MODE1…MODE4 stanie się niski.
Sam mikrokontroler to dobrze znany i popularny układ ATmega8A w obudowie TQFP32. Jego wyprowadzenia zasilania zostały odsprzęgnięte przy użyciu aż sześciu kondensatorów, by działanie układu było możliwie niezawodne. Nie realizuje on zadań wymagających ściśle ustalonej częstotliwości zegara, więc jest taktowany z wbudowanego generatora RC.
Do programowania pamięci Flash zostało przewidziane złącze J6, na które doprowadzono linie wymagane dla przeprowadzenia ISP. Układ sygnałów w 10-szpilkowym złączu, odpowiada standardowi KANDA ISP, jaki można znaleźć w wielu programatorach mikrokontrolerów AVR. Nieużywane na co dzień linie mikrokontrolera, zostały podciągnięcie do potencjału 5 V przy użyciu dodatkowych rezystorów.
Napięcie zasilające wszystkie obwody układu powinno wynosić 5 V. Niestety w obwodach oświetlenia łatwiej można znaleźć 12 V lub 24 V, które może być stałe lub przemienne.
Dlatego w urządzeniu wbudowano prostą przetwornicę impulsową, która zapewni jego prawidłowe działanie w szerokim zakresie napięć zasilających.
Mostek B1 ustala polaryzację napięcia zasilającego lub prostuje je, jeżeli ma ono charakter sinusoidalnie zmienny. Kondensator C11 i rezystor R29, tworzą układ tłumiący zakłócenia wysokiej częstotliwości, które przedostawałyby się ze źródła zasilania na wejście przetwornicy i w drugą stronę. Do filtracji tętnień niskiej częstotliwości, użyto dwóch połączonych równolegle kondensatorów, aby zmniejszyć ich wypadkową rezystancję szeregową (ESR) i indukcyjność szeregową (ESL).
Do obniżenia napięcia zastosowano przetwornicę bazującą na układzie typu LM2575. Zarówno sam kontroler z wbudowanym tranzystorem kluczującym, jak i współpracujący z nim dławik, zostały dobrane ze sporym naddatkiem – po to, aby nie było konieczności przejmowania się wydzielanym ciepłem, gdyż wzrost temperatury elementów jest minimalny.
Montaż i uruchomienie
Układ zmontowano na dwustronnej płytce drukowanej o wymiarach 90×100 mm, której wzór ścieżek oraz schemat montażowy pokazuje rysunek 2. W odległości 3 mm od krawędzi płytki, znalazły się otwory montażowe o średnicy 3,2 mm.
Montaż rozpoczynamy od elementów lutowanych powierzchniowo, które znajdują się na wierzchniej stronie płytki. Potem można wlutować elementy THT, według ich rosnącej wysokości. Ścieżki przewodzące prądy o wysokim natężeniu, zostały odsłonięte spod maski lutowniczej, aby ułatwić ich pogrubienie np. spoiwem lutowniczym.
Jeżeli montaż przebiegł bez problemów, można przejść do zaprogramowania mikrokontrolera. W tym celu należy podłączyć napięcie, najlepiej stałe, o wartości z zakresu 12…40 V, do zacisków złącza J7. Wymagane dla układu wartości bitów zabezpieczających wynoszą: High Fuse: 0xD9, Low Fuse: 0x24. Szczegóły znajdują się na rysunku 3, zawierającym widok z okna konfiguracji bitów zabezpieczających w programie AVR Burn-O-Mat. Takie ustawienie spowoduje uruchomienie wewnętrznego generatora RC o częstotliwości 8 MHz i BOD (Brown-Out Detector), na wartość ok. 4 V. Na koniec wystarczy zaprogramować pamięć Flash dostarczonym wsadem i możemy cieszyć się w pełni działającym układem.
Schemat połączeń płytki sekwencyjnego włącznika oświetlenia z pozostałym osprzętem, pokazuje rysunek 4. Przycisk podłączony do złącza J5, powinien mieć charakter monostabilny, normalnie otwarty. Może to być np. wyłącznik dzwonkowy, zwierający styki tylko w chwili wciskania. Napięcie stałe zasilające układ powinno się zwierać w przedziale 12…40 V, a przemienne (z transformatora sieciowego) 12…27 V. Chodzi o to, by jego wartość skuteczna wynosiła min. 12 V, by przetwornica pracowała prawidłowo. Zaś wartość szczytowa nie powinna przekraczać 40 V, by nie uszkodzić kontrolera przetwornicy i kondensatorów elektrolitycznych.
Napięcie podawane na źródła światła może wynosić nawet 230 V, z sieci. Najważniejsze, aby nie przekroczyć wytrzymałości prądowej styków przekaźnika typu JQC3FF, przy danym napięciu zasilającym. Nie ma też przeciwwskazań, aby tym samym napięciem nie zasilać samego układu, o ile spełnia ono wcześniejsze kryteria. Charakterystyka obrazująca zależność między maksymalnym przełączanym prądem, a napięciem, została pokazana na rysunku 5.
Ponieważ używane są styki NO (normalnie otwarte), trzeba patrzeć na krzywe opisane indeksem „1H”. Dla napięcia stałego przewodzony prąd może być znacząco niższy, niż dla napięcia przemiennego.
Dwukolorowa dioda LED, zawierająca dwie połączone, antyrównolegle struktury świecące. Powinna zostać podłączona według schematu z rysunku 6 tak, aby katoda struktury świecącej w kolorze czerwonym, była podłączona do zacisku opisanego na płytce jako „1” (chodzi o opis „1 LED 2”, znajdujący się przed złączem). Mogą to również być dwie oddzielne diody lub świecące w innych kolorach. Zastosowanie tylko dwóch przewodów do jej podłączenia, bardzo upraszcza montaż, gdyż przewód dwużyłowy łatwiej jest dobrać i zamontować, niż trójżyłowy.
Eksploatacja
Prawidłowo zmontowany i zaprogramowany układ, jest od razu gotowy do działania. Po włączeniu zasilania, dwukolorowa dioda LED może migać naprzemiennie, co jest skutkiem braku zworki na wyprowadzeniach JP2 lub błędnym jej położeniu. Zworka służy do wyboru jednego z czterech trybów pracy, a dokładniej sekwencji przełączających przekaźniki – co szczegółowo pokazano w tabeli 1.
Aby układ „zrozumiał” serię wciśnięć klawisza, odstęp między kolejnymi nie powinien być większy niż 2 s. Po każdym wykrytym wciśnięciu, czeka przez 250 ms w celu ustabilizowania się styków przycisku. Dlatego następne impulsy nie mogą pojawiać się zbyt szybko.
Po pierwszym wciśnięciu, dwukolorowa dioda LED zaczyna świecić na zielono. Jeżeli w czasie mniejszym niż 2 s nadejdzie kolejny impuls, kolor ten jest podtrzymywany. Dopiero po upływie 2 s od ostatniego wciśnięcia przycisku przez użytkownika, kolor świecenia diody staje się czerwony. Od tego momentu, wciśnięcie przycisku spowoduje wyłączenie wszystkich czterech przekaźników, niezależnie od tego, w jakiej konfiguracji były załączone. Dioda gaśnie po wyłączeniu przekaźników.
Każdorazowe włączenie zasilania układu powoduje, że uruchamia się on z wyłączonymi przekaźnikami.
Dla dociekliwych
Skompilowany kod programu zajmuje tylko 866 bajtów pamięci Flash mikrokontrolera, co daje duże możliwości jego rozbudowy, np. dłuższe sekwencje lub większą ich liczbę. Kod znajduje się w całości na listingu 1 dostępnym również w materiałach dodatkowych do projektu.
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
//tryby pracy
#define MODE_FIRST 1
#define MODE_SECOND 2
#define MODE_THIRD 3
#define MODE_FOURTH 4
#define MODE_NONE 0
//deklaracje wyjść sterujących
#define OUT1_1 PORTD|=(1<<PORTD6)
#define OUT2_1 PORTD|=(1<<PORTD7)
#define OUT3_1 PORTB|=(1<<PORTB0)
#define OUT4_1 PORTB|=(1<<PORTB1)
#define OUT1_0 PORTD&=~(1<<PORTD6)
#define OUT2_0 PORTD&=~(1<<PORTD7)
#define OUT3_0 PORTB&=~(1<<PORTB0)
#define OUT4_0 PORTB&=~(1<<PORTB1)
//wyjścia sterujące diodą LED
#define LED_R PORTD|=(1<<PORTD0);PORTD&=~(1<<PORTD1)
#define LED_G PORTD|=(1<<PORTD1);PORTD&=~(1<<PORTD0)
#define LED_NONE PORTD&=~(1<<PORTD0);PORTD&=~(1<<PORTD1)
#define SWITCH bit_is_clear(PIND,PIND2) //wejście impulsów
#define MODE_1 bit_is_clear(PINC,PINC3) //wejścia przełącznika wyboru trybu pracy
#define MODE_2 bit_is_clear(PINC,PINC2)
#define MODE_3 bit_is_clear(PINC,PINC1)
#define MODE_4 bit_is_clear(PINC,PINC0)
#define TIME_SW 2000 //czas między kolejnymi naciśnięciami
#define DELAY_SW 250 //tyle milisekund czeka po wciśnięciu
#define SW_MAX 4 //tyle razy można wcisnąć przycisk
//---------------------------------------------------------------
// Deklaracje zmiennych
//---------------------------------------------------------------
volatile uint8_t mode = MODE_NONE; //wybrany tryb pracy
volatile uint8_t pulse = 0; //odczytana z przełącznika liczba impulsów
volatile uint8_t sw_poprz = 1; //poprzedni stan przycisku, do wykrycia zmiany
volatile uint8_t next_off = 0; //jeżeli 1 to następne wciśnięcie przycisku spowoduje wyłączenie
volatile uint16_t time_cnt = 0; //licznik czasu między przyciśnięciami
//---------------------------------------------------------------
// GLÓWNA FUNKCJA PROGRAMU
//---------------------------------------------------------------
int main(void)
{
DDRB = (1 << DDB0) | (1 << DDB1);
PORTB = (1 << PORTB3) | (1 << PORTB4) | (1 << PORTB5);
DDRC = 0;
PORTC = (1 << PORTC0) | (1 << PORTC1) | (1 << PORTC2) | (1 << PORTC3);
DDRD = (1 << DDD0) | (1 << DDD1) | (1 << DDD6) | (1 << DDD7);
PORTD = (1 << PORTD2);
while (1)
{
_delay_ms(1); //opóźnienie głównej pętli
//jeżeli odliczanie czasu jest aktywne, odejmuj kolejne milisekundy
if(time_cnt)
{
time_cnt--;
}
//uaktualnij stan zmiennej od przycisku, jeżeli jest zwolniony
if(!SWITCH)
{
sw_poprz = 1;
}
//odczytanie trybu pracy ze zworek
//tylko jedna może być nałożona!
if(MODE_1 && !MODE_2 && !MODE_3 && !MODE_4)
{
mode = MODE_FIRST;
}
else if(!MODE_1 && MODE_2 && !MODE_3 && !MODE_4)
{
mode = MODE_SECOND;
}
else if(!MODE_1 && !MODE_2 && MODE_3 && !MODE_4)
{
mode = MODE_THIRD;
}
else if(!MODE_1 && !MODE_2 && !MODE_3 && MODE_4)
{
mode = MODE_FOURTH;
}
else
{
mode = MODE_NONE;
}
//jeżeli wykryto nieprawidłowy tryb pracy, migaj diodą i nic poza tym
if(mode == MODE_NONE)
{
LED_R;
_delay_ms(200);
LED_G;
_delay_ms(200);
LED_NONE;
}
//w prawidłowym trybie pracy
else
{
//jeżeli pierwszy lub następny raz wciśnięto przycisk
if(SWITCH && sw_poprz == 1 && time_cnt < (TIME_SW-DELAY_SW) && pulse < SW_MAX && next_off == 0)
{
pulse++; //odczytaj ten impuls
time_cnt = TIME_SW; //rozpocznij odliczanie
LED_G; //załącz zieloną diodę
sw_poprz = 0; //zapamiętaj wciśnięcie przycisku
}
//jeżeli wciśnięto przycisk zbyt wiele razy, wyłącz przekaźniki
if(SWITCH && sw_poprz == 1 && time_cnt < (TIME_SW-DELAY_SW) && pulse >= SW_MAX && next_off == 0)
{
LED_NONE; //wyłącz diodę LED
next_off = 0; pulse = 0; time_cnt = 0; //wyzeruj zmienne
sw_poprz = 1; //zapamiętaj wciśnięcie przycisku
OUT1_0; OUT2_0; OUT3_0; OUT4_0; //wyłącz przekaźniki
time_cnt = TIME_SW; //rozpocznij odliczanie
}
//jeżeli od ostatniego wciśnięcia minęło już dużo czasu, następny impuls wyłączy przekaźniki
if(pulse > 0 && time_cnt == 0 && next_off == 0)
{
LED_R; //dioda staje się czerwona
next_off = 1; //uaktywnij możliwość wyłączenia
}
//jeżeli wciśnięto przycisk po bardzo długim czasie a oświetlenie jest załączone
if(SWITCH && sw_poprz == 1 && next_off == 1)
{
LED_NONE; //wyłącz diodę LED
next_off = 0; pulse = 0; time_cnt = 0; //wyzeruj zmienne
sw_poprz = 1; //zapamiętaj wciśnięcie przycisku
OUT1_0; OUT2_0; OUT3_0; OUT4_0; //wyłącz przekaźniki
time_cnt = TIME_SW; //rozpocznij odliczanie
}
//w pierwszym trybie działania
if(mode == MODE_FIRST)
{
if(pulse == 1){OUT1_1; OUT2_0; OUT3_0; OUT4_0;}
if(pulse == 2){OUT1_0; OUT2_1; OUT3_0; OUT4_0;}
if(pulse == 3){OUT1_0; OUT2_0; OUT3_1; OUT4_0;}
if(pulse == 4){OUT1_0; OUT2_0; OUT3_0; OUT4_1;}
}
//w drugim trybie działania
if(mode == MODE_SECOND)
{
if(pulse == 1){OUT1_1; OUT2_0; OUT3_0; OUT4_0;}
if(pulse == 2){OUT1_1; OUT2_1; OUT3_0; OUT4_0;}
if(pulse == 3){OUT1_1; OUT2_1; OUT3_1; OUT4_0;}
if(pulse == 4){OUT1_1; OUT2_1; OUT3_1; OUT4_1;}
}
//w trzecim trybie działania
if(mode == MODE_THIRD)
{
if(pulse == 1){OUT1_1; OUT2_1; OUT3_0; OUT4_0;}
if(pulse == 2){OUT1_0; OUT2_1; OUT3_1; OUT4_0;}
if(pulse == 3){OUT1_0; OUT2_0; OUT3_1; OUT4_1;}
if(pulse == 4){OUT1_1; OUT2_0; OUT3_0; OUT4_1;}
}
//w czwartym trybie działania
if(mode == MODE_FOURTH)
{
if(pulse == 1){OUT1_0; OUT2_1; OUT3_1; OUT4_0;}
if(pulse == 2){OUT1_1; OUT2_0; OUT3_0; OUT4_1;}
if(pulse == 3){OUT1_1; OUT2_1; OUT3_0; OUT4_0;}
if(pulse == 4){OUT1_0; OUT2_0; OUT3_1; OUT4_1;}
}
}
}
return 0;
}
Zawiera komentarze oraz definicję stałych, które ułatwią jego zrozumienie. Został napisany w języku C, w środowisku WinAVR i skompilowany przy użyciu standardowego kompilatora AVR-GCC. Nie używa przerwań, ponieważ nie realizuje zadań krytycznych czasowo, więc jego zrozumienie nie powinno być trudne.
Michał Kurzela, EP
- R1, R3, R5, R7, R13, R16, R18…R28: 10 kΩ SMD0805
- R2, R4, R6, R8: 33 Ω 3 W THT
- R9…R12, R14, R15, R17: 1 kΩ SMD0805
- R29: 4,7 Ω SMD1206
- C1…C4: 100 nF MKP X2 310 V AC 15 mm
- C5…C7, C11, C12: 100 nF SMD0805
- C8…C10: 10 µF/16 V SMD0805
- C13, C14: 470 µF/50 V
- C15, C16: 330 µF/16 V
- B1: DF08
- D1…D6: 1N4148 MiniMELF
- D8: SK26
- LED1…LED4: zielona SMD0805
- T1…T7: BSS123
- US1: ATmega8A TQFP32
- US2: LM2575-5.0 TO220-5
- LED dwukolorowa czerwony/zielony (opis w tekście)
- J1…J3: ARK2/750
- J4, J5, J7: ARK2/500
- J6: IDC 10 pin pionowy THT 2,54 mm
- JP1: goldpin 2 pin męski 2,54 mm THT
- JP2: goldpin 2×4 pin męski 2,54 mm THT
- L1: 330 µH 3 A np. DPT330A3
- PK1…PK4: JQC3FF 5 V
- dwie zworki 2,54 mm