
Przedstawiam efekty mojej próby zmierzenia się z tematem sterowania bramą garażową.
Taka potrzeba pojawiła się po awarii oryginalnej elektroniki napędu. Zamiast kupować następną identyczną płytkę sterującą (która znowu padnie po jakimś czasie), można przecież zrobić swoją, prostszą, i potem tanio ją serwisować we własnym zakresie. (I to by było na tyle, jeśli chodzi o zalety takiego podejścia.)
W oryginalnym napędzie nie było krańcówek. Silnik ma enkoder - stary sterownik uczył się, dokąd może dojechać.
Mój sterownik wymaga krańcówek. Zamontowałem na szynie dwa kontaktrony, a na ruchomej części (perforowanym profilu tuż pod szyną) magnes.
Oprócz tego zrezygnowałem z obecnej w starym sterowniku regulacji mocy silnika.
Dla kompatybilności z oryginalnym sterownikiem zastosowałem takie same złącza:
- wejście zasilania 230V
- uzwojenie pierwotne transformatora
- uzwojenie wtórne transformatora (24V)
- wyjście zasilania żarówki 230V
- 5-pinowe złącze silnika: 2 przewody = zasilanie, 3 przewody = enkoder (czujnik Halla)
Wejścia (wszystko normalnie otwarte):
- przycisk STOP (tact switch na płytce)
- przycisk START (tact switch na płytce + powrót masy z zewnętrznego modułu odbiornika radiowego)
- krańcówka górna
- krańcówka dolna
- enkoder (czujnik Halla)
Wyjścia:
- przekaźnik jazdy do góry
- przekaźnik jazdy na dół
- przekaźnik lampy 230V
- przekaźnik zwierający/rozwierający obwód silnika
- lampka kontrolna
Schemat:

Układ jest zbudowany wokół mikrokontrolera AT89C2051, który podczas spoczynku śpi (tryb IDLE) czekając na przerwanie zewnętrzne - od przycisku STOP albo START.
Po otrzymaniu sygnału START włączana jest lampa 230V, przekaźnik obwodu silnika oraz przekaźnik odpowiedzialny za ruch bramy w odpowiednią stronę - w zależności od tego, która krańcówka jest akurat aktywna (górna -> jazda w dół, dolna -> jazda w górę). Jeśli żadna krańcówka nie jest aktywna, to jedziemy w stronę przeciwną niż ostatnio. Jeśli obie są jednocześnie aktywne (stan nienormalny), to nie uruchamiamy silnika w ogóle.
Po uruchomieniu silnika procesor nie jest już usypiany, tylko najczęściej jak może sprawdza stan przeciwległej krańcówki, a także wejścia z czujnika Halla. W czasie ruchu silnika miga lampka kontrolna. Zatrzymanie ruchu sygnałem z krańcówki jest traktowane jako normalne i wtedy układ gasi lampkę, natomiast po zatrzymaniu silnika wskutek braku impulsów z czujnika Halla (lub przekroczenia maksymalnego czasu jazdy) lampka zostaje zaświecona, żeby zasygnalizować awarię krańcówki. Niezależnie od tego, włączenie silnika włącza też lampę 230V na ok. 3 minuty.
Naciśnięcie przycisku START albo STOP podczas ruchu silnika zatrzymuje go.
Naciśnięcie przycisku STOP podczas spoczynku gasi lampę 230V, jeśli była zaświecona, a zaświeca ją na 3 minuty, jeśli była zgaszona.
Reakcja na naciśnięcie START albo STOP jest natychmiastowa, a następnie odbywa się debouncing z wykorzystaniem timera generującego przerwanie 28 i 1/8 raza na sekundę. Program czeka na puszczenie klawisza i potem jeszcze jeden cykl timera.
Naciśnięcie START blokuje tylko START - nadal można zatrzymać silnik STOPem trzymając jeszcze START. Naciśnięcie STOP blokuje zaś oba przyciski. Blokada następuje przez zamaskowanie przerwania albo obu przerwań zewnętrznych. Blokada kończy się po puszczeniu wszystkich naciśniętych przycisków (po debouncingu).
Timer wyznacza też minimalną częstotliwość impulsów z czujnika Halla. Jeśli w danym cyklu timera nie zmienił się stan wejścia z tego czujnika, to oznacza zablokowanie napędu i silnik jest wówczas zatrzymywany. Żeby silnik miał szansę ruszyć, sprawdzanie enkodera zaczyna się dopiero po debouncingu. W przypadku krótkiego impulsu (z odbiornika radiowego) daje to 2 cykle timera na rozruch. Aby umożliwić testy na sucho (bez podłączania silnika), zwarcie portu P3.0 z masą pomija sprawdzanie czujnika Halla.
Dodatkowym zabezpieczeniem jest jeszcze maksymalny czas jazdy 27,3 s (3*256 cykli).
Po zatrzymaniu silnika procesor znowu zaczyna wchodzić w stan IDLE, ale pozostaje aktywne przerwanie timera. Dopiero po odliczeniu czasu świecenia lampy 230V (182 s) timer nie jest ponownie włączany i procesor śpi aż do następnego naciśnięcia START albo STOP.
Zdjęcia pokazują płytę główną (żółtą, o wymiarach takich jak oryginalna), oraz zieloną płytkę uniwersalną z właściwym sterownikiem. Wykonanie może nie powala, ale układ naprawdę działa








Załączam:
- schemat w PDF
- wsad do procesora - plik HEX oraz kod źródłowy w asemblerze (4-znakowa tabulacja, Unix-owe końce linii):
- aktualna wersja - blokada przycisku START przez sekundę po puszczeniu - rozwiązuje problem współpracy z pilotem powtarzającym impulsy
- poprzednia wersja
Cool? Ranking DIY