Spis treści

Dzięki temu, że moje zainteresowania skupiają się wokół wielu dziedzin ścisłych takich jak chemia, fizyka czy elektronika, mogę w miarę skutecznie próbować je łączyć. Efektem Takiej próby połączenia dziedzin jest urządzenie, które chcę Państwu zaprezentować. Jest to przyrząd, który zrodził się z potrzeby pomiaru ilości gazów powstających w różnych procesach chemicznych i biochemicznych i możliwości obrazowania ich produkcji w czasie. Co z tego wyszło zobaczycie Państwo sami czytając poniższy artykuł.

Pomysł na to urządzenie zrodził się podczas mojej wizyty na targach odnawialnych źródeł energii w Kielcach. Na jednym ze stoisk firma Biogaz Zeneris zaprezentowała laboratoryjne stanowisko do badania procesów beztlenowej fermentacji materii organicznej, która jest źródłem wysokoenergetycznego biogazu bogatego w metan.

Fot. 1 Stanowisko do badania procesów beztlenowej fermentacji metanowej.

Z racji tego, że jestem zwolennikiem odnawialnych źródeł energii, ten temat bardzo mnie zainteresował i postanowiłem sam poeksperymentować z produkcją takiego gazu. Ilość wydzielanego gazu zazwyczaj bada się zbierając go w naczyniach miarowych, poprzez wypieranie zeń wody ale sposób taki ma kilka znaczących wad jak np. niedokładność czy brak możliwości obrazowania w czasie sprawności procesu. Postanowiłem więc zbudować własne urządzenia pomiarowe, które zdolne będzie w sposób autonomiczny i długoterminowy mierzyć sumaryczną ilość powstałego gazu oraz przepływ minutowy i godzinowy oraz wysyłać je na bieżąco do komputera.

Pomysłów było kilka np. cylinder wypełniany wodą z czujnikami poziomu oraz elektronicznie sterowanymi zaworami i pompką. Pojemnik wypełniał by się do pewnej objętości, a po wykryciu jej przełączał by się zawór a pompka wypompowywała by próbkę. Pomysł ten jednak wyparty został przez fragment pewnego urządzenia, które leżało od dłuższego czasu w mojej pracowni. Był to element składający się z silnika krokowego i napędu śrubowego, który mógł się poruszać do przodu i do tyłu w pewnym zakresie.

Fot. 2 Rozmontowany układ napędu liniowego wraz z przygotowaną już do montarzu strzykawką.

Wystarczyło tylko odpowiednio sterować silnikiem by przesuwać zamontowaną na liniowym łożysku ślizgowym belką. I tu właśnie narodził się pomysł zamontowania strzykawki, którą również widać na zdjęciu oraz połączeniu jej tłoka z ruchomą belką. W taki sposób sterując silnikiem mogłem zasysać i wydmuchiwać gaz. Należało jeszcze rozwiązać kilka kwestii m.in.
a) sposób sterowania silnikiem,
b) metodę informowania układu sterowania silnikiem o tym, że należy gaz zasysać czy wydmuchiwać oraz sposób kierowania gazu do i ze strzykawki,
c) sposób odmierzania ilości gazu,
d) interfejs użytkownika i metody wizualizacji,
e) układ elektroniczny i algorytm dla mikrokontrolera.

Ad. 1
Całość układu, jak jego nazwa wskazuje będzie zarządzana w pełni przez mikroprocesor. Należało więc tak dobrać sterownik silnika krokowego, by w możliwie najprostszy sposób mógł współpracować z mikrokontrolerem. Mój wybór padł na sterownik zbudowany w oparciu o parę dedykowanych do sterowania takimi silnikami, układów scalonych - L297 i L298.

Jego zaletą jest to, że do sterowania wystarczy doprowadzić trzy sygnały odpowiedzialne za kierunek, włączenie zasilania cewek i obroty poza tym w żaden sposób nie trzeba obciążać mikroprocesora do generowania odpowiednich sekwencji poruszających wał. Po prostu jeśli silnik ma wykonać pewien obrót w odpowiednią stronę na portach mikrokontrolera należy wystawić odpowiedni stan dla wejścia sterującego DIR - odpowiedzialnego za kierunek oraz odpowiedni stan dla wejścia ENA włączającego zasilanie cewek silnika. Teraz gdy mikrokontroler na wejście CLK będzie podawał impulsy to każdy taki impuls przesunie wał silnika o odpowiedni kont.

W naszym przypadku każdy taki impuls przesunie tłok strzykawki i zassie bądź wydmuchnie, w zależności od stanu wejścia DIR minimalną porcję gazu. Samego sterownika nie będę opisywał w tym opracowaniu bo w Internecie znajduje się wiele wyczerpujących opracować. Powiem tylko, że oprócz wymienionych sygnałów sterujących potrzeba doprowadzić jeszcze zasilanie części logicznej +5V oraz oddzielne zasilanie silnika krokowego maksymalnie napięcie +40 V.

Wspomniany układ sterowania posiada tzw. chopper prądowy czyli przerywacz, który zbudowany jest w taki sposób, aby odcinał dopływ prądu do cewek silnika, gdy przekroczy on zadaną wartość ustawioną za pomocą zamontowanego na płytce potencjometru oraz ponownie włączał. Dzięki temu układowi nie musimy się martwić o napięcie, jakie możemy podać na silnik - w praktyce ustawia się napięcie zasilania na najwyższe dla danego sterownika a tylko za pomocą potencjometru dobiera się dopuszczalny dla danego modelu silnika prąd cewek. Silnik co prawda zasilany jest napięciem przerywanym o dużej częstotliwości ( wyłączanie i włączanie zasilania przez przerywacz) ale nie wpływa to w żaden sposób na jego prace, no może poza charakterystycznym piszczeniem, które w niektórych zastosowaniach może być niepożądane.

