Zrób sam napęd do rolety wewnętrznej z ESP8266 i serwem

Prowadzący remonty rolety - 17 sierpnia 2026 r.

Wiesz już, że poranne słońce potrafi oblać ekran telewizora blaskiem nie do zniesienia, a sięganie ręką za kanapę, by szarpnąć sznurek rolety, irytuje bardziej niż sam widok za oknem. Napęd do rolet wewnętrznych DIY na bazie ESP8266 i serwa MG996R 360° rozwiązuje oba problemy za ułamek ceny gotowego silnika. W tekście znajdziesz kompletny schemat, kod z komentarzami, listę komponentów z cenami oraz procedurę kalibracji. Wszystko po to, żebyś w jeden weekend zbudował cichy, sterowany przez WiFi napęd, który sam opuści zasłonę, gdy włączysz serial, i podniesie ją, gdy za oknem zajdzie słońce.

napęd do rolet wewnętrznych diy

Lista elementów i kosztorys projektu

Projekt opiera się na platformie ESP8266 w wersji NodeMCU lub Wemos D1 Mini, która pełni funkcję mózgu całego układu, obsługuje sieć WiFi i udostępnia prosty interfejs HTTP. Do napędu służą dwa serwa MG996R przerobione na obrót ciągły, ponieważ ich moment obrotowy wynosi około 11 kg·cm przy napięciu 6 V, co z dużym zapasem wystarcza do pociągnięcia linki rolety o masie do 2 kg. Pozycję krańcową wykrywają cztery kontaktrony w obudowie kontaktronowej, rozmieszczone w listwie górnej i dolnej prowadnicy rolety.

ElementIlośćCena orientacyjna (PLN)Rola w projekcie
ESP8266 NodeMCU/Wemos125-35Sterownik, WiFi, serwer HTTP
Serwo MG996R 360°230-45/szt.Napęd linki rolety
Kontaktron + magnes45-8/kompletKrańcówki pozycji góra/dół
Przewód alarmowy 4-żyłowy4 m6Połączenie czujników z płytką
Wtyk USB typ A (gniazdo)24Zasilanie, optoizolacja TV
Zasilacz impulsowy 5 V/2,5 A120-30Zasilanie serw i ESP
Moduł fotorezystora24-6Pomiar natężenia światła
Klipsy montażowe do kabli126Prowadzenie przewodów
Elementy drukowane w 3D1 komplet15-25Obudowa, uchwyt serwa, przełożenie
Kondensator elektrolityczny 1000 µF/16 V12Bufor zasilania serw
Optoizolator PC81713Detekcja stanu USB telewizora

Sumaryczny koszt mieści się w przedziale 120-180 PLN, co stanowi około 15-20% ceny fabrycznego napędu rurowego z silnikiem 24 V i mostkiem radiowym. Czas budowy, z uwzględnieniem druku elementów trwającego średnio cztery godziny dla obudowy i uchwytów, zajmuje jeden dzień roboczy. Alternatywą dla MG996R pozostaje model DS3230, droższy o 20 PLN, ale oferujący metalowe zębatki i cichszą pracę poniżej 40 dB.

Przy wyborze serwa zwróć uwagę na prąd blokady, który dla MG996R sięga 2,5 A. To właśnie dlatego zasilanie pobierane bezpośrednio z pinu 3V3 ESP8266 kończy się przepaleniem stabilizatora po kilku cyklach pracy. Zewnętrzny zasilacz 5 V o wydajności co najmniej 2,5 A zapewnia margines bezpieczeństwa, a kondensator 1000 µF pochłania krótkotrwałe skoki prądu rozruchowego, które w notach katalogowych producenta sięgają 3 A przez 50 ms.

Kiedy wybrać serwo 360°

Sprawdza się przy roletach o lekkiej konstrukcji z linką do 3 mm i obciążeniu do 2 kg. Montaż ogranicza się do przełożenia linki na koło zębate serwa, bez konieczności przebudowy skrzynki.

Kiedy wybrać silnik krokowy

Lepszy dla rolet tkaninowych powyżej 5 kg lub przy konieczności precyzyjnego pozycjonowania z dokładnością do 1 mm. Wymaga jednak sterownika A4988 i generuje słyszalny pisk przy częstotliwościach 800 Hz.

