Spis treści

Podobno najlepsze urządzenia to takie, które ułatwiają nam życie i rodzą się z potrzeby chwili. Mieszkam w bloku na samym początku węzła ciepłowniczego, praktycznie wymiennikownia jest pod samym blokiem tak więc zimą wystarczy tylko delikatnie otworzyć zawór kaloryfera by po godzinie temperatura w mieszkaniu przekroczyła 24 stopnie. Najgorzej jest, gdy otwarty zawór zostawię na noc, wtedy nad ranem mam już 30, a ja wręcz nienawidzę temperatur ponad 22 stopnie Celcjusza.

Oczywiście, ktoś może zapytać dlaczego nie zmienię zaworu na termostatyczny, który sam bez problemu będzie regulował temperaturę ? hm... pewnie było by to jakieś rozwiązanie, ale tak mi z tym schodziło przez wszystkie ciepłe dni, że w końcu włączyli ogrzewanie i w tej sytuacji majstrowanie przy instalacji wiązało by się ze sporymi kosztami. Ponad to, czy przy wymianie zaworu przez hydraulika można się czegoś nauczyć ? raczej nie.

Należało więc do istniejącego zaworu założyć jakiś napęd, który będzie w stanie nim poruszać. Gdyby to był zawór kulowy, założył bym serwomotor modelarski i problem udało by się w miarę prosto rozwiązać. Niestety mam zwykły kręcony zawór grzybkowy, wymagający co najmniej kilku obrotów by go w pełni otworzyć. Sprawa nie była już taka prosta, ale nikt nie mówił, że w życiu łatwo będzie.

Rys. 1 Silnik DC wraz z przekładnią planetarną.

W swoich zapasach wygrzebałem ciekawy silniczek prądu stałego zespolony z przekładnią planetarną kółkami zębatymi i paskiem zębatym. Uznałem, że coś takiego jak najbardziej się nada gdy przykręcę ten silniczek w okolicach zaworu i przekażę napęd tym paskiem, dodatkowo w układ montując wieloobrotowy potencjometr tak, by układ sterujący w każdej chwili wiedział w jakiej pozycji zawór się znajduje.

Rys. 2 Silnik DC wraz ze źródłem informacji zwrotnej o aktualnej pozycji.

Na razie jednak w szczegóły mechaniczne nie będę się zagłębiał, zacznę od części sterującej. Postanowiłem wykonać układ z mikrokontrolerem, który będzie realizował następujące funkcje:

¤ pomiar temperatury w 3 punktach;
¤ wyświetlanie parametrów na wyświetlaczu LCD;
¤ niezależny zegar czasu rzeczywistego z podtrzymaniem;
¤ możliwość modyfikacji z poziomu klawiatury menu;
¤ odczyt bieżącej pozycji serwomotoru;
¤ możliwość regulacji prędkości, kierunku i blokady serwomotoru.

By zrealizować te funkcje zbudowałem układ sterujący z mikrokontrolerem ATmega32, oczywiście wystarczył by ATmega16, ale taki akurat miałem pod ręką. Do bezpośredniego wysterowania silnika DC zastosowałem wcześniej skonstruowany w mojej pracowni moduł z układem LMD18200, opis tego projektu znajduje się pod tym linkiem.

Rys. 3 Schemat ideowy układu sterownika. (kliknij by powiększyć).
-- Pobierz plik dla programu EAGLE --

Dzięki zastosowaniu układu LMD18200 z poziomu mikrokontrolera w prosty sposób mogę w pełni kontrolować ruch silnika DC, wystarczy wystawiać odpowiednie stany na wyjściach. Jak widać na schemacie zastosowałem 3 transoptory bo układ z mikrokontrolerem operuje na napięciu 5V a część logiczna sterownika na napięciu 12V. Poprzez te 3 transoptory idą stany do określania kierunku obrotu i hamowania oraz PWM dla określania prędkości.

Rys. 4 Widok mozaiki płytki PCB (kliknij by powiększyć).
-- Pobierz plik dla programu EAGLE --

