radio4 – wersja 1.0

czyli modem radiowy sterowany prostymi tekstowymi komendami wysyłanymi na port szeregowy, bez dodatkowych sterowników czy bibliotek. Z jego pomocą można zdalnie sterować urządzeniami, odczytywać stan zdalnych czujników i/lub włączników oraz wymieniać komunikaty i dane. Wszystko to małą mocą, bez zezwoleń czy licencji. Urządzenie „radio4” zostało pomyślane jako platforma testowo-badawcza, pozwalająca w praktyce zapoznać się z modulacją LoRa oraz wykorzystać ją we własnych projektach. Wystarczy wysłać tekst na port szeregowy i odebrać odpowiedź, można to zrobić z poziomu praktycznie każdego języka programowania na każdej z popularnych platform.

Prezentowana wersja oferuje następującą funkcjonalność:

  • modulacja LoRa w oparciu o moduł transceiver-a i modemu HopeRF RFM96W pracującemu w paśmie 434 MHz, w praktyce znacznie szerzej, szczegóły w nocie aplikacyjnej układu: https://www.hoperf.com/modules/lora/RFM96.html
  • moduł jest w stanie pracować mocą do 100mW (20dBm), jednak ze względu na parametry pracy zdecydowałem się nie przekraczać 20mW (13dBm).
  • w chwili obecnej wspierana jest modulacja LoRa, moduł obsługuje również modulację (G)FSK i wykorzystanie jej planowane jest w kolejnych wersjach oprogramowania
  • jako mikrokontroler pracuje układ STM32F103C8T6 w formie modułu znanego jako „blue-pill”. Ten znany i tani moduł jest kompletnym systemem posiadającym wejście USB oraz SWD do programowania.
  • „radio4” po podłączeniu do komputera jest wykrywane jako urządzenie klasy USB-CDC i system operacyjny tworzy dla niego port szeregowy.
  • Pamięć konfiguracji, dane służące do identyfikacji i bezpiecznych połączeń oraz odebrane wiadomości są zapisywane w nieulotnej pamięci EEPROM. W bieżącej wersji rolę tę spełnia szeregowa pamięć EEPROM typu M95256 o pojemności 32KiB. Funkcja zapisu wiadomości w pamięci nieulotnej jest w trakcie tworzenia.
  • wyjście antenowe to krawędziowe gniazdo SMA-F pasujące do wielu dostępnych na rynku anten dedykowanych dla krótkofalowców, które pracują również w paśmie 430 MHz (70 cm) oraz anten dla urządzeń pracujących w paśmie ISM 434 MHz.
Gotowy moduł „radio4” w wersji 1.0

Po podłączeniu, w systemach Linux-owych, pojawi się urządzenie o nazwie /dev/ttyACMx, pod macOS będzie to /dev/tty.usbmodemXXX lub podobne, pod Windows’em będzie to port COMx. Teraz można już wysyłać komendy i wykorzystać całą funkcjonalność urządzenia. Jest to możliwe ręcznie za pomocą emulatora terminala lub z poziomu dowolnego języka programowania, który umożliwia komunikację z portem szeregowym, jak np. Python, Java, C/C++ itd. W praktyce nie ma potrzeby podawania prędkości i parametrów transmisji szeregowej ponieważ warstwa fizyczna jest tu całkowicie emulowana. Jeśli jednak jest to wymagane to można podać prędkość 115200 bps. Za pomocą terminala w systemie Linux połączenie może wyglądać następująco:

screen /dev/ttyACM0

potem już będąc podłączonym do urządzenia, aby wysłać ogólną wiadomość wpisujemy:

/sb oto nasz pierwszy tekst wyslany przez radio w modulacji LoRa

po wciśnięciu enter wiadomość zostanie wysłana przez radio na uprzednio wybranej częstotliwości.

Urządzenia radio4, które nadało komunikat ogólny

