
... wykorzystany jako anemometr. Jakiś czas temu zbudowałem stację meteo wyposażoną w interface ethernet (która już miała z 4 inkarnacje elektroniki i dwie obudowy). Stacja mierzy wiele parametrów (temperaturę, pył zawieszony, ciśnienie, promieniowanie słoneczne i inne), brakuje jej jednak 2 przydatnych w stacjach meteo mierników, opadów - ale tutaj nie mogę się dalej zdecydować czy chce akustyczny miernik, który poza deszczem potrafi wykrywać grad, ale śnieg przegapi, czy klasyczny, który grad przegapi, a śnieg zauważy... ale jak się stopi. Jest za to banalny w konstrukcji. Prościej było mi się zabrać się za miernik prędkości wiatru. Do dyspozycji są praktycznie dwie sensowne metody, klasyczna z kopułkami i osobnym wskaźnikiem kierunku, lub wersja "solid state", ultradźwiękowa.
Pierwsze są proste, tanie i typowe, ale mają jedną zasadniczą zaletę - są odporne na turbulencje. A powietrze prawie nigdy nie płynie laminarnie. A drugie są po prostu ciekawsze i bardziej kompaktowe. Za to obie wersje, kupione gotowe mają dla mnie zasadniczą wadę, nie dadzą się zainstalować na już istniejącej stacji. Zatem, wypada skonstruować własny.
W momencie kiedy zabierałem się za ten projekt w sieci istniał przynajmniej jeden opis tego typu urządzenia. Projekt ten jest jak na moje oko, niepotrzebnie skomplikowany, ale działa, więc jakby go trochę przekonstruować, uprościć, pozbyć się miliona potrzebnych napięć czy elementów dyskretnych a jednocześnie zintegrować z istniejącym systemem...
Tak powstało to urządzenie:


Pasuje "na kanapkę" do istniejącego układu stacji meteo (widoczny pod spodem), nie powiększając wymiarów obudowy, przez co jedyne co trzeba było zrobić to wydrukować dwa nowe górne poziomy stacji i je wymienić.
Jest kilka metod, którymi można zmierzyć przepływu, do pomiaru czasu lotu do pomiaru przesunięcia częstotliwości sygnału. Teoretycznie najprościej, wysłać jakiś dźwięk w medium, zmierzyć czas jaki będzie potrzebny aby dotarł do odbiornika i z tego czasu, a także znanej odległości między nadajnikiem a odbiornikiem można wywnioskować prędkość z jaką porusza się medium. Prędkość rozchodzenia się fali jest stała dla zadanej temperatury i danego medium. Tylko temperatura jest zmienna. Można zatem albo zainstalować termometr, w końcu to stacja meteo, i tak go posiada, albo zmierzyć prędkość dźwięku w obu kierunkach. Ostatnia opcja wydaje się najlepsza, można przy okazji ustalić jaka jest temperatura z uzyskanych prędkości i użyć tego do weryfikacji względnej poprawności wyników.
Konfiguracji w jakich można zbudować tego typu urządzenie jest wiele. Wersja z trzema przetwornikami rozstawionymi co 120 stopni jest kusząca, ale wymaga bardziej skomplikowanego mechanizmu routingu sygnału, oraz podwójnego wzmacniacza i ADC/komparatora. Podwójny ADC/komparator dla STM32F303 na którym to urządzenie jest zbudowane to nie problem, ale drugi dwustopniowy wzmacniacz byłby problematyczny przy wybranej obudowie układu. Wspominany STM ma ich co prawda 4, ale część z nich staje się niedostępna jeśli używamy niektórych innych peryferiów.
F303 pracuje bez zewnętrznego kryształu, co pozwala na uzyskanie maksymalnego taktowania wynoszącego 64MHz. Schemat taktowania poszczególnych peryferiów wygląda następująco:

Kanał pierwszy TIM8 został skonfigurowany tak aby nadać określoną liczbę impulsów o częstotliwości 40KHz.
Właściwe impulsy wysyłane są do kanału za pomocą DMA i ich liczba w obecnym stanie może wahać się od 3 do 16, jest zależna od odległości między przetwornikami. Po opuszczeniu mikrokontrolera, sygnał routowany jest przez układ 74HC4052 do sterownika MOSFETów IR4426 (zasilanych z +12V). Te na wyjściach mają podłączone P-MOSFETy, których funkcją jest odpięcie sterownika od przetworników, w innym wypadku sterowniki wymuszały by ustalony stan linii odbiorczej, przez co odebranie czegokolwiek byłoby niemożliwe. "Odpięcie" jest realizowane automatycznie przez drugą połówkę wspomnianego 4052. Kiedy linia prowadząca do przetwornika jest w stanie niskim, podanie napięcia +3v3 na bramkę p-MOSa efektywnie go zatyka, co umożliwia odbiór.