Na płytce umieściłem dodatkowo linijkę diodową, za pomocą której będę obrazował w jakiej pozycji jest zawór, znalazło się tam też złącze prowadzące do modułu napędu silnika, złącza dla czujników temperatury oraz złącze dla potencjometru sprzężenia zwrotnego pozycji. Widzimy też 5 przycisków menu, zegar RTC PCF8583 wraz z baterią podtrzymania, kwarcem i trymerem do regulacji. Jest też delikatna różnica pomiędzy schematem a PCB, niestety zapomniałem o dwóch kondensatorach i musiałem je dolutować po drugiej stronie. Na schemacie są one zaznaczone.

Rys. 5 Widok zmontowanej płytki sterownika.


Rys. 6 Widok zmontowanej płytki sterownika.

Płytka wyszła całkiem przyzwoicie, wykonałem ją w ten sposób bo to teoretycznie miał być tylko prototyp na szybko by sprawdzić czy uda się czymś takim sensownie sterować temperaturą. W codziennym zastosowaniu będzie to raczej mało praktyczne, zwłaszcza jeśli się ma małe dzieci w domu :). Docelowo całość umieszczę w obudowie a sterowanie i podgląd będzie odbywał się z poziomu jakiegoś zewnętrznego pilota. Oczywiście nie wiem czy to będzie akurat taki układ bo na wiosnę wymienię zawory na kulowe i zamontuję mocne serwa modelarskie. Wtedy będę sterował grzejnikami w dwóch pokojach a układ i tak będzie dużo mniej skomplikowany. Na tą zimę pozostanie ten układ i sterowanie jednym, największym w mieszkaniu grzejnikiem.

Rys. 7 Widok stanowiska testowego.


Rys. 8 Widok napędu z driverem jeszcze bez sprzężenia zwrotnego.

Na początku nie wspomniałem po co na pokładzie sterownika znalazł się zegar RTC. Otóż ze względów zdrowotnych :). W moim sterowniku zaimplementowałem możliwość programowania nie tylko ogólnej temperatury w pomieszczeniu ale także innej o określonych godzinach. W nocy można zdecydowanie obniżyć temperaturę mieszkania bo jest to podobno zdrowe dla organizmu a poza tym jeśli mamy liczniki ciepła możemy sporo zaoszczędzić. Dzięki zegarowi czasu rzeczywistego mikrokontroler nawet gdy zostanie wyłączony, zawiesi się itd. zawsze gdy wróci do pracy będzie wiedział która jest godzina i zgodnie z ustawieniami użytkownika będzie regulował temperaturę.

 


Pierwszymi czynnościami po zmontowaniu płytki było proste sprawdzenie czy działają wszystkie elementy, przede wszystkim czy działa sterowanie serwomotoru. Wbrew pozorom najwięcej problemów na początku przysporzył mi zegar RTC komunikujący się z mikrokontrolerem za pośrednictwem magistrali I2C. Za każdym razem jak wysyłałem zapytanie o godzinę cały układ się zawieszał. Spędziłem sporo czasu kombinując w programie, szukając błędu a okazało się, że podczas trawienia płytki powstała przerwa w obwodzie podciągania magistrali rezystorami. Była ona na tyle mała, że gołym okiem całkowicie nie widoczna.

Gdy rozwiązałem ten problem i udało mi się z poziomu programu włączać, zmieniać prędkość i kierunek obrotu serwa należało wykonać sprzężenie zwrotne, tak by mikrokontroler wiedział w jakiej pozycji właśnie się znajduje.

Rys. 9 Potencjometr wieloobrotowy podłączony do sterownika.

W tym celu można zastosować tzw. enkoder absolutny, który na wyjściu wystawia odpowiedni kod binarny dla każdej pozycji lub prościej tak, jak właśnie zrobiłem zastosować wieloobrotowy potencjometr. Po trwałym połączeniu go z osią silnika każde poruszenie osią spowoduję zmianę napięcia na jego wyjściu, gdy podłączymy go jako dzielnik napięcia.

Rys. 10 Gotowy serwomotor ze sprzężeniem zwrotnym pozycji.