Wszystkie odbiorniki w urządzeniach „radio4” będących w zasięgu i mających identycznie ustawione parametry transmisji odbiorą tą wiadomość. Będzie ją można zobaczyć na ekranie terminala lub odczytać z portu szeregowego w wybranym języku programowania.

Urządzenie „radio4”, które odebrało komunikat ogólny

Dodatkowo „radio4” jest wyposażone w 20 pinowe złącze rozszerzeń EXT. Dostęp do pinów jest możliwy lokalnie oraz za pomocą innego urządzenia „radio4” wykorzystując komendy zdalnego dostępu.

Widok i opis wyprowadzeń złącza EXT w wersji 1.0
(a/d) – wejście analogowe oraz we/wy cyfrowe, (d) – we/wy cyfrowe

Każda komenda musi być poprzedzona znakiem „/” (slash). Listę komend można w każdej chwili wyświetlić pisząc /help, aktualnie zaimplementowane są następujące komendy:

  • /sb <wiadomość tekstowa> – wysłanie wiadomości tekstowej do wszystkich odbiorców
  • /su <node-id> – wiadomość tekstowa – wysłanie wiadomości do konkretnego odbiorcy
  • /set <pin> 0|1 – ustawienie wartości wyjściowego pin-u cyfrowego
  • /rset <node-id> <pin> 0|1 – ustawienie wartości wyjściowego pinu cyfrowego w zdalnym urządzeniu.
  • /setsrv [0|1] – odczyt lub zmiana stanu obsługi żądań „rset”. Włączenie oznacza, że dane żądanie będzie obsługiwane. Zdalne i lokalne urządzenie musi mieć zdefiniowany identyczny „sekret” – patrz komendy sec.
  • /get <pin> – odczyt wartości cyfrowego pinu wejściowego, w przypadku pinów skonfigurowanych jako wejście analogowe zwracane jest napięcie w woltach z rozdzielczością poniżej 1mV.
  • /rget <node-id> <pin> – odczyt wartości pinu wejściowego na zdalnym urządzeniu.
  • /getsrv [0|1] – odczyt lub zmiana stanu obsługi żądań „rget”.
  • /pin [pin] [tryb-pracy] – odczyt lub ustawienie trybu pracy pin-u. Dostępne tryby pracy są następujące: ia – we. analogowe, id – we. cyfrowe pull-down, iu – we. cyfrowe pull-up, if – we. cyfrowe floating, oo – wy. cyfrowe open-drain, op – wy. cyfrowe push-pull. Komenda bez podania numeru pin-u oraz trybu pracy wyświetla tryby pracy dla wszystkich 16-tu pinów.
  • /ping <node-id> – wysłanie żądania odesłania raportu zawierającego odebrany poziom sygnału oraz stosunek sygnał/szum.
  • /pingsrv [0|1] – odczyt lub zmiana stanu obsługi żądań „ping”. Włączenie oznacza, że dane żądanie będzie obsługiwane.
  • /info – wyświetlenie wszystkich lokalnych parametrów pracy, można je również odczytać lub zmienić indywidualnie
  • /rinfo <node-id> – odczyt wybranych parametrów zdalnego urządzenia
  • /infosrv [0|1] – odczyt lub zmiana stanu obsługi żądań „rinfo”
  • /swstr – odczyt nazwy aktualnego firmware-u
  • /rswstr <node-id> – odczyt aktualnego firmware-u działającego na zdalnym urządzeniu. Obsługa włączana flagą „sinfo”.
  • /swver – odczyt aktualnej wersji firmware-u.
  • /hwver – odczyt aktualnej wersji hardware-u.
  • /hwsig – odczyt 12-bajtowej unikalnej sygnatury mikrokontrolera
  • /ndid – odczyt 32-bitowego adresu urządzenia (węzła). Wykorzystywany do adresowania żądań i wiadomości tekstowych.
  • /time – liczba milisekund od ostatniego reset-u lub włączenia zasilania.
  • /freq [Hz] – odczyt lub zmiana aktualnej częstotliwości pracy. W odpowiedzi zwracana jest zawsze aktualna częstotliwość ponieważ może różnić się nieznacznie od zadanej. Wynika to z dokładności zainstalowanego w RFM96W modułu syntezy.
  • /mod – odczyt aktualnie wybranej modulacji
  • /sf [wartość] – odczyt lub zmiana współczynnika rozpraszania w modulacji LoRa
  • /bw [Hz] – odczyt lub zmiana szerokości pasma w modulacji LoRa
  • /cr [wartość] – odczyt lub zmiana współczynnika kodowania (code-rate) w modulacji LoRa
  • /lna [poziom] – odczyt lub zmiana wsp. wzmocnienia odbieranego sygnału
  • /agc [0|1] – odczyt lub zmiana stanu automatycznej regulacji wzmocnienia
  • /pwr [dBm] – odczyt lub zmiana aktualnej mocy nadajnika
  • /bcon [0|1] – odczyt lub zmiana stanu beacon-a, który okresowo wysyła kontrolne pakiety w celach diagnostycznych
  • /bcper <sec> – odczyt lub zmiana czasu między kolejnymi ramkami wysyłanymi przez beacon. W chwili obecnej czas ten jest ustawiony na stałe na 10 sekund. W kolejnych wersjach dodana zostanie możliwość zmiany w pewnym zakresie.
  • /tcxo [0|1] – odczyt lub zmiana źródła sygnału zegarowego, „0” oznacza wbudowany w moduł rezonator kwarcowy, „1” zewnętrzny, stabilizowany temperaturowo generator dla osiągnięcia większej stabilności przy długich ramkach i/lub mniejszych prędkościach gwarantujących większe zasięgi
  • /lstor – mapa zainstalowanej pamięci EEPROM
  • /fstor – formatowanie zainstalowanej pamięci EEPROM.
  • /scfg – zapis aktualnych ustawień do pamięci EEPROM
  • /lcfg – odczyt ustawień z pamięci EEPROM
  • /rcfg – ustawienie domyślnych ustawień konfiguracji i ich zapis do pamięci EEPROM
  • /lsec – wyświetl listę sekretów zapisanych w pamięci EEPROM
  • /asec <node-id> <secret> – dodaje lub aktualizuje sekret dla zdalnego urządzenia. Sekret to 16 bajtowa liczba zapisana w systemie hexadecymalnym jako ciąg 32 cyfr. Przykładem sekretu jest np. taki ciąg: b36ea73ba22dbafe81b4485ce223cf6a.
  • /rsec <node-id> – wyświetlenie sekretu dla urządzenia zdalnego
  • /dsec <node-id> – usunięcie sekretu dla urządzenia zdalnego
  • /jtag [0|1] – odczyt lub zmiana stanu interface-u JTAG. Wyłączenie udostępnia w pełni porty 13,14 i 15.
  • /clkout [0|1] – odczyt lub zmiana stanu wyjścia CLK-OUT. Włączenie podaje na to wyjście sygnał zegarowy modułu podzielony przez 16 czyli 1MHz.
  • /msgrec – odczyt lub zmiana stanu flagi określającej czy niektóre odebrane wiadomości będą automatycznie zapisywane w pamięci EEPROM. Obecnie zapisywane są następujące wiadomości: dane tekstowe i binarne w trybie broadcast i unicast. Odpowiedzi na żądanie „ping”, „rinfo” oraz „rget”. Dodatkowo logowane są wszystkie nieznane ramki, które zostały odebrane bez błędów.
  • /lmsg – wyświetlenie wszystkich zapisanych ramek.
  • /cmsg – skasowanie wszystkich zapisanych ramek