Fot. 3 Pierwsze uruchomienie układu napędowego ze sterownikiem silnika krokowego.

Podczas testów ręcznie ustawiałem stany sygnałów wejściowych DIR i ENA oraz z generatora podawałem impulsy taktujące co skutkowało przesuwaniem tłoka strzykawki w jedną lub drugą stronę. Tu oczywiście pojawiła się kolejna kwestia, która należało rozwiązać a mianowicie zabezpieczenie dopuszczalnych granic, w których tłok strzykawki może pracować. Rozwiązaniem było zastosowanie tzw. krańcówek, czyli małych przełączników, które poinformują mikrokontroler o tym, że tłok osiągnął już maksymalne dla danego kierunku położenie i należy zmienić kierunek bądź zatrzymać tłok a przy okazji wykonać inne czynności jak np. przełączenie zaworu zarządzającego kierunkiem przepływu gazu.


Fot. 4 Widok jednej z krańcówek ograniczających ruch ramienia napędowego.

Na zdjęciu nr 4 widać tłok strzykawki, do którego przykręcone jest ramie napędowe oraz jeden z włączników krańcowych, który poda sygnał do mikrokontrolera, gdy ramie znajdzie się w jego zasięgu. Odpowiedni algorytm wprowadzony do mikrokontrolera zareaguje na taki sygnał, ale to opiszę w dalszej części opracowania. Gdyby tej informacji nie było silnik nadal próbował by wysuwać tłok co groziło by uszkodzeniem układu. Pozostałe kwestie dotyczące metody zarządzania pracą silnika napędowego jak np. generowanie sygnału taktującego o odpowiedniej częstotliwości czy np. wyłączanie zasilania cewek podczas bezczynności by oszczędzać energię i nie przegrzewać ich, opisane zostaną w części poświęconej tworzeniu algorytmu dla mikrokontrolera.


Teraz kwestia jedna z najważniejszych w całym układzie - skąd mikrokontroler ma wiedzieć, że w tej chwili gaz należy zasysać i kiedy to zasysanie przerwać. Trochę się nad tą kwestią zastanawiałem i doszedłem do wniosku, że jeśli gaz będzie powstawał w zamkniętej przestrzeni np. reaktora w którym będzie zachodził proces fermentacji metanowej i ten gaz doprowadzimy poprzez zawór do strzykawki, to podczas wydzielania gazu ciśnienie zacznie wzrastać.

 

Jeśli zastosujemy sensor ciśnienia, który będzie doprowadzał do mikrokontrolera sygnał proporcjonalny do ciśnienia panującego w układzie to na tej podstawie można napisać algorytm, który zacznie generować sygnał taktujący sterownik silnika dopiero w momencie wzrostu ciśnienia i przestanie po spadku ciśnienia do jakiegoś określonego poziomu. Ciśnienie zacznie spadać bo po wysunięciu tłoka objętość układu powiększy się, w taki sposób uzyskamy możliwość zasysania do układu pomiarowego produkowany gaz na bieżąco.


Fot. 5 Różnicowy czujnik ciśnienia podczas pierwszego uruchomienia.

Rozwiązanie w teorii zapowiadało się całkiem ciekawie, by przejść do praktycznego sprawdzenia metody musiałem zdobyć czujnik ciśnienia, który możliwie jak najprościej będę mógł zaimplementować w moim projekcie. Zacząłem więc przeszukiwać Internet aż znalazłem ciekawe czujniki produkowane przez firmę Mikrochip. W ich ofercie znajduje się dziesiątki przeróżnych czujników w różnych wykonaniach i na różne zakresy ciśnień, od całkiem znikomych do nawet kilkuset kilopaskali.

Oczywiście poszukiwania mogłem od razu zawęzić do tych o niskim zakresie pomiarowym, ale na tym etapie jeszcze nie wiedziałem jaki dokładnie zakres będzie optymalny. Poza tym ceny tych czujników skutecznie mnie odstraszyły i gdyby nie fakt, że firma Mikrochip wysyła darmowe próbki przyszłość projektu mogła stanąć pod dużym znakiem zapytania. Złożyłem więc zamówienie na kilka czujników o różnych zakresach pomiarowych i ku mojemu wielkiemu zdziwieniu w niecały tydzień kurier był już u mnie. Jeden z takich czujników znajduje się na zdjęciu nr 5.

W czasie poszukiwań odpowiedniego czujnika pojawił się kolejny problem: względności pomiaru. Czy lepiej będzie mierzyć ciśnienie w układzie względem ciśnienia atmosferycznego, czy może lepiej względem wylotu, na którym przecież może zachodzić potrzeba sprężania zebranego gazu np. w balonie i tam ciśnienie też będzie wzrastać. Jeśli będę mierzył w takim przypadku ciśnienie względem ciśnienia atmosferycznego układ nie będzie pracował poprawnie. Wszystkie czujniki zamówiłem więc w technologii dwuportowej tzn. czujnik taki ma dwa wejścia ciśnienia, dzięki czemu możemy zachować względność pomiaru doprowadzając z drugiej strony ciśnienie względem którego mamy dokonywać pomiaru.


Fot. 6 Zasada działania różnicowego czujnika ciśnienia w technologii pojemnościowej.

Budowę takiego dwuportowego czujnika przedstawiłem na rys. nr 6. Metody wykonywania czujników i ich zasada działania jest różna dla różnych technologii stosowanych na różne zakresy ciśnień. Przy ciśnieniach tak małych jak w naszym układzie wykorzystuje się czujniki pojemnościowe. Na powierzchni elastycznej membrany, która wybrzusza się pod wpływem ciśnienia w komorze napylona jest elektroda, która pod wpływem ugięcia zmienia swoją odległość od drugiej, zamontowanej na stałe elektrody i tym samym zmienia się pojemność tak zbudowanego kondensatora.

