- pracuje z aparaturą firmy FrSky, komunikuje się poprzez SmartPort,
- oferuje szeroki zakres pomiarowy 3...49 V (bez konieczności stosowania kilku czujników w przypadku pakietu składającego się z więcej niż 6 cel),
- nie umożliwia monitorowania napięć poszczególnych cel pakietu.
Przede wszystkim, aparatury zaczęły pracować w paśmie 2,4 GHz oraz zastosowano skuteczne algorytmy pracy w szerokim zakresie widma radiowego. Do oczywistych zalet, takich jak odporność na zakłócenia, krótsze anteny, większy zasięg, dodano kolejną nowość – telemetrię. Telemetria umożliwia przesłanie do nadajnika informacji z czujników zamontowanych na statku powietrznym, np.: napięcie baterii zasilającej, pobór prądu, wysokość modelu z czujników barometrycznych czy dane z systemu GPS. Liczba informacji telemetrycznych zależy od producenta systemu RC i stale rośnie, ponieważ producenci starają się optymalizować oprogramowanie, aby w pełni wykorzystać ich możliwości.
Jednym z producentów szerokiej gamy aparatur RC wraz z telemetrią jest firma FrSky. Aparatury tej firmy są znane z jakości, niezawodności, dalekiego zasięgu i obsługi telemetrii. Kolejnym atutem aparatur tej firmy, jest fakt, że działają one w oparciu o otwarty system OpenTX. System ten jest oprogramowaniem do aparatur RC, umożliwiającym bardzo elastyczne konfigurowanie modeli. Z racji, że system jest otwarty, bez problemu można skonstruować własny czujnik telemetryczny, chociażby do monitorowania napięcia akumulatora zasilającego.
W odbiornikach firmy FrSky do podłączenia czujników telemetrycznych przewidziany jest specjalny port o nazwie SmartPort. Jego cechą charakterystyczną jest jednoprzewodowy protokół typu half duplex do wymiany informacji pomiędzy odbiornikiem, a podłączonymi czujnikami. Do odbiornika może być jednocześnie podłączonych wiele czujników pracujących niezależnie od siebie. W poniższym artykule pokrótce omówię ten protokół, oraz zaprezentuję budowę czujnika napięcia pakietu zasilającego bazującego na nowoczesnym mikrokontrolerze STM32G031.
Opisany w artykule moduł umożliwia monitorowanie napięcia pakietu zasilającego model RC. W przeciwieństwie do oryginalnych czujników FLVSS nie umożliwia monitorowania napięć poszczególnych cel pakietu, ale w zamian oferuje szeroki zakres pomiarowy bez konieczności stosowania kilku czujników w przypadku pakietu składającego się z więcej niż 6 cel.
Protokół SmartPort
W warstwie fizycznej protokół SmartPort wykorzystuje interfejs szeregowy UART z zanegowanymi poziomami logicznymi, pracujący z ustawieniami: prędkość transmisji danych 57,6 kbps, 8 bitów danych, 1 bit stopu, bez bitów parzystości, jednoprzewodowy tryb half-duplex. Odbiornik radiowy pełni rolę urządzenia master, zaś podpięte czujniki pełnią rolę urządzeń slave. Cyklicznie, co około 12 ms odbiornik wysyła na port zapytania z identyfikatorami czujników i w ten sposób „odpytuje” czujniki które są dołączone. Jeśli czujnik odpowie, odbiornik będzie na przemian odpytywał ten czujnik i szukał kolejnych, wysyłając kolejne identyfikatory. Opis najważniejszych identyfikatorów zestawiono w tabeli 1.
Sekwencja zapytania jest dwubajtowa i ma postać 0x7E Id. Czujnik odpowiada na każde zapytanie na swoim fizycznym identyfikatorze, aby zgłosić swoją obecność. Czujnik odpowiada ramką rozpoczynającą się bajtem 0x10, następne bajty zawierają jego typ, pakiet danych i sumę kontrolną CRC. Jeśli nie można przesłać aktualnych danych (bo np. nie zdążył odświeżyć danych), czujnik odpowiada pustym pakietem i fałszywym CRC (0xFF). Ramka odpowiedzi czujnika ma strukturę taką, jak pokazano w tabeli 2.
Przykładowa ramka wysłana przez czujnik FLVSS została pokazana na rysunku 1. Jak widać – na zapytanie odbiornika 0x7E 0xA1 czujnik odpowiedział sekwencją 0x10, 0x00, 0x03, 0x20, 0x7F, 0xB7, 0x77, 0x1E. Spróbujmy to „rozłożyć” na czynniki pierwsze. Pierwszy bajt 0x10 to znacznik początku ramki z odpowiedzią, jest on stały.
Następnie mamy dwa bajty nazwane Sensor Data Type o wartościach 0x00, 0x03. Są to bajty przypisane do typu czujnika i właśnie dla czujników napięcia zawierać się one mogą w zakresie 0x0300 do 0x030F. Dla czujników prądu zakres ten wynosi 0x0200 do 0x020F. Zakresy można znaleźć w dokumentacji OpenTX. Jeśli mamy podłączony tylko jeden czujnik napięcia, to będzie on zwracał wartość 0x0300. Zwróćmy uwagę, że najpierw jest wysyłany młodszy bajt, a następnie starszy. Kolejny bajt o wartości 0x20 zawiera dwie ważne informacje. Podzielmy go na dwa półbajty. Starszy półbajt mówi nam o ilości cel w pakiecie zasilającym który mierzymy, drugi półbajt mówi nam o numerach dwóch cel pakietu które są zmierzone w aktualnej ramce – ale uwaga – liczone od 0! Każda bowiem ramka zawsze zawiera napięcie dwóch cel. W tym konkretnym przypadku mamy pakiet 2S, zaś 0 oznacza, że ramka zawiera napięcie pierwszych dwóch cel pakietu.
Gdyby wartość na pozycji Data[0] wynosiła np. 0x42 oznaczałoby to, że czujnik mierzy napięcie pakietu 4S, a aktualna ramka zawiera napięcia cel 3 i 4. Aby się przekonać czy tak jest na pewno, spójrzmy na rysunek 2 pokazujący ramkę zawierającą napięcia cel 3 i 4 w pakiecie 5S. Jak widzimy, na polu Data[0] mamy wartość 0x52, co potwierdza, że mamy do czynienia z pakietem 5S, a ramka zawiera napięcia kolejnych 2 cel: 3 i 4. Uważny czytelnik zapyta: skoro w każdej ramce zawarte są napięcia dwóch cel, to jaka będzie wartość w polu Data[0] dla celi 5 w pakiecie 5S? To proste – 0x54, przy czym ramka taka zawierać będzie napięcie tylko jednej celi – nr 5.
W ten oto sposób docieramy do kolejnych 3 bajtów zawierających napięcia poszczególnych cel, gdzie napięcie każdej z cel zawarte jest na 12 bitach. Szybko dojdziemy do wniosku, że maksymalny zakres jaki możemy przedstawić na 12 bitach to 4095, więc jak w takim razie zapisać napięcie w pełni naładowanej celi, która ma napięcie 4,2 V? Obejściem problemu, jest podział napięcia przez 2, dzięki czemu nie przekroczymy zakresu. Wróćmy do rysunku 1 i spróbujmy odczytać napięcia poszczególnych cel w pakiecie 2S, który był podłączony do czujnika. Wartości kolejnych pól w ramce wynoszą odpowiednio: 0x7F, 0xBF, 0x77. Dzielimy środkowy bajt pola Data[2] 0xBF na dwa półbajty. I teraz na napięcie celi 1 składa się bajt z pola Data[1] i młodszy półbajt bajtu z pola Data[2], zaś napięcie 2 celi to bajt z pola Data[3] oraz starszy półbajt z pola Data[2]. Ilustruje to tabela 3.
Z 3 bajtów o wartościach 0x7F, 0xBF, 0x77 ostatecznie otrzymujemy napięcie celi pierwszej o wartości 0x7FF i celi drugiej 0x77B. Odpowiada to odpowiednio napięciom: 0x7FF → 2047·2=4094 mV oraz 77B → 1915·2=3830 mV.
Na końcu każdej ramki znajduje się bajt sumy kontrolnej, który jest zanegowaną sumą wszystkich składników ramki czujnika. Jeśli wyliczona suma przekracza wartość jednego bajta, to ponownie ją sumujemy i dopiero wtedy poddajemy negacji. Sprawdźmy, czy CRC dla ramki z rysunku 2 jest prawidłowa:
0x10+0x03+0x52+0x31+0xF8+0x82=0x0210;
0x02+0x10=0x12;
0x12^0xFF=0xED – czyli wszystko się zgadza.
W przypadku wspomnianego wcześniej pakietu 5S w ramce zawierającej napięcie ostatniej 5 celi, ramka wygląda tak, jak na rysunku 3. Od razu rzuca się w oczy fakt, że napięcie celi 6 wynosi 0, co jest zgodne z prawdą, ponieważ pakiet składa się tylko z 5 cel. W ten oto sposób, odbiornik nie tylko jest w stanie określić napięcie poszczególnych cel pakietu, ale również oblicza napięcie całego pakietu, sumując poszczególne wartości napięć.
W prezentowanym urządzeniu wykorzystano ten fakt. Skoro maksymalne napięcie dla jednej celi może mieć wartość 4095, to można zadeklarować maksymalną dozwoloną, stałą liczbę cel i podawać napięcie na czujnik w bardzo szerokim zakresie. Zmierzone napięcie będzie równo podzielone na liczbę cel, zaś docelowo uzyskamy wskazanie napięcia całego pakietu zasilającego. Dzięki takiemu podejściu udało się uzyskać zakres pomiarowy mieszczący się w zakresie 3...49 V.
Budowa i działanie
Czujnik napięcia bazuje na mikrokontrolerze STMicroelectronics typu STM32G031J6 w obudowie SO8N, z rodziny Cortex-M0+. Ma on wszystkie niezbędne peryferia, jest łatwy w lutowaniu i tani w zakupie. Dzięki możliwości konfiguracji interfejsu UART w trybie half-duplex wraz z negacją poziomów, nie trzeba stosować dodatkowych układów konwertujących.
Schemat modułu został pokazany na rysunku 4, a projekt płytki PCB pokazuje rysunek 5. Schemat jak i projekt płytki zostały narysowane w programie EasyEDA. Jest to darmowy edytor z bogatą biblioteką elementów, zaś sama obsługa jest dość intuicyjna. Wymiary PCB to 21×35 mm. Montaż elementów SMD nie powinien nastręczać trudności, ponieważ wszystkie elementy są w obudowach łatwych do lutowania.
Schemat elektryczny jest zredukowany do niezbędnego minimum. Oprócz samego procesora zawiera stabilizator napięcia 3,3 V, oraz dzielnik napięcia zrealizowany na elementach R5 i R6 wraz z diodą zenera zabezpieczającą port przed wystąpieniem zbyt wysokiego napięcia. Dioda LED sygnalizuje poprawną komunikację na porcie SmartPort. W projekcie użyto stabilizatora typu LD1117S33, dzięki czemu czujnik może być zasilany napięciem powyżej 5 V bezpośrednio z odbiornika zasilanego np. z akumulatorów litowych.
Oprogramowanie mikrokontrolera zostało napisane w języku C w środowisku STM32CubeIDE. W procedurze przerwania od UART sprawdzane są odebrane dane i wyszukiwana jest sekwencja 0x7E 0xA1. Jeśli taka sekwencja zostanie odebrana, następuje przygotowanie ramek z danymi do odesłania na port. Przy użyciu DMA następuje seria pomiarów napięcia podanego na wejście pomiarowe INPUT, a następnie w pętli głównej obliczana jest średnia, dzięki czemu pomiary są stabilne.
Do zaprogramowania procesora niezbędny jest programator. Po prawidłowym zmontowaniu i zaprogramowaniu, układ jest gotowy do pracy. Szybkie miganie diody LED sygnalizuje poprawne dekodowanie danych na SmartPorcie z odbiornika. Jeśli napięcie podane na wejście INPUT będzie poniżej progu 3 V czujnik zaprzestaje wysyłania danych z napięciem, co aparatura zasygnalizuje po kilku sekundach brakiem danych. Po podaniu napięcia z zakresu pracy, dane ponownie będą przysyłane przez moduł. Procedura dodawania czujnika do systemu telemetrii jest standardowa i polega na uruchomieniu procedury wykrywania czujników w menu TELEMETRY aparatury, gdzie czujnik zostanie wykryty jako parametr CELLS.
Grzegorz Burzyński
sp5ein@gmail.com
- R1, R6: 1 kΩ SMD0805
- R5: 15 kΩ SMD0805
- C1, C2: 100 nF SMD0805
- C3, C4: 0,1 µF SMD0805
- LED: dioda LED czerwona SMD0805
- D2: dioda zenera BZT52C4V7 (SOD-123)
- D3: dioda zenera SD103BW-7-F (SOD-123)
- U2: stabilizator napiecia AZ1117H-3.3TRE1 (SOT-223-3)
- U1: STM32G031J6M6 (SOIC-8)
- F1: bezpiecznik miniaturowy BSMD0805-100-12V SMD0805
- INPUT: goldpin kątowy 1 szpilka
- J1: goldpin 2×3 (nie montować)
- SMART-PORT: goldpin 2×3