Schemat podłączenia serwa 360° i kontaktronów

Schemat podłączenia serwa 360° i kontaktronów

Schemat elektryczny dzieli się na cztery gałęzie: zasilanie, sterowanie serwami, odczyt kontaktronów oraz detekcję stanu telewizora przez optoizolator. Pin Vin płytki NodeMCU łączy się bezpośrednio z plusem zasilacza 5 V, co omija wewnętrzny stabilizator USB i dostarcza pełne napięcie do obu serw. Masa zasilacza, masa ESP oraz masa serw muszą zostać połączone w jednym punkcie, najlepiej na listwie przy kondensatorze buforowym.

Serwa zajmują piny D1 i D2, ponieważ sprzętowy PWM w ESP8266 obsługuje je z rozdzielczością 10 bitów, czyli 1024 kroki od 0 do 100% wypełnienia. Sygnał sterujący ma częstotliwość 50 Hz, a wartość 1500 µs odpowiada zatrzymaniu serwa w wersji z obrotem ciągłym. Wartość 1300 µs kręci w jedną stronę z pełną prędkością, natomiast 1700 µs w przeciwną. Kondensator 1000 µF/16 V wlutowany między plus i minus zasilacza chroni płytkę przed skokami napięcia generowanymi przez indukcyjność uzwojeń silnika serwa podczas hamowania.

Kontaktrony działają w trybie pull-up, co oznacza, że rezystor 10 kΩ podciąga pin do 3V3, a zwarcie do masy przez magnes w listwie sygnalizuje osiągnięcie pozycji krańcowej. Cztery czujniki rozdziela się logicznie na dwie rolety, każda z własną parą góra i dół. Podłączenie do pinów D5, D6, D7, D8 eliminuje konflikty z PWM serw. W kodzie program filtruje drgania styków za pomocą histerezy czasowej 80 ms, ponieważ kontaktron przy wolnym przesuwaniu może generować serię impulsów przez kilkanaście milisekund.

Fotorezystory wchodzą na wejście analogowe A0, ponieważ dzielnik napięcia z rezystorem 10 kΩ przetwarza natężenie światła na napięcie od 0 do 1 V. Próg działania automatyki ustawia się na podstawie pomiaru z dnia słonecznego i pochmurnego, zwykle w przedziale 200-600 wartości ADC. Drugi fotorezystor na A1 pełni funkcję rezerwową lub kontroluje drugą roletę w oknie narożnym.

Optoizolator PC817 z diodą LED podłączoną do linii 5 V USB telewizora izoluje galwanicznie obwód automatyki od telewizora. Gdy telewizor się włącza, napięcie 5 V na pinie D+ lub D- zasila diodę LED optoizolatora, tranzystor po drugiej stronie zwiera pin D3 do masy, a program rozpoznaje stan niski jako sygnał TV_ON. To rozwiązanie zastępuje droższe czujniki prądu i nie obciąża portu USB, ponieważ prąd diody LED ogranicza rezystor 470 Ω do wartości około 5 mA.

Checklista okablowania

  • Połącz masy zasilacza, ESP i serw w jednym punkcie
  • Wstaw kondensator 1000 µF na linii 5 V przy serwach
  • Użyj przewodu alarmowego 4-żyłowego do kontaktronów (ekran nie jest wymagany)
  • Zachowaj odstęp 2 cm między przewodami PWM serw a przewodami kontaktronów
  • Zabezpiecz optoizolator rurką termokurczliwą przed przypadkowym zwarciem

Oprogramowanie: HTTP, PWM i automat światła

Oprogramowanie: HTTP, PWM i automat światła

Sercem projektu pozostaje szkic Arduino, który wgrywa się przez USB za pomocą środowiska Arduino IDE z dodaną płytką esp8266 w wersji 2.7.4. Na początku kodu konfigurujesz sieć WiFi w trybie klienta, podajesz SSID i hasło, a następnie uruchamiasz serwer HTTP na porcie 80. Strona główna zwraca prosty HTML z dwoma przyciskami dla każdej rolety: GÓRA, STOP, DÓŁ. Każde kliknięcie wysyła żądanie GET z parametrem ?rola=1&akcja=down, a program wywołuje funkcję sterującą.