Potencjometr do osi należy dość trwale przymocować, w moim przypadku odwaliłem trochę partyzantkę, z którą trochę się namęczyłem. Na osi silnika zamontowane było oczywiście koło pasowe do napędu zaworu i zachodziłem w głowę jak tu wpleść potencjometr. Rozważałem nawet umieścić go obok i "pobierać" moment napędowy z paska tak jak np. z paska rozrządu w samochodzie zasila się alternator, pompę wspomagania, chłodnicy itd. Jednak wybitnie by to skomplikowało układ.

Rys. 11 Gotowy i podłączony do sterownika serwonapęd.

Znalazłem rozwiązanie troszkę inne, w pudełku z opisem kółka pasowe znalazłem kółko, które pasowało na oś potencjometru. Zdjąłem kółko pasowe z silnika i nałożyłem na pręt razem z kółkiem od potencjometru tak by były scentrowane. Na wiertarce stołowej przewierciłem i nagwintowałem dwie dziurki w kołach wzdłuż osi i wkręciłem śrubki odcinając nadmiar. Teraz po wyjęciu pręta pomocniczego w powstały element z jednej strony mogłem wkręcić oś silnika a z drugiej oś potencjometru. Dodatkowo obudowę potencjometru przymocowałem na sprężynowym połączeniu ze statyczną częścią serwa tak, by obracała się oś a nie cały potencjometr :).
Sygnał z wyjścia potencjometru wprowadziłem na wejście przetwornika analogowo-cyfrowego mikrokontrolera i próbkuję z dużą częstotliwością tak więc mikrokontroler w każdej sekundzie zna pozycję serwomotoru. Poza tym stosowanie potencjometru ma znaczącą wadę, gdyby mikrokontroler w porę nie zareagował na kończący się zakres ruchu serwa doszło by do jego uszkodzenia , co niestety i mi się przytrafiło.
Jak wyglądały pierwsze testy prezentuje poniższy film:

Film 1 Pierwszy test kontrolowanego poruszania serwonapędem.
Link bezpośredni: http://youtu.be/7jctSP9nqXI

Gdy już dopracowałem metodę pozycjonowania, zadawania pozycji i jej kontroli należało dostarczyć mikrokontrolerowi informację, w oparciu o którą miał sterować tym zaworem. Chodzi oczywiście o temperaturę w pokoju, na zewnątrz i temperaturę kaloryfera. Najprostszą metodą pomiaru w tego typu układach będzie zastosowanie cyfrowego przetwornika temperatury DS18B20. Już go w moim portalu opisywałem więc w szczegóły zagłębiał się nie będę.

Rys. 12 Sterownik z załączonymi trzema czujnikami.

Na płytce zamontowałem trzy potrójne złączki, w których są piny zasilania oraz pin magistrali transmisji danych 1-wire. Czujniki zamontowałem na przewodach tak by jeden z nich można było przymocować do kaloryfera, drugi wyprowadzić na zewnątrz a trzeci umieścić w miejscu umożliwiającym dokładny pomiar temperatury w pokoju.

Rys. 13 Przetwornik mierzący temperaturę kaloryfera.

Wszystkie te temperatury, oprócz tego że będą zastosowane w algorytmie ogrzewania, będą także wyświetlane na LCD więc układ będzie miał dodatkowe zastosowanie informacyjne.
Gdy już wszystkie elementy były gotowe w sobotni poranek zabrałem się do montażu serwa przy zaworze kaloryfera. Tu niestety spotkało mnie niezbyt miłe zaskoczenie. Kaloryfer, którym chciałem sterować miał utrudnione dojście więc przymiarki robiłem na obiekcie w drugim pokoju. Jakież było moje zdziwienie, gdy okazało się, że ten jest znacznie bardziej dosunięty do ściany :) Teraz mi wesoło, ale wtedy, gdy okazało się że serwo w tej postaci się nie nada, wesoło mi raczej nie było.

Rys. 14 Fabryczny napęd od urządzenia medycznego.

Mój napęd był stanowczo za duży więc nie pozostało mi nic innego jak zbudować coś mniejszego i o dziwo tego samego dnia pomiędzy wszystkimi innymi rzeczami, które musiałem w domu zrobić udało mi się napęd zrealizować. Zastosowałem mały silniczek z przekładnią od fabrycznego napędu stosowanego w przesłonach źródła promieniowania do leczenia chorób nowotworowych.