Do każdej komendy można zastosować parametr ?, który wyświetla sposób wywołania oraz akceptowalne wartości argumentów.

Wykonanie przykładowych komend z argumentem „?”

Schemat ideowy układu jest pokazany poniżej:

Schemat modułu w wersji 1.0

Prototyp został wykonany na płytce uniwersalnej i w tej formie przetestowany.

Prototyp dla wersji 1.0

Po pomyślnych testach zostały zamówione profesjonalne płytki PCB

Fabrycznie wykonana PCB do wersji 1.0

Firmware jest cały czas rozwijany i udoskonalany. W fazie testów jest funkcja autentykacji żądań zdalnych co znacząco podniesie bezpieczeństwo przy zdalnym sterowaniu. Dodatkowo zaimplementowana zostanie możliwość wysyłania dowolnych danych binarnych, również z autentykacją, co umożliwi stosowanie całkowicie własnych protokołów komunikacji.

Kolejnym obszarem udoskonaleń jest wykorzystanie trybów o bardzo niskiej prędkości i co za tym idzie jeszcze większej odporności na zakłócenia i większych zasięgach. W tym celu wymagana jest bardzo stabilna częstotliwość generatora taktującego moduł RFM96W. Standardowo zainstalowany kwarc nie jest wystarczająco stabilny przy bardziej wymagających trybach pracy, przy dłuższych pakietach dochodzi do błędów transmisji. Jest to cecha tego modułu. Rozwiązaniem jest wprowadzenie poprawek do częstotliwości zegara lub zastosowanie generatora kwarcowego ze stabilizowaną temperaturą (TCXO).