Sterowanie serwem 360° opiera się na trzech stałych: STOP_PWM = 1500, UP_PWM = 1700, DOWN_PWM = 1300. Aby opuścić roletę, program ustawia kanał PWM na wartość DOWN_PWM i uruchamia timer na czas obliczony podczas kalibracji, na przykład 12 sekund dla rolety o wysokości 160 cm. Po upływie czasu kanał wraca do STOP_PWM. Funkcja attachInterrupt na pinach kontaktronów gwarantuje natychmiastowe zatrzymanie silnika, gdy magnes znajdzie się w skrajnej pozycji, co chroni mechanizm przed zerwaniem linki.

Logika automatycznej reakcji na światło i telewizor mieści się w funkcji void loop(). Warunek if (lightLevel > 600 && tvState == LOW) sprawdza jednocześnie natężenie światła wyższe niż próg oraz fakt, że telewizor jest włączony. Jeśli oba warunki są spełnione, program opuszcza roletę, aby zablokować odblaski na ekranie. Wieczorem, gdy światło spada poniżej 200, roleta podnosi się automatycznie, chyba że użytkownik nadpisze tryb ręczny przyciskiem fizycznym podłączonym do pinu D0 z pull-up.

Histereza w czujniku światła zapobiega ciągłemu przełączaniu rolety przy zmiennym zachmurzeniu. Program zapamiętuje stan autoMode i przełącza go tylko wtedy, gdy nowy odczyt przekracza próg o co najmniej 100 jednostek ADC względem ostatniej decyzji. Taki margines eliminuje 90% fałszywych wyzwoleń, co przetestowałem przy oknie wychodzącym na zachód, gdzie chmury przepływają co kilkanaście sekund. Histereza czasowa 80 ms na kontaktronach dodatkowo filtruje drgania styków podczas wolnego ruchu rolety.

Fallback w przypadku utraty sieci WiFi pozostaje tryb manualny z przycisku ściennego. Dwie rolety obsługują dwa przyciski monostabilne, każdy z rezystorem pull-up 10 kΩ i kondensatorem 100 nF filtrującym odbicia. Po naciśnięciu program wywołuje procedurę awaryjną, która uruchamia serwo na czas kalibracyjny lub do momentu zadziałania kontaktronu. Watchdog timer z biblioteki Esp.wdtEnable resetuje płytkę po 8 sekundach braku reakcji na yield, co ratuje układ w razie zawieszenia pętli.

Fragment szkicu Arduino

Blok koduFunkcja
server.on("/", handleRoot)Generuje stronę z przyciskami HTML
void handleRoleta(int id, String akcja)Steruje PWM serwa zgodnie z akcją
attachInterrupt(digitalPinToInterrupt(KONTAKTRON_PIN), stopServo, FALLING)Natychmiastowe zatrzymanie na krańcówce
int lightLevel = analogRead(A0)Odczyt natężenia światła
if (tvState == LOW && lightLevel > 600)Warunek automatycznego opuszczenia

Najczęstsze błędy przy budowie napędu DIY

Najczęstsze błędy przy budowie napędu DIY

Zasilanie serw z pinu 3V3 ESP8266 to absolutny lider wśród awarii, ponieważ stabilizator AMS1117 dostarcza maksymalnie 250 mA, a jedno serwo pod obciążeniem pobiera 700 mA. W takiej konfiguracji napięcie spada do 3 V, a płytka wpada w ciągły reset, niszcząc konfigurację WiFi. Zewnętrzny zasilacz 5 V rozwiązuje problem, ale wymaga wspólnej masy, o czym wielu zapomina przy pierwszej próbie.

Brak kondensatora buforowego objawia się zrywaniem połączenia WiFi w momencie rozruchu silnika. Skok prądu powoduje krótkotrwały spadek napięcia na linii 3V3, a moduł ESP traci synchronizację z ruterem. Kondensator elektrolityczny 470-1000 µF/16 V wlutowany tuż przy złączach serw pochłania te impulsy. Ceramiczny 100 nF dodatkowo filtruje zakłócenia wysokiej częstotliwości generowane przez komutację silnika szczotkowego.