Zmiana pojemności jest proporcjonalna do panującego ciśnienia. Jeżeli z drugiej strony podamy inne ciśnienie względem którego chcemy dokonać pomiaru to wynik będzie różnicą pomiędzy tymi ciśnieniami. Taki czujnik zawiera już w swojej strukturze odpowiednią elektronikę, dzięki której mamy na wyjściu sygnał napięciowy proporcjonalny do ciśnienia.

Fot. 7 Test czujnika ciśnienia - ciśnienie różnicowe równe 0.

Zdjęcie nr 7 przedstawia test czujnika o symbolu MPXV7002DP. Po włączeniu zasilania 5 V na wyjściu mamy napięcie ok. 2,5 V sygnalizujące ciśnienie różnicowe 0. Teraz jeśli podamy ciśnienie do wejścia P1 napięcie na wyjściu zacznie wzrastać aż do 5 V przy osiągnięciu 2 kPa czyli zakresu maksymalnego. Zakres 2,5 do 0 V będzie na wyjściu dla ciśnienia P2 od 0 do 2 kPa lub też dla P1 w zakresie od 0 do - 2 kPa, dzięki czemu możemy takim czujnikiem mierzyć podciśnienie.

Do tego drugiego portu postanowiłem więc doprowadzić ciśnienie na wylocie układu pomiarowego i dzięki temu w przypadku gromadzenia gazu pod ciśnieniem możemy zapewnić rozpoczęcie zasysania przez strzykawkę dopiero po przekroczeniu ciśnienia na wyjściu. Myślę, że w tym miejscu potrzebny będzie rysunek Nr 8 koncepcji działania układu.

Na przedstawionym schemacie możemy zobaczyć w jaki sposób urządzenie zasysa produkowany gaz, jeszcze co prawda nie mierzy, ale o tym w następnym punkcie. Po włączeniu urządzenia przetwornik A/C mikrokontrolera z dużą częstotliwością będzie próbkował sygnał pochodzący z czujnika. Teraz jeśli napisany algorytm wykryje, że ciśnienie się powiększyło o wartość zaprogramowaną, uruchomi generator, który poda impulsy do sterownika silnika krokowego, co w rezultacie spowoduje wysunięcie tłoka.

Po wysunięciu tłoka ciśnienie spadnie i algorytm wyłączy generator. Podczas testów okazało się, że do układu należy zaimplementować możliwość zadania wartości ciśnienia przy jakim nastąpi zasysanie i histerezy czyli różnicy pomiędzy ciśnieniem rozpoczęcia i zatrzymania. Bez histerezy załączał się i wyłączał bardzo często. Gdy wprowadziłem te dwie możliwości mogłem ustawić wartość ciśnienia rozpoczęcia zasysania np. 0,8 kPa i histerezę np. 0,4 kPa, czyli tłok zaczynał wysuwać się po wzroście ciśnienia do 0,8 kPa i zatrzymywał po spadku do 0,4 pobierając kolejną porcję wyprodukowanego gazu.

 


 


Fot. 9 Widok połączeń strzykawki z zaworem, czujnikiem i kroćcami przyłączeniowymi.

Praktyczną realizację układu z rysunku nr 8 przedstawia zdjęcie nr 9. W układzie zastosowałem plastikowe złączki skręcane oraz trójniki do doprowadzenia wartości ciśnień do sensora. Zakupione złączki przedstawia zdjęcie nr 10.

Fot. 10 Skręcane złączki polipropylenowe zastosowane w urządzeniu.

Złączki w bardzo prosty sposób umożliwiały połączenie układu za pomocą silikonowych węży. Elementem kierującym gaz do strzykawki ze źródła oraz ze strzykawki na zewnątrz będzie elektrozawór trójdrogowy. Taki element udało mi się kupić za grosze na allegro, złącza, które posiadał zastąpiłem zakupionymi wcześniej złączami plastikowymi. Jedyna jego wada to napięcie zasilania, które wynosi 230 V ale i ten problem udało się rozwiązać o czym napiszę w dalszej części opracowania.

Fot. 11 Elektrozawór trójdrogowy sterowany napięciem 230 V.

Wysuwanie tłoka po wzroście ciśnienia o którym wspomniałem wcześniej następowało aż do momentu osiągnięcia krańcówki sygnalizującej wysunięcie maksymalne. Algorytm po wykryciu tego stanu musi zareagować przede wszystkim zmianą stanu wyjścia sterującego DIR, które zmieni kierunek przesuwu tłoka by nie doszło do uszkodzenia oraz przełączeniem zaworu gazu, by możliwy był wydmuch zebranego gazu. Może także wyłączyć sygnał taktujący, ale tylko w przypadku gdy ciśnienie będzie poniżej progu załączenia. Jeśli nadal będzie wyższe, po wydmuchu układ będzie dalej realizował zasysanie.

Ad. 3
Jak dotąd układ zasysa i wydmuchuje gaz na bieżąco w miarę jego powstawania, ale bez informacji o ilości gazu układ byłby całkowicie bezużyteczny. Pierwszym pomysłem na odmierzanie ilości gazu było wykalibrowanie układu w taki sposób że mikrokontroler powinien zliczyć wszystkie impulsy podane do silnika w przedziale od krańcówki sygnalizującej minimum do tej załączającej się przy maksymalnym wychyleniu. Następnie po podzieleniu objętości gazu jaką strzykawka zassie w tym przedziale przez ilość impulsów otrzymamy wynik objętości na impuls.

Tą wartość można by wprowadzić do algorytmu mikrokontrolera, który przy każdym impulsie podanym do sterownika silnika inkrementował by zmienną sumarycznej objętości o tę wartość. W teorii wszystko pięknie, niestety w moim układzie nie każdy impuls podany do sterownika przekłada się na przesunięcie tłoka. Zastosowany napęd śrubowy posiada pewien luz i po zmianie kierunku potrzeba kilkudziesięciu impulsów by rozpoczęło się przesuwanie. Ten luz wprowadzał by zbyt duży błąd. Potrzebowałem rzeczywistego i bardzo dokładnego pomiaru przesunięcia. Postanowiłem więc zastosować enkoder inkrementalny.