W tym celu na płytce uwzględnione zostało miejsce na układ oscylatora z odpowiednio wyprowadzonym padem. W celu jego instalacji należy usunąć z oryginalnej płytki rezonator kwarcowy i podać na wejście taktowania sygnał z TCXO. Potem wystarczy już tylko odblokować TCXO komendą /tcxo 1. Jest to kolejny etap, który wymaga precyzji i testów, jest planowany w kolejnych tygodniach. Alternatywna metoda to pomiar częstotliwości i wprowadzanie korekty do układu modemu. W tym celu wyjście CLK-OUT modułu RFM96W zostało wyprowadzone jako osobny pin na płytce. Oprogramowanie wprowadzania korekt oraz podania sygnału na wyjście CLK-OUT jest kolejnym zadaniem na liście poprawek o dużym priorytecie.

Zachęcam się do zapoznania się z opisem modułu LoRa oraz opisu tej modulacji. Pozwoli to ze zrozumieniem wykorzystać możliwości zastosowanego modułu. Z definicji możliwości „radio4” są ograniczone możliwościami zastosowanego modułu oraz samej modulacji. Jednak moduł taki jaki jest oferowany przez producenta oferuje naprawdę bardzo dużą funkcjonalność, a w przypadku krótkich pakietów danych, możliwe jest też wykorzystanie bardziej wymagających ustawień modemu.

Aktualnie wykonany został test zasięgów w terenie zabudowanym. Jako antena bazowa podająca raporty (komenda „ping”) wykorzystana została antena typu „open-sleeve”, która w paśmie 70cm (czyli ca. 434MHz) ma już pewną kierunkowość i zysk lepszy od dipola.

Antena typu „open-sleeve” na pasmo 2m i 70cm.

W module wykorzystano antenę ze złączem SMA, przeznaczoną do urządzeń przenośnych, o długości ok. 45cm. Potwierdzono zasięgi od 500m do 1700m dla pracy mocą 10mW (10dBm) dla standardowych parametrów pracy modemu, czyli:

  • częstotliwość: 434 MHz
  • współczynnik rozpraszania: 10
  • pasmo: 125 kHz
  • code rate: 4/5

Po zautomatyzowaniu procesu testowania i pobierania położenia zostaną przeprowadzone bardziej dokładne testy, również z wykorzystaniem bardziej odpornych prędkości pracy dostępnych tylko z modułem TCXO.

Wyniki zostaną przedstawione na tej stronie jak tylko będą dostępne. Postępy w pracy nad projektem będą prezentowane w formie wpisów na bieżącej stronie. Kolejne informacje już wkrótce.

Wszystkich zainteresowanych zachęcam do zapisania się do newslettera