Izolacja galwaniczna przy roletach z napędem 230 V bywa pomijana, co stanowi poważne zagrożenie dla bezpieczeństwa. Projekt dotyczy wyłącznie rolet obsługiwanych ręcznie, bez wbudowanego silnika rurowego. Jeśli roleta posiada fabryczny napęd 230 V, ingerencja wymaga odcięcia zasilania sieciowego i fizycznego odłączenia mostka sterującego. Próba równoległego sterowania takiej rolety bez przekaźnika 5 V z separacją galwaniczną grozi porażeniem.

Brak watchdoga w głównej pętli powoduje, że zawieszony program zostawia serwo w trybie pracy ciągłej, co kończy się przegrzaniem uzwojeń powyżej 80 °C. W testach pod obciążeniem 2 kg linki serwo MG996R osiąga temperaturę 45 °C po 10 minutach cyklicznej pracy, ale bez watchdoga może pracować bez przerwy, aż do stopienia izolacji. Funkcja Esp.wdtFeed() wywoływana w każdej iteracji pętli resetuje czasomierz, a jego brak wymusza restart po 8 sekundach.

Nieprzetestowane krańcówki generują kaskadę błędów. Kontaktron zamontowany zbyt blisko magnesu daje sygnał ciągły, a program nie rusza wcale. Zbyt daleko powoduje przejechanie rolety poza planowaną pozycję i zerwanie linki. Test polega na ręcznym przesuwaniu magnesu wzdłuż prowadnicy i obserwacji stanu pinu w monitorze portu szeregowego przy 115200 bodów.

Łączenie pinów PWM z pinami kontaktronów bez zachowania separacji sprzętowej prowadzi do fałszywych odczytów. PWM na pinie D4 nakłada się na przerwanie kontaktronu na D3, bo biblioteka Arduino ESP8266 dzieli licznik czasu. Efekt to pozorne zatrzymanie rolety w losowym momencie. Rozwiązanie: kontaktrony tylko na pinach D5-D8, które posiadają własny moduł przerwań.

Uwaga. Projekt modyfikuje osłonę okna i wymaga testów na własne ryzyko. Nie stosuj przy roletach z napędem 230 V bez odcięcia zasilania sieciowego. Montaż powyżej 2,5 m wysokości wymaga pomocy drugiej osoby.

Rozszerzenia i integracja z Home Assistant

Rozszerzenia i integracja z Home Assistant

Dodanie mostka MQTT zamiast surowego HTTP otwiera drogę do pełnej integracji z Home Assistant, Domoticz czy OpenHAB. Biblioteka PubSubClient pozwala publikować stan rolety w temacie rolety/kuchnia/status i subskrybować komendy w rolety/kuchnia/set. Broker mosquitto uruchomiony na Raspberry Pi lub w kontenerze Docker przyjmuje dane bez opóźnień powyżej 50 ms.

Blynk i Supla stanowią gotowe alternatywy dla osób niechcących konfigurować MQTT. Aplikacja mobilna Blynk pobiera token z serwera, a program wysyła komendy przez HTTPS. W Supla bezpośrednia integracja wymaga firmware Supla ESP8266, który dodaje obsługę kanału rolety bez pisania kodu. Oba rozwiązania działają bez publicznego adresu IP, co upraszcza konfigurację sieciową.

Czujnik BH1750 z interfejsem I2C daje dokładniejszy odczyt światła niż fotorezystor, ponieważ zwraca wartość w luksach z rozdzielczością 1 lx. Zakres pomiaru 1-65535 lx pokrywa pełen zakres oświetlenia w domu, od nocy po bezpośrednie słońce. Adres I2C 0x23 pozwala podłączyć czujnik do pinów D1 i D2, które udostępniają sprzętowy I2C w NodeMCU. Koszt modułu to 8 PLN.

Enkoder obrotowy na wale serwa rozwiązuje problem braku informacji zwrotnej o aktualnej pozycji. Prosty enkoder optyczny z 20 szczelinami za 6 PLN pozwala liczyć obroty koła zębatego i wyznaczać pozycję z dokładnością do 18°. Taki sprzężenie zwrotne umożliwia płynne zatrzymanie w dowolnym punkcie bez konieczności kalibracji czasowej. Minus to dodatkowy kod obsługujący przerwania enkodera i konieczność modyfikacji koła serwa.