Fot. 12 Enkoder inkrementalny o rozdzielczości 2500 impulsów na obrót podczas testów.

Enkoder inkrementalny, który podczas testów przedstawia zdjęcie nr 12 jest to urządzenie, generujące na wyjściach impulsy w momencie obrotu jego osi o pewien minimalny kont (przyrosty kontowe). Cechą charakterystyczną enkodera jest ilość impulsów jaką wygeneruje na wyjściach przy pełnym obrocie osi o 360 stopni. Na tej podstawie można dokładnie pozycjonować elementy obracające się, czy określać ich prędkość, lub przesunięcie. Na ekranie oscyloskopu pokazanego na zdjęciu nr 12 widzimy impulsy, które generuje enkoder w momencie obracania jego osią. Takie enkodery zazwyczaj również są bardzo drogie, ale od czego mamy aukcje internetowe - prezentowany model zasilany napięciem 5 V, posiada wyjścia TTL i rozdzielczość 2500 impulsy/obrót.

Mówiąc o wyjściu impulsów posługiwałem się liczbą mnogą dlatego, że enkoder posiada kilka wyjść. Zazwyczaj jest to 6 wyjść: Kanały A i B, których fazy przesunięte są o 90 stopni, kanał Z, na którym pojawia się tzw. impuls zerowy co jeden pełny obrót, oraz negacje tych trzech kanałów. Przesunięcie sygnałów o 90 stopni wykorzystywane jest do detekcji kierunku obrotu i początkowo w moim układzie miałem taką detekcję wykorzystać jednak podczas testów zrezygnowałem z dodatkowego rozbudowywania układu elektronicznego.

W moim układzie zachodziła konieczność pomiaru przesunięcia liniowego a nie obrotowego, musiałem zastosować więc dodatkową oś, na której zmontowałem drugi trybik i pomiędzy nimi zawiesiłem pasek, który w jednym punkcie połączyłem z tłokiem strzykawki.

Dzięki takiemu rozwiązaniu mogłem przenieść ruch liniowy tłoka na obrotowy enkodera. Teraz wystarczyło sygnał z enkodera wprowadzić do mikrokontrolera, wyliczyć porcję gazu zassanego do strzykawki przypadającą na jeden impuls z enkodera i zapisać w algorytmie funkcje inkrementowania zmiennej objętości gazu przy każdym odebranym impulsie o wyliczoną wartość. W taki sposób podczas zasysania można było od razu dokonywać pomiaru oczywiście, należało w algorytmie zapisać warunek zezwalający na dokonywanie inkrementacji tylko podczas poruszania się tłoka w jedną stronę, w przeciwnym razie wartość zliczonej objętości była by dwa razy większa.

 


 

Można było także wprowadzić detekcję kierunku obracania się enkodera ale wymagało by to zajęcie dodatkowego pinu mikrokontrolera dla drugiego kanału i wykorzystanie bardziej rozbudowanego fragmentu kodu. Testy wykazały, że wprowadzenie warunku zdaje swój egzamin.

Fot. 14 Gotowy napęd strzykawki wraz z układem pomiarowym gazu.

Zdjęcie nr 14 przedstawia już gotowy układ pomiarowy. Jako drugą oś zastosowałem potencjometr wieloobrotowy wymontowany z jakiegoś urządzenia tylko ze względu na fakt, że pasował wręcz idealnie i nie musiałem kombinować z dodatkowymi łożyskami i uchwytem dla nich.

Rozwiązując problem pomiaru, praktycznie wszystkie moje pomysły zdały egzamin, reszta to już aspekty zbudowania elektroniki, zastosowania odpowiedniego mikrokontrolera, wykonanie zasilania, obudowy interfejsu dla użytkownika i dla komputera itd.

Ad. 4.
Zaczniemy może od założeń dotyczących interfejsu użytkownika. Podczas pracy urządzenia użytkownik powinien mieć możliwość obserwowania na bieżąco stanu urządzenia, parametrów pracy jak np. objętości zmierzonej, przepływu, ciśnienia, czasu pomiaru itp. oraz możliwość wprowadzania zmian. Postanowiłem więc zastosować ciekłokrystaliczny, alfanumeryczny wyświetlacz o organizacji 4 x 20 oraz klawiaturę, dzięki, której będzie można poruszać się po menu, które należy zbudować by mieć możliwość wprowadzania parametrów pracy. Postanowiłem też dodać trzy oddzielne przyciski: start, stop i start/stop timera, ponadto w układzie zastosowałem szereg diod LED sygnalizujących stan urządzenia i zadanych trybów.


Fot. 15 Panel operatorski budowanego urządzenia z podłaczoną wtyczką interfejsu RS-232.

Całość urządzenia na początku miałem zamiar umieścić w obudowie, ale moje projekty mają przeznaczenie bardziej edukacyjne niż komercyjne więc odszedłem od tej wersji i całość zamontowałem na płycie z pleksy a panel użytkownika zamknąłem w małej obudowie, którą umieściłem przed całym urządzeniem na nóżkach. Moim zamiarem było zbudowanie urządzenia przypominającego swoim wykonaniem profesjonalne więc chciałem zrobić ładną i estetyczną płytę czołową z klawiszami membranowymi. Gdy sprawdziłem cenę wykonania takiej płyty natychmiast zrezygnowałem i opracowałem własny patent.

