Korzystanie z gotowych modułów mikrokontrolerów z wbudowanymi programatorami/debugerami, modułów czujników, zegarów czy innych niezbędnych peryferii pozwala skrócić czas testowania wstępnego. Łączy się je na próbę i jeżeli układ spełnia założenia to projektuje się prototyp na płytce PCB. Komponenty zalegające w szufladzie przy odrobinie chęci można zastosować w przydatnych urządzeniach. Opisywana stacja meteo jest przykładem budowy urządzenia według założenia, że użyte są tylko części z moich zasobów nagromadzonych w szufladach.
Stacja meteo, założenia projektowe
Urządzenie będzie zbudowane z dwu podstawowych elementów: układu wyświetlającego mierzone wielkości pogodowe i układu czujników zewnętrznych zamontowanego na zewnątrz. Oba układy będą połączone dwukierunkowym łączem radiowym (half duplex) pracującym w paśmie ISM. Łącze umożliwia wysyłanie komend wyzwalających wykonywanie pomiarów i przesłanie informacji zwrotnej z wykonanymi pomiarami. W pierwszym etapie będą wykonywane pomiary zewnętrzne: ciśnienia atmosferycznego, wilgotności powietrza i temperatury zewnętrznej. Planowane jest następnie dołączenie czujnika zanieczyszczenia powietrza (smogu). Układ z wyświetlaczem ma za zadanie wyświetlać przesłane pomiary na kolorowym wyświetlaczu TFT oraz mierzyć temperaturę wewnętrzną i w dalszej kolejności czas za pomocą modułu zewnętrznego modułu RTC z podtrzymaniem bateryjnym.
Część pierwsza – układ czujników zewnętrznych
Opisywanie stacji meteo zaczniemy trochę nie typowo, bo od układu czujników zewnętrznych. Zastosowane czujniki to dwa moduły produkowane przez firmę Kamami:
- KAmodLPS331 z wbudowanym czujnikiem ciśnienia LPS331 produkcji STM,
- KAmodHTS221 z wbudowanym czujnikiem wilgotności HTS221 produkcji STM.
W obu modułach wybrano do komunikacji z mikrokontrolerem magistralę I²C. Jest też możliwość komunikacji przez magistralę SPI. Pomimo, że oba te czujniki mierzą temperaturę otoczenia, to pomiaru temperatury zewnętrznej wybrałem niezależny czujnik DS18B20 z magistralą 1-wire. Komplikuje to oprogramowanie, ale daje możliwość łatwego zainstalowania czujnika poza obudową i przez to dużo bardziej wiarygodny pomiar temperatury.
Za komunikację z ze wszystkimi czujnikami oraz modułem łącza radiowego odpowiada moduł ewaluacyjny MPLAB Xpress Evaluation Board z mikrokontrolerem PIC16F18446. Łącze radiowe to dwa moduły TR52D czeskiego systemu łączności IQRF. Nie są już produkowane i nie są polecane do nowych zastosowań, ale są dalej wspierane przez producenta i można je z powodzeniem stosować. TR52D komunikuje się z mikrokontrolerem przez magistralę SPI.
Schemat blokowy połączenia wszystkich modułów został pokaźny na rysunku 1. Testowy układ został zmontowany na kawału płytki uniwersalnej (fotografia 1). Wszystkie połączenia wykonano drutem w izolacji (kynar). Całość jest zasilana napięciem +5 V przez złącze USB modułu mikrokontrolera, a wewnętrzny stabilizator modułu dostarcza napięcia +3,3 V zasilającego wszystkie układy układu czujnika zewnętrznego. Czujnik DS18B20 jest przylutowany na czas testów bezpośrednio do wyprowadzeń na płytce. Docelowo będzie podłączony kablem o długości ok. 1 m i umieszczony na zewnątrz obudowy.
Moduł mikrokontrolera, środowisko projektowe
Moduł mikrokontrolera to jak już wspomniałem MPLAB Xpress PIC16F18446 Evaluation Board. Jest to mała płytka o wymiarach 20×45 mm z wyprowadzeniami umieszczonymi na brzegu dłuższych krawędzi – rysunek 2. Pola lutownicze wyprowadzeń są rozmieszczone co 2,54 mm i możliwe jest wlutowanie standardowych goldpinów o takim rastrze. Ja wlutowałem goldpiny z cienkimi kołkami o przekroju kołowym. Wtedy moduł można połączyć z płytką poprzez podstawkę precyzyjną DIP40.
Na płytce oprócz mikrokontrolera jest umieszczony programator/debugger nDEBUG z interfejsem USB. Co ciekawe nDEBUG jest zbudowany na bazie 32-bitowego mikrokontrolera ATSAMD21 z 32-bitowym rdzeniem ARM Cortex M0+. Na płytce umieszczono również stabilizator napięcia +3,3 V zasilany napięciem +5 V ze złącza USB. Napięcie +3,3 V zasila mikrokontroler, ale również układy sensorów ciśnienia wilgotności i temperatury.
Mikrokontroler PIC16F18446 zgodnie z tym co powiedziałem na początku nie był specjalnie dobierany do wymagań projektu. Został zastosowany, bo był dostępny, ale również dlatego że jego zasoby pozwalały na realizację stawianych mu zadań. A te zasoby jak na 8-bitowy mikrokontroler z prostym rdzeniem są dość spore. Rdzeń może być taktowany z częstotliwością do 32 MHz, pamięć programu FLASH ma wielkość 28 kB (16 ksłów), pamięć użytkowania RAM ma rozmiar 1 kB i dodatkowo nieulotna pamięć danych EEPROM mieści 256 bajtów. Z bogatego zestawu układów peryferyjnych cyfrowych i analogowych (rysunek 3) wykorzystamy tylko dwa moduły komunikacyjne MSSP i jeden timer. Jeden z modułów MSSP zostanie zaprogramowany do pracy jako interfejs I²C, a drugi jako interfejs SPI.
Moduł MPLAB Xpress PIC16F18446 Evaluation Board jest wpierany przez środowisko projektowe MPLAB X IDE. W momencie pisania programu pracowałem na wersji v5.50. Po podłączeniu przez USB MPLAB X IDE wykrywa moduł i umieszcza na liście dostępnych narzędzi (rysunek 4). Można go używać jako programator, lub debugger co znacznie ułatwia uruchamianie programu w układzie z dołączonymi płytkami sensorów.
Kolejną zaletą wybranego mikrokontrolera jest to, że jest stosunkowo nowy i ma wsparcie konfiguratora MCC (MPLAB Code Configurator). Pisze o tym, bo nie jest to takie oczywiste. Microchip usuwa wsparcie dla starszych mikrokontrolerów i modułów ewaluacyjnych w kolejnych wydaniach MPALB X IDE i wtyczki MCC. O ile MCC można jakoś przeboleć, bo przecież obsługę układów peryferyjnych można sobie napisać samemu, to brak obsługi driverów USB dla modułów ewaluacyjnych jest problemem. Przekonałem się o tym przy okazji próby użycia w tym projekcie modułu PIC32 USB Starter kit II. Tu jednak na razie mamy pełne wsparcie i możemy korzystać i z modułu, i z generatora kodu dla układów peryferyjnych MCC.
Kod obsługi sensorów będzie analizowany przy okazji opisu modułów sensorów. Tutaj pokażę, jak skonfigurować bity konfiguracyjne, taktowanie mikrokontrolera i układy komunikacyjne MSSP1 i MSSP2 w konfiguratorze MCC. Na rysunku 5 pokazano konfigurację częstotliwości taktowania wykonywana w zakładce System module wtyczki MCC. Źródłem zegara taktującego jest wewnętrzny oscylator RC o częstotliwości 32 MHz. Ta częstotliwość jest dzielona przez 2 i rdzeń oraz układy peryferyjne są taktowane częstotliwością 16 MHz. Bity konfiguracyjne można zapisywać w zakładce Configuration Bits (rysunek 6).
W kolejnym kroku skonfigurujemy sprzętowy interfejs I²C Master przeznaczony do komunikacji z modułami KAmodHTS221 i KAmodLPS331. Do tego celu użyjemy uniwersalnego modułu komunikacyjnego MSSP1. Moduły MSSP mogą pracować jako interfejsy I²C, lub SPI.
Moduł MSSP1 został skonfigurowany jako interfejs I²C (rysunek 7). W oknie Serial Protocol wybieramy I²C, tryb Master i częstotliwość zegara 100 kHz. Istotnym wyborem jest zaznaczenia opcji Interrupt Driven. Kod obsługi interfejsu I²C może bazować na przerwaniach od tego interfejsu. Cała obsługa pracuje wtedy w tle. Jest to dość skomplikowana część kodu wykorzystująca najprawdopodobniej coś w rodzaju maszyny stanów. Najprawdopodobniej, bo kod wygenerowany przez MCC nie zawiera żadnych komentarzy. Nie są komentowane procedury obsługi przerwania co jakoś można przeboleć, ale nie istnieje żaden komentarz opisujący jak używać procedur komunikacji z urządzeniami slave. Nie wspomnę, że nie ma jakiejkolwiek instrukcji dla generowanych bibliotek. Microchip dostarcza kod, co ważne działający, ale zdaje się mówić: bierz, używaj i nie zawracaj głowy. Kiedy szukałem w Internecie informacji na temat generowanego kodu, to takich szukających było wielu. Równie wielu było zdziwionych taka sytuacją, bo kiedyś tak nie było. Ktoś wysnuł teorię, że kod jest samo komentujący, bo jest tak prosty, że nie ma konieczności go komentować. Trudno się z tym zgodzić. Ostatecznie jakoś się udało i co ważne wygenerowane procedury działają bez problemu.
Moduł MSSP2 został skonfigurowany jako interfejs SPI Master i będzie przeznaczony do komunikacji z modułem radiowym (rysunek 8). Drivery interfejsu SPI pracującego w trybie Master nie przewidują pracy w tle z wykorzystaniem przerwań. Dlatego nie może być zaznaczona opcja Interrupt Driven. SPI może pracować w różnych trybach. Microchip je opisuje jako: MODE0…MODE 3. Wybieramy SPI Mode 0, próbkowanie danych odbieranych w środku czasu trwania aktywnego poziomu sygnału zegarowego. Ostatnim ustawieniem jest częstotliwość zegara określająca prędkość transmisji danych. SPI jest szybkim interfejsem, ale wymagania TR-52 ograniczają maksymalną prędkość transmisji do 250 kb/s. Podobnie jak w przypadku I²C generowany kod praktycznie nie jest komentowany i nie ma do niego żadnej dokumentacji.
Do kompilowania kodu użyjemy bezpłatnej wersji kompilatora MPLAB XC8. Jest w pełni funkcjonalna i nie ma ograniczeń licencji do wykorzystania komercyjnego. Ograniczeniem jest istotne okrojenie możliwości optymalizacji kodu zarówno, jeżeli chodzi o jego rozmiar, jak i szybkość wykonywania. W naszym przypadku nie ma to żadnego znaczenia.
W kolejnej części artykułu omówię sprzętowe i programowe zagadnienia dotyczące działania i komunikacji z zastosowanymi modułami. Jak opisałem na wstępie – stacja meteo jest przykładem budowy urządzenia z części nagromadzonych w szufladach. Dokładne wyjaśnienie działania pozwoli na samodzielną adaptację innych komponentów, które znajdują się w innych szufladach.
Tomasz Jabłoński, EP