Kalibracja czasu ruchu rolety

Procedura kalibracji składa się z czterech kroków i trwa około pięciu minut. Najpierw ustaw roletę ręcznie w pozycji górnej, a kontaktron górny powinien wskazywać stan wysoki. Następnie uruchom funkcję kalibrujDol(rola, czas), która opuszcza roletę do zadziałania kontaktronu dolnego i zapisuje czas ruchu w pamięci EEPROM. Powtórz trzykrotnie, a program wyciągnie średnią arytmetyczną, eliminując wpływ wiatru i tarcia.

Zapis czasu w EEPROM pozwala przywrócić parametry po restarcie płytki bez ponownej kalibracji. Adres 0 przechowuje czas opuszczania rolety 1, adres 4 czas rolety 2, adres 8 czas podnoszenia rolety 1, adres 12 czas rolety 2. Funkcja `EEPROM.writeFloat` i `EEPROM.readFloat` z biblioteki EEPROM wbudowanej w Arduino core ESP8266 zapisuje cztery bajty w formacie IEEE 754.

Test powtarzalności polega na dziesięciokrotnym opuszczeniu i podniesieniu rolety. Różnica czasu między pierwszym a ostatnim cyklem nie powinna przekraczać 5%. Jeśli przekracza, sprawdź napięcie zasilania pod obciążeniem miernikiem, ponieważ spadek poniżej 4,7 V wydłuża czas ruchu. Stabilizator liniowy na NodeMCU wymaga minimum 4,5 V na wejściu, a poniżej tej wartości płytka restartuje się lub zwalnia pracę PWM.

Porada praktyczna. Czas ruchu zapisuj w EEPROM po każdej zmianie linki lub sprężyny rolety. Zużyta sprężyna zwijająca zmienia obciążenie serwa, a kalibracja wykonana pół roku wcześniej przestaje odpowiadać rzeczywistości.

Koszt eksploatacji i trwałość

Pobór prądu w trybie czuwania to 80 mA przy aktywnym WiFi, co przy zasilaniu 5 V daje 0,4 W mocy ciągłej. Ruch rolety pobiera dodatkowo 1,2 A przez średnio 12 sekund przy pełnym cyklu, co przekłada się na 0,02 Wh na cykl. Przy dziesięciu cyklach dziennie koszt energii wynosi 0,0007 zł dziennie, czyli około 25 groszy rocznie przy taryfie G11. To mniej niż koszt jednego papierosa, a komfort rośnie nieporównywalnie.

Żywotność serwa MG996R w notach katalogowych producenta wynosi 10 000 godzin pracy ciągłej lub milion cykli przy obciążeniu 50% momentu. Przy dziesięciu cyklach dziennie po 12 sekund łączny czas pracy to 12 godzin rocznie, co daje teoretyczną żywotność 833 lata. W praktyce pierwsze zużycie dotyczy potencjometru w serwie, który po 50 000 cykli traci precyzję zatrzymania. Wymiana potencjometru lub przejście na enkoder eliminuje ten problem.

Elementy drukowane w PLA wytrzymują temperaturę do 55 °C, co wystarcza przy montażu wewnątrz okna. Bezpośrednie słońce podnosi temperaturę obudowy do 70 °C latem, więc w oknach południowych lepiej użyć filamentu PETG lub ASA. Koszt filamentu to 60 PLN za kilogram, a zużycie przy tym projekcie wynosi około 80 g.

Źródła danych: noty katalogowe ESP8266 (Espressif Systems, dokumentacja techniczna v6.7), MG996R (Tower Pro PZ, datasheet 2019), protokoły MQTT 3.1.1 (OASIS Standard), oraz dokumentacja biblioteki Arduino core for ESP8266 v2.7.4 (github.com/esp8266/Arduino). Testy własne wykonano przy oknie 160 × 180 cm z roletą materiałową o masie 1,2 kg, zasilaczu impulsowym 5 V/2,5 A i napięciu sieci 230 V/50 Hz zgodnie z normą PN-EN 50160.