Odebrany sygnał trafia na drugi 4052, którego zadaniem jest przełączenie przeciwnego do nadającego przetwornika do wejścia wzmacniacza, zbudowanego na wbudowanych w F303 OPAMPach, ustawionych w tryb "standalone". Tutaj pojawia się mały problem, sygnał podany na wejścia w/w wzmacniaczy nie powinien spaść poniżej GND, a tak właśnie się stanie, ponieważ nóżki ujemne wszystkich przetworników są podłączone do masy układu. Dlatego raz, że wszystkie 4052 zasilane są symetrycznym napięciem +/- 3v3, a dwa, wymagane jest przesunięcie odebranego sygnału do akceptowanego poziomu przed podaniem go na wzmacniacze. Użyte napięcie odniesienia tworzone jest albo za pomocą 1,8V diody zenera D1 wraz z R26 albo za pomocą dzielnika rezystorowego złożonego z R26 i R27. Właściwe przesunięcie realizuje C6 wraz z R23, w całym późniejszym etapie wykorzystywane jest tylko jedno, wspólne dla wszystkich napięcie odniesienia.
Pierwszy stopień wzmacniaczy, zbudowany na OPAMP2 jest na stałe zablokowany na wzmocnieniu ustawionym przez R24 i R25. Wynosi ono w obecnej wersji 48x. Z wyjścia pierwszego stopnia sygnał podany jest na wejście stopnia numer dwa OPAMP3, tam wzmocnienie jest regulowane za pomocą IC9, MCP4531. Jest to cyfrowy potencjometr o wartości 10k i 128 krokach. Mikrokontroler może z jego pomocą regulować wzmocnienie drugiego stopnia od 1 do około 128x. Co daje sumaryczne wzmocnienie układu na poziomie < 6144x (wartość możliwa, ale w praktyce nieużywalna). Niestety wzmacniaczy w STM nie da się wykorzystać w opisywanym układzie w trybie PGA, przez co wymagają zewnętrznych elementów ustalających wzmocnienie.


Tak wzmocniony sygnał trafia na szybki, wbudowany komparator COMP3 oraz wejście ADC1-1 pracujące w trybie róznicowym.
Po nadaniu zadanej liczy impulsów uruchamiany jest ADC, który przy prędkości ~5Msps/s "łapie" 4096 sampli przy użyciu DMA. W tym samym czasie, także przy użyciu DMA, TIM4 ustawiony na taktowanie pełna prędkością rdzenia łapie czasy 64 przejść sygnału przez zero podane z COMP3 oraz, zapisywane już "ręcznie" z poziomu przerwania kanału drugiego tegoż licznika, pozycję danego przejścia przez zero w tablicy przechowującej dane z ADC. Po zakończeniu pracy ADC wyzwalane jest przerwanie DMA, w którym następuje obróbka odebranego sygnału:

Początkowo wpadłem na genialny pomysł znalezienia maksimum, po prostu szukając maksimum, ale jako, że szum:

Powiedzmy, że nie była to 100% skuteczna metoda. Dlatego finalnie sygnał jest korelowany ze znanym poprawnym sygnałem za pomocą "matched filter", jakkolwiek nazywa się to po polsku. To pozwala ustalić gdzie zaczyna się poprawny sygnał, a to pozwala na ustalenie które przejścia przez zero powinny być użyte. (liczba impulsów)*2 czasów przejść przez zero jest uśrednianych aby ustalić "czas lotu" sygnału. Na tym etapie pozostaje tylko kilka prostych operacji arytmetycznych aby ustalić czas lotu w mm/s (bo odległość transmiterów tez podana jest podana w mm).
Takich wartości zbieranych jest 25 dla każdego kierunku (N->S, E->W, S->N, W->E), 100/s. Z tego wyliczana jest średnia prędkość w kierunkach przetworników, co daje dwie wartości prędkości wiatru, z których ustalana jest faktyczna prędkość, kierunek i temperatura.
Z braku tunelu powietrznego kalibracja wykonana jest w odwrotną stronę, suwmiarką. Układ potrafi podać odległości przetworników z dokładnością do 0,01mm, więc jeśli to co podaje pokrywa się z tym co zmierzone, to raczej oznacza, że pracuje poprawnie. Choć nie jest jest idealnie stabilny przy całkowicie spokojnym powietrzu. Przy zerowym wietrze, w pomieszczeniu pokazuje wartości ~0,2-0,3m/s, dlatego wartości < 0,5m/s powinny być zignorowane, z drugiej strony jest na tyle czuły, że wykazuje ruch powietrza kiedy się koło niego przechodzi.

