Urządzenie składa się z dwóch modułów: nadawczego (nadajnik sygnału radiowego) i odbiorczego (odbiornik sygnału radiowego).
Na rysunku 1 pokazano schemat elektryczny nadajnika. Jego konstrukcja jest oparta na 8-nóżkowym mikrokontrolerze PIC12F1822 (U2). Układ należy do nowszej wersji mikrokontrolerów w linii produktowej PIC12. Ma poszerzony zestaw instrukcji (do 49) oraz jest wyposażony w kilka ciekawych (jak na tę rodzinę) peryferiów: USART, I²C, SPI, CPS (moduł sterujący dla dotykowych czujników pojemnościowych), DSM (cyfrowy modulator sygnałów), SR latch (przerzutnik RS, który może być wykorzystany jako timer), DAC (przetwornik cyfrowo-analogowy) oraz FVR (trzypoziomowe źródło napięcie odniesienia: 1,024 V; 2,048 V; 4,096 V [5]).
Główne zadania mikrokontrolera to:
- Pomiar napięcia z czujnika (U3) za pomocą wyprowadzenia RA2/AN2.
- Wysyłanie danych do nadajnika sygnału radiowego (wyprowadzenie RA4 - TX).
- Pomiar napięcia baterii/akumulatorka - wyprowadzenie RA0/AN0.
- Sterowanie układem zasilania czujnika i nadajnika sygnału radiowego - wyprowadzenie RA1/AN1.
Rezystor R3 jest niezbędny do poprawnej pracy układu zerowania (wyprowadzenie MCLR) mikrokontrolera. Kondensator C5 służy do filtrowania napięcia zasilania +3,3 V. Punkty testowe oznaczone TP1...TP5 są przeznaczone do programowania mikrokontrolera. W tabeli 1 przedstawiono sposób połączenia punktów testowych z programatorem. Interfejs jest kompatybilny z programatorem PICkit-3.
W pierwszej wersji urządzenia w roli czujnika temperatury zastosowano układ LM35, który ma napięcie wyjściowe proporcjonalne do temperatury otoczenia. Współczynnik skali wynosi +10 mV/°C. Czujnik jest fabrycznie skalibrowany i zależnie od wersji jego dokładność waha się od ±1 do ±2°C (w pełnym zakresie temperatury pracy). Dla temperatury zbliżonej do wartości 25°C dokładność nie przekracza ±1°C. Czujnik jest produkowany m.in. w obudowie typu TO-92, co umożliwia łatwe przedłużenie wyprowadzeń za pomocą przewodów, gdy na przykład, czujnik będzie montowany w innym miejscu niż płytka nadajnika.
W trakcie uruchamiania prototypu okazało się, że minimalne napięcie zasilające wymagane do prawidłowej pracy czujnika to 4 V. Wymusiło to konieczność zasilania układu z 5 V, co znacząco wpłynęłoby na całkowity pobór prądu modułu nadawczego. Ponieważ czujnik LM35 mierzy temperaturę od około 2°C (do 100°C przy zakresie napięcia wyjściowego od 20 mV do około 1 V), układ można w zasadzie zastosować tylko do pomiaru temperatury pokojowej.
Doszedłem do wniosku, że dobrym pomysłem jest dostosowanie układu również do pomiaru temperatury poniżej 2°C. Zmiana płytki PCB nie wchodziła w rachubę, więc przeszukałem dostępne zasoby pod kątem dostępności czujnika temperatury podobnego do LM35.
Wybór padł na układ TMP36 [6]. Ma on taki sam współczynnik skali, jak LM35, przy czym napięcie na wyjściu czujnika w temperaturze 25°C wynosi 750 mV (przy 0°C wynosi 500 mV). Czujnik pracuje w przedziale napięć od 2.7V do 5.5 V oraz umożliwia pomiar temperatur w zakresie od -40°C do 125°C. Układ jest dostępny w takiej samej obudowie jak LM35 i ma taki sam rozkład wyprowadzeń. Czujnik TMP36 oznaczono na schemacie symbolem U3.
Kondensatory C7 i C8 służą do filtrowania napięcia zasilającego i wyjściowego. Do pomiaru jest używany 10-bitowy przetwornik A/C, do którego doprowadzono wewnętrznie napięcie referencyjne 2,048 V. Rozdzielczość pomiaru wynosi 2 mV. Maksymalna niepewność dla przetwornika A/C wbudowanego w mikrokontroler wynosi około ±8 mV (±8 LSB).
Dokładność napięcia referencyjnego w całym zakresie dopuszczalnych temperatury pracy (od -40°C do 125°C) waha się w granicach od -8% do +6%. Nie są to małe odchyłki, ale z reguły występują dla skrajnych wartości temperatury.
Lepszym rozwiązaniem byłoby zastosowanie zewnętrznego źródła napięcia odniesienia, jednak wymagany, minimalny prąd polaryzacji dla tanich źródeł jest zbyt duży dla urządzeń zasilanych bateryjnie. Poza tym, zastosowanie dokładniejszych układów zwiększałoby niepotrzebnie koszt budowy urządzenia. Jednym z rozwiązań jest np. możliwość uproszczonej kalibracji, co zostanie opisane w dalszej części artykułu.
Tor radiowy nadajnika wykonano na bazie modułu firmy Hope Microelectronics (TR). Jest on gotowym torem radiowym, nadawczym pracującym z modulacja FSK i częstotliwością nośną 869 MHz [2]. Maksymalna prędkość przesyłanych danych wynosi 9600 b/s przy napięciu zasilania 5 V. Jeżeli przez czas 70 ms dane nie pojawią się na wejściu DATA, to moduł automatycznie przechodzi w stan obniżonego poboru energii (czuwania). Kondensator C6 filtruje zaburzenia pochodzące od modułu radiowego.
Zasilanie dla układów U3 i TR (+3V3_SW) jest załączane poprzez klucz tranzystorowy T2 (PMOS). Rezystor R11 służy do wstępnej polaryzacji bramki tego tranzystora. Dzięki temu, po włączeniu zasilania, napięcie na bramce jest równe napięciu na drenie (+3V3), co powoduje zatkanie tranzystora. Klucz jest otwierany tylko na około 0,65% czasu całego cyklu pracy, co znacznie obniża pobór energii.
Najciekawszą częścią nadajnika jest blok zasilania, którego głównym elementem jest przetwornica DC/DC podwyższająca napięcie. Wykonano ją jako aplikację układu MCP1640 firmy Microchip (U1) [4]. Jest to synchroniczna przetwornica DC/DC pracująca z częstotliwością około 500 kHz, zaprojektowana do aplikacji zasilanych z baterii lub akumulatorów.
Zaletami układu MCP1640 są: dwa tryby pracy (PFM, PWM) zależne od prądu obciążenia, bardzo mały pobór prądu (kilkanaście µA), regulowane napięcie wyjściowe (od 2,0 do 5,5 V), duża sprawność (nawet 96%), niskie napięcie startu (0,65 V), wbudowany układ kompensacji oraz łagodnego startu przetwornicy, niskie szumy, zabezpieczenie termiczne, mała obudowa (SOT23-6). Do poprawnej pracy przetwornica potrzebuje tylko kilku elementów zewnętrznych: cewki, dzielnika ustalającego napięcie wyjściowe oraz kondensatorów filtrujących.
W prezentowanym układzie, przetwornicę zaprojektowano na napięcie wyjściowe 3,3 V. Jest ono ustalane za pomocą dzielnika rezystancyjnego R1/(R2+R5). Wewnętrzne napięcie referencyjne wynosi około 1,21 V. Ze względu na to, że nawet przy użyciu dokładnych rezystorów 1% rozrzut wartości rezystancji jest na tyle duży, że napięcie wyjściowe może wahać się w granicach od 3,27 V do 3,36 V (dla napięcia referencyjnego 1,21 V). Dla potrzeb naszego projektu, ta dokładność jest wystarczająca.
Rekomendowana indukcyjność cewki L1 to 4,7 mH. Najlepiej użyć komponentu o małej rezystancji szeregowej uzwojenia oraz o prądzie nasycenia większym niż 1 A. W projekcie wykorzystano miniaturową cewkę (4 mm×4 mm) produkowaną przez TDK.
Maksymalna rezystancja uzwojenia wynosi 98 mΩ, a maksymalny prąd cewki wynosi 1,71 A. Kondensatory C1 i C4 służą do filtrowania zakłóceń, natomiast C2 i C3 są niezbędne do magazynowania energii podczas pracy przetwornicy oraz zmniejszają tętnienia napięcia wyjściowego. Przetwornicę zoptymalizowano pod kątem jak najmniejszego poboru energii.
Na rysunku 2 pokazano schemat ideowy odbiornika sygnału radiowego. Składa się on z trzech bloków: konwertera USB-UART (U1), toru radiowego (moduł U3) oraz mikrokontrolera (U4). Ze względu na wystarczające zasoby sprzętowe, do budowy odbiornika wykorzystano ten sam typ mikrokontrolera, który użyto w nadajniku.
Mikrokontroler odbiera zakodowane dane z toru radiowego, następnie je dekoduje i przesyła za pośrednictwem układu konwertera U1 do komputera PC. Dioda LED koloru zielonego (LED1) służy do sygnalizacji poprawnego uruchomienia odbiornika (pojedynczy błysk trwający około 0,5 s) oraz odbioru prawidłowej ramki danych (pojedynczy błysk trwający około kilkadziesiąt ms).
Rezystor R2 ogranicza maksymalny prąd płynący przez LED1. Kondensator C9 służy do filtrowania napięcia zasilającego +5 V. Rezystor R3 jest wymagany do poprawnej pracy układu zerowania mikrokontrolera. Tak samo, jak w wypadku nadajnika sygnału radiowego, punkty testowe TP1...TP5 są wyprowadzeniami interfejsu służącego do programowania mikrokontrolera.
Moduł U3 jest bliźniaczym do użytego w nadajniku i jest przeznaczony do odbioru danych z modulacją FSK o częstotliwości nośnej 869 MHz [3]. Ma cztery wyprowadzenia: zasilanie (VDD, GND), wyjście danych (DATA) oraz służące do wyboru trybu pracy - aktywnego lub uśpienia (EN). W prezentowanym urządzeniu nie wykorzystuje się trybu uśpienia ze względu na ciągły charakter pracy odbiornika. Kondensator C5 służy do filtrowania zakłóceń, natomiast C8 pełni rolę lokalnego "magazynu energii".
Konwerter USB/UART zbudowano na układzie FT232R (FTDI). Do komunikacji z mikrokontrolerem wykorzystywano tylko dwa wyprowadzenia: TXD i RXD. Układ pracuje w konfiguracji wirtualnego portu szeregowego z zasilaniem z portu USB. Napięcie z portu (oznaczone "+5V") jest dodatkowo filtrowane przez kondensatory C1...C3 oraz dławik L1, a następnie wykorzystane do zasilania mikrokontrolera i toru radiowego. Dla zachowania kompatybilności poziomów napięć konwertera z mikrokontrolerem, jego obwody we/wy są również zasilane z linii +5 V.
Wykaz elementówNadajnik Rezystory: (SMD 0805) Kondensatory: (SMD 0805) Półprzewodniki: Inne: Odbiornik Rezystory: (SMD 0805) Kondensatory: (SMD 0805) Półprzewodniki: Inne: |
Zasada działania
Przetwornica napięcia w układzie zasilania nadajnika pracuje nieprzerwanie dostarczając napięcie +3,3 V. Mikrokontroler (U2) pracuje w dwóch cyklach: uśpienia i pracy aktywnej. Po załączeniu zasilania (pierwsze włączenie lub uruchomienie po zerowaniu) mikrokontroler jest konfigurowany do pracy z wewnętrznym zegarem o częstotliwości 1 MHz.
Przełączanie pomiędzy cyklami jest realizowane z wykorzystaniem wewnętrznego licznika układu watchdog (WDT). Rejestr odpowiadający za ustawienie podstawy czasu dla tego licznika jest ustawiony na maksymalną dostępną wartość, czyli 256 sekund.
Zegar taktujący WDT jest uzależniony od rozrzutu częstotliwości wewnętrznego oscylatora 31 kHz (LFINTOSC). Wartość ta może się wahać w granicach ±25%. Po poprawnej konfiguracji rejestrów, mikrokontroler przechodzi w stan uśpienia. W tym stanie wszystkie peryferia poza WDT są wyłączone.
Na wyjściu RA1 (ICSPCLK) panuje poziom wysoki - czujnik temperatury i tor radiowy nie są zasilane. W trybie uśpienia wykonywanie rozkazów przez mikrokontroler jest niemożliwe, więc po upływie ustalonego czasu (256 s) następuje wybudzenie układu U2 i kontynuowanie wykonywania programu. W tym czasie mikrokontroler włącza zasilanie +3V3_SW, a następnie wykonuje kolejne kroki:
- Pomiar napięcia baterii.
- Odczyt napięcia z czujnika temperatury.
- Formowanie ramki danych.
- Obliczenie sumy kontrolnej.
- Wysłanie ramki danych do modułu radiowego.
Po wysłaniu ramki danych, mikrokontroler zostaje wyzerowany przez wykonanie rozkazu RESET(). Po całej operacji, cykl się powtarza.
Pomiar napięcia baterii jest realizowany z użyciem 8-bitowej rozdzielczości przetwornika. Pod uwagę jest brana tylko starsza część wyniku przetwarzania A/C (rejestr ADRESH). Mikrokontroler zbiera 8 próbek, które są uśredniane. Przy pomiarze napięcia z czujnika temperatury jest wykorzystywana "pełna", 10-bitowa rozdzielczość przetwornika A/C.
Do wysyłania ramki danych jest używany moduł EUSART. Prędkość transmisji ustalono na 1200 b/s. Wynika to z przyjętej, najniższej częstotliwości zegara mikrokontrolera - 1 MHz. Format ramki jest następujący:
- Sekwencja początku ramki - sekwencja "start" (4 bajty o wartości 0xF0).
- Część MSB z 10-bitowego wyniku pomiaru temperatury (2 bajty).
- Część LSB z 10-bitowego wyniku pomiaru temperatury (2 bajty).
- Napięcie baterii (2 bajty).
- Suma kontrolna (2 bajty).
- Sekwencja końca ramki - sekwencja "stop" (4 bajty o wartości 0xF0 i jeden o wartości 0x00).
Każda ramka jest kodowana z wykorzystaniem kodu Manchester i przesyłana do modułu radiowego za pomocą modułu EUSART. Do tego celu wykorzystano (za zgodą autora) sposób opisany w artykule [1]. Przykładową ramkę pokazano na rysunku 3.
Dane odebrane przez tor radiowy odbiornika są przesyłane do wejścia przerwania zewnętrznego mikrokontrolera (U4). Tam następuje "właściwy" odbiór danych i dekodowanie kodu Manchester. Algorytm odbioru danych opracowano tak, aby wykorzystać dostępne peryferia mikrokontrolera. Zastosowano w nim przerwania zewnętrzne oraz dostępne liczniki T0 i T1.
W związku z tym, że każdy bit ramki danych jest odbierany indywidualnie, niezbędny jest odpowiednio duży bufor danych (80 znaków). Pochłania to znaczną część pamięci RAM mikrokontrolera, ale jest to prosta i w miarę niezawodna metoda. Odebrany ciąg bitów jest następnie "kompresowany" do postaci bajtowej i dekodowany za pomocą znanego już algorytmu z nadajnika [1].
Podczas pracy nad projektem, trochę kłopotu sprawił mi moduł radiowy U3. Okazało się, że generuje on duże zakłócenia w postaci przypadkowego szumu zero-jedynkowego (rysunek 4). Aby rozróżnić właściwe dane konieczne było wprowadzenie odpowiednio długiej sekwencji "start", aby mikrokontroler od razu rozpoznawał odpowiednią ramkę danych.
Na rysunku 5 przedstawiono przebieg sygnału na wyjściu modułu radiowego w odbiorniku. Widać na nim prawidłową ramkę danych na tle sygnałów przypadkowych. Wszystkie sygnały niespełniające założonego formatu są odrzucane i nie podlegają dalszej analizie.
Montaż
Urządzenie składa się z dwóch płytek drukowanych: nadajnika (rysunek 6) i odbiornika (rysunek 7). Montaż można rozpocząć od płytki nadajnika. Zaczynamy od elementów składowych przetwornicy DC/DC: układu U1, kondensatorów C1...C4, dławika L1 oraz rezystorów: R1, R2, R5, R7. Po tym należy sprawdzić, czy na wyjściu przetwornicy napięcie wynosi około 3.3 V.
W tym celu, należy do zacisków BAT+ i BAT dołączyć baterię AA lub akumulatorek 1,2V i sprawdzić wartość wymaganego napięcia np. na kondensatorze C4. Jeżeli wszystko jest w porządku, to należy przystąpić do montażu kolejnych komponentów SMD: mikrokontrolera U2, rezystorów: R3...R4, R11, kondensatorów: C5...C8 oraz tranzystora T2. Na końcu montujemy elementy przewlekane: moduł radiowy TR oraz czujnik temperatury U3.
Teraz można przystąpić do montażu odbiornika. Zaczynamy od montażu elementów SMD na dolnej warstwie płytki drukowanej: mikrokontrolera U4, kondensatora C9 i rezystora R3. Następnie można zamontować elementy SMD na górnej warstwie płytki: układ U1, kondensatory: C1...C5, C8, rezystor R2 oraz diodę LED1. Na samym końcu lutujemy złącze USB oraz moduł radiowy U3.
Uruchomienie
Po poprawnym montażu należy przejść do zaprogramowania mikrokontrolerów. W tabeli 1 opisano rozmieszczenie wyprowadzeń programatora w odniesieniu do punktów testowych na obu płytkach. Jest on taki sam dla nadajnika i odbiornika. Odbiornik należy zaprogramować przy użyciu pliku Termometr_RF_USB_odb_114. hex.
Na początku, nadajnik programujemy za pomocą pliku testowego Termometr_RF_USB_ nad_117_4s.hex. W wersji testowej, tryb uśpienia nadajnika został skrócony do kilku sekund (około 4 s), co umożliwia szybkie sprawdzenie poprawności działania termometru. Po poprawnym zaprogramowaniu, obie płytki są gotowe do uruchomienia.
Do poprawnej pracy oprogramowania na PC niezbędny jest pakiet Microsoft .Net Framework w wersji 4.5.1. Pakiet można pobrać z http://goo.gl/8PWH5g. Dodatkowo, na komputerze PC instalujemy pakiet Visual Basic PowerPacks w wersji 10.
Pakiet również można pobrać bezpłatnie z http://goo.gl/5Hl5Oa. Teraz przystępujemy do uruchomienia urządzenia. Dołączamy zasilanie do nadajnika, a odbiornik do portu USB w komputerze PC. System przydzieli urządzeniu wolny numer portu COM (wirtualnego portu szeregowego), np. COM3.
Na komputerze PC uruchamiamy program TERMOMETR_RF_USB_v106.exe. Wybieramy zakładkę USTAWIENIA i w bloku PORT znajdujemy na liście numer portu przydzielonego do naszego odbiornika sygnału radiowego. Naciskamy przycisk OTWÓRZ PORT.
Przełączamy zakładkę na POMIAR. Po upływie kilku sekund, na wyświetlaczu powinna pojawić się aktualna temperatura zmierzona przez czujnik. Jeżeli tak się stanie, to układ działa prawidłowo. Po tym, należy zaprogramować nadajnik za pomocą docelowego programu Termometr_RF_USB_nad_117_256s. hex. Jak wspominano, cykl pracy dla nadajnika podczas normalnej pracy wynosi około 256 s (4 min 16 s).
Obsługa programu
Na rysunku 8 pokazano okno główne programu z aktywną zakładką POMIAR. W polu oznaczonym TEMPERATURA znajdują się wyświetlacze 7-segmentowe, na których jest pokazywana aktualna wartość temperatury zmierzonej przez czujnik.
Poniżej wyświetlane są wartości minimalne i maksymalne temperatury, które zostały zarejestrowane podczas działania programu (układ nadajnika nie buforuje takich danych). W polu DATA/CZAS jest wyświetlany tzw. stempel czasowy ramki danych, czyli ostatnia data i godzina odbioru poprawnej wartości temperatury. W polu STATUS znajduje się sygnalizacja kilku funkcji programu:
- Poprawności transmisji (TRANSMISJA OK). Gdy kontrolka jest koloru zielonego, to transmisja danych pomiędzy nadajnikiem a odbiornikiem przebiegła prawidłowo. Gdy kontrolka jest koloru czerwonego, to wystąpił błąd w transmisji lub został przekroczony czas oczekiwania pomiędzy kolejnymi ramkami.
- Niskiego napięcia baterii (NISKI POZIOM BATERII). W zakładce USTAWIENIA (rysunek 9), pole NISKI POZIOM BATERII można wybrać jeden z trzech poziomów napięcia (0,8 V; 0,9 V lub 1,0V), poniżej których program zasygnalizuje (kontrolka zmieni kolor z szarego na czerwony) konieczność wymiany baterii w nadajniku.
- Logowania danych (LOGOWANIE DANYCH). W zakładce USTAWIENIA w polu LOGOWANIE DANYCH można ustawić nazwę i rodzaj pliku (do wyboru .txt i .csv), do którego będą zapisywane wyniki pomiaru temperatury oraz do wyboru poprzez zaznaczenie odpowiedniej opcji - data/godzina i informacja o niskim poziomie baterii.
- Alarmu (ALARM). W zakładce USTAWIENIA w polu ALARM można ustawić poziom temperatury, przy którym program zasygnalizuje przekroczenie wartości odniesienia. Do wyboru są opcje sygnalizowania przekroczenia temperatury w górę (pole "↑") i w dół (pole "↓").
Oprócz wyżej wymienionych funkcjonalności, istnieje też możliwość jednopunktowego skalibrowania termometru. Ze względu na to, że napięcie wyjściowe czujnika jest proporcjonalne do temperatury, można ustawić odchyłkę temperatury w stosunku do wartości wzorcowej (zakładka USTAWIENIA, blok KALIBRACJA). Najprostsza metoda polega na pomiarze temperatury za pomocą skalibrowanego termometru ("wzorca") i ustawieniu odpowiedniej odchyłki w stopniach Celsjusza.
Podsumowanie
Projekt powstał w wyniku potrzeby monitorowania temperatury w różnych pomieszczeniach w mieszkaniu i oceny sprawności instalacji grzewczej. Termometr może być też przydatny np. do monitorowania temperatury zewnętrznej, służąc jako część stacji pogodowej. Przy zastosowaniu baterii typu AA o pojemności 2700 mAh, nadajnik może pracować nieprzerwanie przez ponad rok.
Łukasz Ostafiński
lukasz.ostafinski@gmail.com
Bibliografia:
[1] Adrian Mills, "Manchester encoding using RS232" (http://goo.gl/vuOmHc)
[2] Nota katalogowa układu HM-T868 (http://goo.gl/ILWvqs)
[3] Nota katalogowa układu HM-R868 (http://goo.gl/q7Z5Qn)
[4] Nota katalogowa układu MCP1640 (http://goo.gl/SZ1jPA)
[5] Nota katalogowa układu PIC12F1822 (http://goo.gl/kaZ6ay)
[6] Nota katalogowa układu TMP36 (http://goo.gl/Ho88QS)