Najpierw zaprojektowałem w Corelu wygląd płyty, który widzicie na zdjęciu nr 15. Następnie w programie eagle zaprojektowałem płytkę PCB, z uwzględnieniem wymiarów obudowy, punktów mocujących obudowy i punktów rozmieszczenia przycisków, diod i wyświetlacza tak by po nałożeniu idealnie do siebie pasowały. Zdjęcie nr 16 przedstawia wygląd gotowej płytki PCB. Nie jest to trudne zadanie pod warunkiem określenia w obu projektach punktu odniesienia i podawania pozycji elementów względem tego punktu. Należało by jeszcze wykonać trzeci projekt kodu dla obrabiarki CNC, którą można by wyciąć otwory w samej obudowie, ale to można pominąć odpowiednio pozycjonując na obudowie wydruk z programu eagle i odznaczyć wszystkie otwory a następnie ręcznie je wyciąć.
Fot. 16 Widok zmontowanej płytki PCB panelu operatorskiego.

Wypozycjonowanie wydruku względem punktów mocujących jest bardzo ważne bo przy nawet niewielkim przesunięciu płytka nie będzie pasować co możemy zobaczyć na kolejnym zdjęciu nr 17, gdzie otwory musiałem trochę rozwiercić.

Fot. 17 Panel operatorski bez wydruku frontowego.

Po wycięciu otworów i zamocowaniu płytki przyszedł czas na zajęcie się wydrukiem płyty czołowej z programu Corel. Wydruk najlepiej wykonać na kartce cienkiego papieru o dużej gramaturze, na kolorowej drukarce laserowej. Ważne by jakość wydruku była dobra. Następnie za pomocą nożyka tapicerskiego należy wyciąć okienko na wyświetlacz i złącze D-sub oraz za pomocą dziurkownicy wszystkie otwory pod diody LED. Nie wycinamy otworów pod przyciski. Tak przygotowany wydruk należy zafoliować. Jeżeli zastosujemy przyciski o odpowiedniej długości i tak ustawimy płytkę by wystawały one tylko ok. 0,5 mm powyżej otworu to po przyklejeniu płyty czołowej tylko miejscowo uzyskamy przyciski podobne do membranowych.

Sama płytka PCB nie jest skomplikowana, praktycznie są tam tylko wyprowadzenia połączeń przycisków, diod, wyświetlacza oraz złącza D-sub, dodałem tam też rezystory ograniczające prąd dla diod. Widok mozaiki przedstawia zdjęcie nr 18.

Fot. 18 Widok mozaiki płytki PCB dla panelu operatorskiego.

Wszystkie zakończenia przewodów z płytki połączyłem ze złączem D-SUB z drugiej strony obudowy, tak by można było panel w razie potrzeby odłączyć.

Fot. 19 Połaczenie obwodów panelu ze złączem z tyłu obudowy.

Tak przygotowany panel jest nie tylko estetyczny i poprawia wygląd całego urządzenia ale jest przede wszystkim funkcjonalny. Dzięki przyciskowi OK i czterem kierunkowym użytkownik będzie miał możliwość wyświetlić na ekranie menu i bezproblemowo poruszać się po nim oraz dokonywać zmian. Po wyjściu z menu wyświetlane będą parametry mierzone a dodatkowo za pomocą diod użytkownik będzie informowany o ważniejszych trybach pracy. Podczas tworzenia tego panelu musiałem określić jakie jeszcze funkcje urządzenie będzie posiadać by przygotować ewentualną sygnalizację ich włączenia. Dodałem więc diody informujące np. o kierunku przepływu gazu, włączeniu trybu pompowania, włączenia rejestratora i wysyłaniu danych do PC. Dodatkowo dla wygody umieszczone zostały oddzielne przyciski włączające i wyłączające działanie urządzenia i uruchomienie i zatrzymanie czasomierza. Dodatkowo stany są sygnalizowane diodami LED.

 


 

Ad. 5
Kwestie techniczne już zostały przedstawione, pora zbudować układ elektroniczny, który tym wszystkim będzie zarządzał. Elektronika powstawała na płytce prototypowej równocześnie z rozwojem całego układu. Nie wyglądało to w ten sposób, że najpierw narysowałem schemat i później zacząłem go realizować w praktyce. Było dokładnie odwrotnie - najpierw krok po kroku łączyłem elementy na płytce stykowej a dopiero na samym końcu narysowałem schemat. Na potrzeby tego opracowania najpierw przedstawię Państwu schemat a następnie po kolei opiszę poszczególne jego elementy odnosząc niego (zdjęcie nr 20). Całość programu sterującego napisana została w środowisku Bascom.

Pierwsza kwestia to mikrokontroler - w prezentowanym układzie zastosowałem model ATmega16 firmy Atmel, choć i ten duży układ ma zbyt małą liczbę pinów do obsługi wszystkich elementów układu. Zastosowałem więc dodatkowy układ rozszerzający jego możliwości o nowe piny, który będzie sterował pracą diod LED w panelu sterującym. Układ ten to PCF 8574 jest to sterowany magistralą I2C 8-pinowy port.

Za jego pomocą możemy sterować niezależnie stanem każdego z pinów lub odczytywać ich stan. W układzie wykorzystałem go w funkcji sterowania podłączonymi do niego diodami LED. W ten sposób zajmujący tylko dwa piny mikrokontrolera na magistralę I2C zyskałem 6 dodatkowych pinów wyjściowych co rozwiązało problem braku wyjść mikrokontrolera. Sterowanie diodami podłączonymi do tego ekspandera jest również bardzo proste. Wystarczy w pętli głównej programu umieścić instrukcję wysyłającą bajt rejestru stanu diod - zwykłą zmienną, którą zadeklarujemy w programie:
I2csend &H40 , Diody - instrukcja odświerzająca stan diod LED.

Zmienna ta w każdym nowym cyklu będzie wysyłana do expandera bez względu na to czy zmieni się czy nie. Następnie, by w prosty sposób umożliwić sobie umieszczanie poleceń włączenia lub wyłączenia konkretnej diody w różnych miejscach programu można nazwać poszczególne bity zmiennej i używać w programie już tych przyjaznych nazw:

Dstop Alias Diody.0
Dtimer Alias Diody.1
Dtransmisja Alias Diody.2
Dprzeplywba Alias Diody.3
Dprzeplywab Alias Diody.4
Drejestrator Alias Diody.5
Dpomiar Alias Diody.6
Dpompa Alias Diody.7
Config Pina.7 = Output
Set Porta.7
Dstart Alias Porta.7


Dziewiąta dioda zastosowana w panelu będzie sterowana już bezpośrednio z portu mikrokontrolera.
Następny element układu elektronicznego, który zastosowałem to pamięć trwała. Pomiary ilości i przepływu gazu w badaniach biochemicznych czy innych podobnych zazwyczaj trwają dość długo, nawet kilka miesięcy. By możliwe było zobrazowanie produkcji gazu podczas całego badania, trzeba by mieć cały czas włączony komputer i na bieżąco odbierać dane. Postanowiłem więc wbudować w układ pamięć i zbudować rejestrator, który gromadził by dane a dopiero po skończonym badaniu można by je szybko przesłać przez port RS-232.


Fot. 20 Schemat ideowy płyty głównej miernika gazu (kliknij na zdjęcie by powiększyć).

Ponadto podczas tak długich badań należy się liczyć z możliwością jakiejś awarii bądź zaniku prądu, postanowiłem więc wykorzystać tę pamięć do podtrzymania informacji o sumarycznej ilości wyprodukowanego gazu. Po każdym włączeniu urządzenia algorytm najpierw odczytuje wartość zmiennej odpowiadającej za objętość a później inkrementuje ją i każdą zmienioną wartość cały czas zapisuje tak, by w razie nagłego wyłączenia jej nie stracić.

Zastanawiałem się jaką pamięć zastosować w układzie, na początku myślałem o trwałych pamięciach EEPROM, ale niestety mają ograniczoną liczbę zapisów a w moim układzie pamięć będzie zapisywana nawet kilkanaście razy na sekundę. Musiałem więc skorzystać z pamięci typu RAM, którą można zapisywać praktycznie w nieskończoność. Niestety po zaniku zasilania dane uległy by skasowaniu więc musiałem zapewnić takiej pamięci podtrzymanie bateryjne. Mój wybór padł na układ firmy Microchip o symbolu 23K256, jest to bardzo ciekawa pamięć RAM o pojemności 256 KB, którą w bardzo prosty sposób można zapisywać i odczytywać poprzez magistralę SPI.

Wada jej jest taka, że jej napięcie zasilania wynosi 3,6 V i do sterowania należy również wykorzystać takie poziomy napięć. Problem ten w prosty sposób rozwiązałem stosując dzielniki napięcia na wejściach SCK, MOSI i CS oraz konwerter napięcia zbudowany z tranzystora T1 i rezystora R6 na wyjściu MISO. Teraz czas na baterię, która podtrzyma zasilanie pamięci w momencie zaniku zasilania urządzenia. Zastosowałem baterię G1 o napięciu 3,6 V, którą zasiliłem przez dwie diody D1 i D2 ze źródła układu 5 V, spadki napięć na diodach obniżyły napięcie zasilania do 3,6 V a rezystor R2 ograniczał prąd ładowania baterii podczas normalnej pracy urządzenia. Ponadto diody zabezpieczały baterię przed wypływem prądu w kierunku zasilania po zaniku napięcia. Baterię połączyłem z układem pamięci RAM na płytce testowej a sam układ z mikrokontrolerem i rozpocząłem próby zapisów i odczytów. Zdęcie 21 przedstawia pomiar napięcia podczas pracy z sieci.

Fot. 21 Pomiar napięcia baterii w trakcie pracy z sieci.

Samej procedury i konfiguracji interfejsu SPI nie będę opisywał bo informacji na ten temat jest mnóstwo. Co natomiast zrobić by móc coś zapisać i odczytać z tej pamięci ?. Z pomocą przychodzi nam oczywiście karta katalogowa.

Fot. 22 Sekwencje na liniach sygnałowych podczas zapisu i odczytu pamięci.

Na zdjęciu nr 22 widzimy sekwencje na wszystkich 4 liniach sygnałowych łączących mikrokontroler z pamięcią. Pierwsza linia CS, którą obsługujemy bezpośrednio w mikrokontrolerze informuje pamięć, że mamy zamiar wykonać jakąś operację. Każda operacja na pamięci 23k256 musi się odbywać przy niskim stanie lini CS. Po ustawieniu linii w stan niski wysyłamy z mikrokontrolera poprzez interfejs SPI pierwszy bajt - jest to bajt instrukcji różny dla każdej czynności, którą mamy zamiar wykonać. Kolejne zdjęcie nr 23 przedstawia wartości tego bajtu dla możliwych czynności.

Fot. 23 Opis pierwszego bajtu instrukcji, jaki należy wysłąć do pamięci.

Oczywiście ten bajt może mieć jeszcze inne wartości dla różnych trybów pracy, ale tego nie będę opisywał w tym opracowaniu. Zainteresowanych odsyłam do karty katalogowej. Następne informacje jakie wysyłamy to dwa bajty adresu pod który mamy zamiar coś zapisać lub odczytać i wreszcie bajt zmiennej do zapisu lub odczytu. Teraz przedstawię fragmenty kodu, dzięki którym wreszcie będziemy mogli przeprowadzić na pamięci jakieś operacje. Po pierwsze wpisujemy informacje konfiguracyjne interfejsu SPI:

Config Pina.1 = Output
Set Porta.1
Cs Alias Porta.1
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1
Spiinit


Następnie tworzymy zmienne zapis i odczyt (wcześniej je deklarując) i wpisujemy im wartości instrukcji odczytu i zapisu by się nie myliły i by łatwo można je było stosować:

Zapis = 2 Odczyt = 3

Teraz deklarujemy zmienną typu Word o nazwie adres i dzielimy ją na dwie zmienne typu byte bo niestety przez SPI możemy w jednej porcji przesłać tylko jeden bajt a adres jest dwubajtowy:

Dim Adres As Word
Dim Adresa As Byte At Adres Overlay
Dim Adresb As Byte At Adres + 1 Overlay


Sekwencja zapisu zmiennej bajtowej Test pod adresem 0 będzie wyglądała następująco:

Adres = 0
Cs = 1
Cs = 0
Spiout Zapis , 1
Spiout Adresa , 1
Spiout Adresb , 1
Spiout Test , 1
Cs = 1


Analogicznie jeśli tę zmienną chcemy odczytać spod adresu 0:

Adres = 0
Cs = 1
Cs = 0
Spiout Odczyt , 1
Spiout Adresa , 1
Spiout Adresb , 1
Spiin Test , 1
Cs = 1


W ten sposób do zmiennej test zaczytamy wartość zapisaną w pamięci pod adresem 0.

 


 

Wszystko działało bez zarzutu aż do momentu sprawdzania jak układ zachowa się po zaniku zasilania. Zapisałem więc pamięć i wyłączyłem układ na noc. Rano okazało się że bateria jest całkowicie rozładowana a pamięć, rzecz jasna skasowana. Co się okazało? po wyłączeniu układu, pamięć pobierała z baterii prąd o wartości 1,6 mA więc nic dziwnego, że bateria padła.


Rys. 24 Pomiar prądu pobieranego przez pamięć po zaniku zasilania.

Zacząłem zastanawiać się dlaczego tak się dzieje skoro w karcie katalogowej zapisany był pobór prądu spoczynkowego na poziomie pojedynczych ľA. Po wielu próbach okazało się, że układ pobiera taki znikomy prąd ale tylko wtedy jeżeli stan na linii CS jest wysoki a po wyłączeniu mikrokontrolera stan był niski. Połączyłem więc ręcznie CS do baterii podtrzymującej i wartość prądu spadła ale jeszcze nie wystarczająco do wartości katalogowej.

Fot. 25 Pobór prądu przez pamięć po podciągnięciu pinu CS.

Problem tkwił jeszcze w rezystorze dzielnika napięcia R4 przez który prąd z baterii wypływał do masy po ręcznym podłączeniu CS do baterii. Dłuższą chwilę nad tym myślałem aż wpadłem na pomysł zastosowania małego przekaźnika K1. Na schemacie możecie Państwo zobaczyć jak w prosty sposób problem można było rozwiązać. Otóż cewkę przekaźnika połączyłem bezpośrednio z zasilaniem co powodowało, że po włączeniu urządzenia styki od razu się przełączały. Teraz wejście CS pamięci poprzez rezystor R3 dzielnika napięcia połączyłem ze złączem P2 przekaźnika K1. Jego złącze spoczynkowe O2 połączyłem z dodatnim biegunem baterii a S2 do portu mikrokontrolera.

Teraz jeśli układ jest wyłączony to złącze CS zawsze będzie podciągnięte do zasilania układu i będzie w stanie spoczynku, natomiast po włączeniu zasilania przełączy się na port PA.1 mikrokontrolera, który już będzie nim zarządzał. Pozostał jeszcze problem upływu prądu z baterii poprzez rezystor R4 dzielnika gdy podciągniemy CS do +. W przekaźniku mamy jeszcze jeden komplet styków więc pin CS poprzez rezystor R4 połączyłem ze złączem P1 przekaźnika a złącze S1 do masy, O1 pozostało niepodłączone. Zabieg ten sprawia, że w stanie spoczynku rezystor rozdzielony jest od masy i prąd przez niego nie wypływa. Dopiero po włączeniu zasilania pin jest zwierany do masy układu.

Proste rozwiązanie i jakże skuteczne, zdjęcie nr 26 pokazuje pobór prądu przez RAM w stanie spoczynku po zastosowaniu przekaźnika. Wynosi on tylko 1,6 ľA i może zapewnić podtrzymanie pamięci całymi tygodniami przy całkowicie naładowanej baterii.

Fot. 26 Znikomy prąd pobierany przez Pamięć po zaniku zasilania i zastosowaniu przekaźnika.

Szczegółów dotyczących obsługi pamięci już w produkcyjnej wersji oprogramowania nie będę w tym miejscu opisywał bo trudno jest to zrobić w oderwaniu od całości programu. Postaram się kod, który stanowi załącznik do opracowania wzbogacić bardzo rozbudowanymi komentarzami dzięki czemu każdy fragment będzie można zrozumieć.

Na schemacie znajduje się jeszcze układ MAX 232, który odpowiedzialny jest za konwertowanie sygnału z UART mikrokontrolera do standardu RS-232 tak, by można go było odebrać przez komputer PC.

Fot. 27 Połaczenie mikrokontrolera z komputerem PC za pośrednictwen interfejsu RS-232 - odbiór danych w terminalu.

Jest też pokazany schemat połączeń wyświetlacza LCD, złącza ISP, czujnika ciśnienia do przetwornika A/C, buzzera oraz złączy do przyłączenia panelu operatorskiego. Jest też pokazany układ OK1, jest to transoptor, który będzie odpowiedzialny za sterowanie opisanym wcześniej zaworem trójdrogowym, zasilanym napięciem 230 V. Do jego sterowania postanowiłem wykorzystać przekaźnik z cewką zasilaną napięciem 5 V. By nie uszkodzić portu mikrokontrolera napięciem samoindukcji cewki zastosowałem wspomniany transoptor wraz z tranzystorem T2, wyjście PZ będzie służyło do przyłączenia cewki przekaźnika, która znajdzie się w module zasilania opisanym w dalszej części. Przeznaczenie złącz Sl 1 do sl4 można rozpoznać analizując kod programu. Trudno w opisie układu mikroprocesorowego wszystko dokładnie przedstawić, bo opis taki musiał by być naprawdę długi. W każdym bądź razie w trakcie prac na płytce stykowej cały układ jak i program dla mikrokontrolera ulegał ciągłej rozbudowie o nowe funkcje, jak widać na zdjęciu nr 28 na początku klawiatura, wyświetlacz i wszystkie diody również łączone były na pająka.