Od strony komunikacyjnej posiada opcję używania portu szeregowego, I2C lub RS485. W chwili obecnej zaprogramowany jest tylko slave i master I2C, gdyż ten prototyp został głównie pomyślany jako dodatek do już istniejącej stacji meteo, a że oprogramowanie stacji jako takie jest identyczne dla wszystkich moich domowych czujników i wyświetlaczy, to właśnie używając I2C najlepiej mu wykrywać co jest do niej podłączone a co nie. Choć jakby chcieć, można by używać wiatromierza jako "standalone" bez głównego układu stacji. Na płytce przewidziane jest miejsce na magnetometr, do automatycznej orientacji układu w przestrzeni. Co prawda ewentualne zaprogramowanie potrzebnych parametrów trzeba zrobić tylko raz, to jednak jak nie trzeba tego robić to zawsze wygodniej. Magnetometr HMC5883L na chwilę obecną zainstalowany nie jest, gdyż jest zainstalowany w stacji meteo jako takiej, dzięki czemu stacja sama wprowadza poprawkę w orientacji przetworników względem magnetycznej i prawdziwej północy mając wpisaną deklinację w EEPROMie.
Zasilanie - nic ekstrawaganckiego, w tej wersji LM1117 dla napięcia 3v3 oraz nieregulowany TPS6040x dla -3v3.

Układ regulacji 3v3 nie jest zainstalowany gdyż MCU w tej wersji pobiera prąd bezpośrednio z linii 3v3 stacji, która używa TPS54140 lub podobnych. Nie ma zatem potrzeby dublowania układów robiących o samo w obu urządzeniach. Całość składa się "na kanapkę" z użyciem dedykowanego do tego celu złącza aux. Mieści się to do już istniejącej obudowy. Jedyne co trzeba było zrobić to, z oczywistych względów, zaprojektować nowe dwa górne poziomy obudowy, tak aby umożliwiły instalację 4 16mm rurek PVC do ciśnieniowych instalacji wodnych, na których szczycie umieszczone są obudowy szczelnych przetworników ultradźwiękowych, dodatkowo uszczelnione silikonowymi uszczelkami aby woda nie przeciekała do rurek. Wszystkie plastiki zaprojektowane z użyciem blendera:



Wydrukowane na domowej roboty drukarce 3D z białego PET-u. Minus tej konstrukcji to niewielka odległość między przetwornikami, ledwie 90mm, przez co liczba pulsów ograniczona jest do 6. Z drugiej strony, mała odległość oznacza względnie mocny sygnał powrotny (a ten przy szczelnych przetwornikach jest bardzo, bardzo słaby, rzędu 3mV). Ale póki nie wystąpią jakieś huragany, to ten prototyp będzie działał poprawnie. Zostanie na miejscu do dalszych eksperymentów póki z PCB-fabu nie wrócą płytki do miejmy nadzieję finalnej wersji, która w odróżnieniu od tej ma 3 stopniowy wzmacniacz o całkowitym (i miejmy nadzieję używalnym) wzmocnieniu 10240 (10x32x32) zbudowana na 2 PGA Microchipa, jeden 4052 mniej i TLE4207G jako drivery przetworników.
A wyświetlanie wyników... w sumie całkiem osobny sprzęt. Bazującym na tym:

STM32F107 + KSZ8081RNA i kilka innych pierdołek, można na tym zrobić:


Taki oto panel, który pokazuje informacje ze stacji, lub innych domowych czujników. Albo UPS:

Sumarycznie, koszt całości to około 300zł w samych częściach, w czasie poświęconym na zabawę pewnie trochę więcej. Ale co się człowiek nauczył to jego. I tak wychodzi taniej niż 700$ za produkt komercyjny, którego i tak nie zintegruję z istniejącym systemem tak jak bym chciał. Kodu i źródeł płytek nie udostępniam, może jak skończę deszczomierz to zrobię z tego wszystkiego coś komercyjnego, a jak nie to się zastanowię nad open source. Ale na pytania chętnie poopowiadam.

Cool! Ranking DIY