Oprócz sterownika elektronicznego cała praca nad poprzednim napędem poszła na marne, ale nie ma tego złego co na dobre by nie wyszło. Nowy projekt wyszedł znacznie lepiej i nie wymagał żadnych wierceń w ścianie by go zamontować.

Rys. 15 Napęd sprzężony z zaworem.

Udałem się więc do kolegi gdzie po dłuższej chwili na obrabiarce powstała zaprezentowana powyżej łapka, dzięki której mogłem przykręcić silnik bezpośrednio do rury zasilającej kaloryfer. Co do przełożenia napędu to w swej pracowni mam całkiem spore pudełko kółek pasowych i pasków zębatych. Po prostu uwielbiam je :) po chwili grzebania znalazłem coś co się nada do mojego projektu.

Rys. 16 Potencjometr sprzężenia zwrotnego.

Potencjometr też wygrzebałem inny, który w łatwy sposób uda mi się zamontować by odczytywać pozycję zaworu. Na początku potencjometr miałem zamontować nad samym zaworem równolegle, ale znów pojawił się problem - za niski parapet. Musiałem znów grzebać w pudełeczku by wygrzebać kolejne kółka i pasek. Kątownik wystający ze ściany i podtrzymujący parapet, który myślałem, że będzie przeszkadzał w montażu poprzedniego napędu stał się bardzo pomocny, bo właśnie do niego przykręciłem przetwornik pozycji.

Rys. 17 Zawór zespolony z potencjometrem kodującym pozycję.

Po złożeniu wszystkiego mogłem już wreszcie zacząć automatycznie sterować zaworem, na obecną chwilę nie napisałem jeszcze prawidłowego algorytmu, który pozwoli mi wykorzystać wszystkie możliwości, jakie zaimplementowałem do układu. Założenie jest takie, że nie będzie to prosty algorytm: otwórz zamknij zawór. Chcę, by na podstawie tych trzech temperatur zadawać tak pozycje zaworu by utrzymywać temperaturę jak najbliżej zadanej wartości, bez przegrzań i wychłodzeń.

Rys. 18 Gotowy układ serwozaworu.

Na razie algorytm sterowania wygląda mniej więcej tak: jeśli temperatura rzeczywista mniejsza od temperatury zadanej oraz temperatura grzejnika mniejsza od temperatury progowej grzejnika to otwórz zawór. Oczywiście wiąże się z tym prostym algorytmem znów ciekawa historyjka bo w środku nocy trochę się przestraszyłem gdy otwierający się zawór wyrwał mnie ze snu, ustawiłem trochę za dużą prędkość i jest głośny. Pomyślałem, że się po prostu otworzył i tyle. Niestety to nie był koniec, zaczął się co chwilę otwierać i zamykać. Dopiero wtedy uświadomiłem sobie, że nie wprowadziłem histerezy.

Rys. 19 Środowisko testowe.

Po wprowadzeniu poprawek nawet ten całkiem prosty algorytm spisywał się znośnie bo już nie budzę się w przegrzanym mieszkaniu. Jednak program wymaga jeszcze duuużo pracy. Choć patrząc na zdjęcie powyżej można wywnioskować, że nie tylko program. No cóż każda twórcza praca wymaga poświęceń. Na szczęście udało się wszystko dość dobrze zamaskować za firanką. Oczywiście zasilacz laboratoryjny też zamieniłem na znacznie mniejszy :).

Rys. 20 Układ sterujący wyświetla czas i temperatury.

Jak widać na powyższym zdjęciu na zewnątrz zbyt zimno nie jest więc nie za bardzo w tej chwili mogę ocenić efekty zastosowanego układu. W związku z ciepłą zimą woda w kaloryferach nie jest też tak bardzo gorąca więc nie ma porównania np. z zimą poprzednią gdy na zewnątrz panowała temperatura -28oC a dotykając kaloryfer można się było zdrowo oparzyć.

Dopóki temperatura na zewnątrz nie spadnie nie mogę przeprowadzić obserwacji zachowań temperatury wewnątrz przy zadanych pozycjach i czasach więc nie bardzo jest sens pracy nad programem. Tak więc na obecną chwilę załączam to co do tej pory powstało:
- Program do sterownika Ver. 1.0 -