Fot 28 Ukłąd miernika zmontowany na płytce prototypowej.

Po wykonaniu panelu operatorskiego, układ zaczął już nabierać wyglądu i mogłem wreszcie zacząć tworzyć menu i w prosty sposób je testować jak i całe oprogramowanie sterujące urządzeniem bez ciągłych awarii i szukaniu w Goszczu przewodów tego, który właśnie się wysunął.

Fot 29 Przyłaczenie gotowego panelu operatorskiego do płytki prototypowej.

Choć i ta plątanina ze zdjęcia nr 29 nie była bezawaryjna, praktycznie w takiej formie udało mi się napisać większą część oprogramowania dla urządzenia, w międzyczasie projektując płytki w programie Eagle. Napisałem płytki, bo jak widać cały czas korzystam z zasilacza laboratoryjnego a w urządzeniu docelowym było by to raczej mocno nie praktyczne. Drugi obwód drukowany, jaki powstał na potrzeby tego projektu zawierał dwa niezależne zasilacze o napięciach: stabilizowane 5 V dla całego układu, który przedstawiłem powyżej oraz 35 V niestabilizowane dla układu sterownika silnika krokowego.

 


 

Na tej płytce znalazł się również przekaźnik sterowany ze złącza PZ, który załączał napięcie 230 V dla cewki zaworu trójdrogowego. Schemat tego układu zasilania przedstawia zdjęcie nr 30.

Fot. 30 Schemat ideowy obwodu zasilania urządzenia.

Projekty płytek zrobiłem w taki sposób by można było je skręcić na elementach dystansowanych, jedna na drugiej jak kanapkę. Zabieg taki miał na celu zaoszczędzenie trochę miejsca w układzie a poza tym wykorzystałem całe dostępne pole projektowanej płytki dla darmowej wersji programu i tak naprawdę z dużym trudem udało się wszystko upchnąć. Płytka zasilacza była mniej kłopotliwa, niestety nie da się tego powiedzieć o płytce z mikroprocesorem, musiałem zastosować technologię dwuwarstwową. Obraz mozajek obu płytek przedstawiają zdjęcia nr 31 i 32.

Fot. 31 Widok mozaiki płytki PCB obwodu zasilania.


Fot. 32 Widok mozaiki płyty głównej urządzenia.

Gdybym nie stosował technologii dwuwarstwowej zapewne wykonał bym płytki metodą termo transferową, jednak ze względu na ten fakt zwróciłem się do Redakcji Elektroniki Dla Wszystkich z prośbą o wykonanie płytek PCB wg. mojego projektu, oczywiście zgodzili się i po niedługim czasie płytki były już u mnie.

Fot. 33 Widok zmontowanej płyty głównej urządzenia.


Fot. 34 Widok zmontowanej płyty zasilacza urządzenia.

To moje pierwsze, profesjonalne płytki dlatego po zlutowaniu gapiłem się na nie dość długo więc żona zapytała czy przypadkiem nie powinienem wybrać się do jakiegoś lekarza. Niestety, piękno takich własnych konstrukcji mogą dostrzec tylko elektronicy.

Po zmontowaniu płytek mogłem wreszcie pozbyć się tej choinki, którą widzieli Państwo na poprzednich zdjęciach i połączyć wszystkie elementy za pomocą złączek. Nie tylko wyglądało to dużo lepiej, ale przede wszystkim mogłem już bez nerwów pisać dalsze części oprogramowania. Jak Państwo za pewne się domyślili całość prac wykonałem w kuchni wieczorami i niestety żona nie pozwalała mi zostawić tego pęku przewodów na stole po skończeniu prac na cały kolejny dzień. Wszystko wyglądało więc tak, że czasami grubo po 2 w nocy musiałem wszystko rozmontowywać i pakować do swojej szafki a następnego wieczoru znów składać.

Fot. 35 Urządzenie po zastąpieniu płytki prototypowej dedykowanymi płytkami PCB.

Czasami zanim zacząłem właściwą pracę sporo czasu poświęcałem na wyszukiwanie błędu w połączeniu lub jakiejś przerwy bo po włączeniu coś tam nie działało. Taki los konstruktora bez własnej pracowni, ale może już niedługo. Dalsze prace polegały na zmontowaniu całości na grubej płycie pleksy, podłączeniu zasilania, włącznika i bezpiecznika, wykonaniu uchwytu na króćce wlotowy i wylotowy, uchwytów na panel i innej kosmetyki.

Fot. 36 Doprowadzenie zasilania oraz widok zamontowanych krućców.


Fot. 37 Widok gotowego urządzenia.

Fot. 38 Widok urządzenia podczas testów - pomiar ilości CO2 wydzielanego w procesie fermentacji.

Myślę, że udało mi się opisać wszystkie najważniejsze aspekty konstrukcyjne prezentowanego urządzenia. W niedługim czasie postaram się przedstawić Państwu kod programu i dalsze sprawozdanie z prac wykonywanych na tym urządzeniu łącznie z filmem, bo tylko w taki sposób będzie można zobaczyć jak ono działa.

Urządzenie sprawuje się całkiem nieźle i okazało się, że ma naprawdę dużą dokładność. Jak się później okazało może służyć także do ilościowego określania stężenia alkoholu w procesie fermentacji cukrów na podstawie ilości wydzielonego CO2, ale o tym już w innej publikacji.