Transmisja radiowa FSK – osiągi w praktyce

Po przygotowaniu bibliotek i skonfigurowaniu projektu można przystąpić do implementacji prostej komunikacji pomiędzy dwoma urządzeniami. Program został napisany na podstawie przykładów znajdujących się w pakiecie STSW-S2LP-DK. Składa się on z dwóch funkcji main(), zawierającej konfigurację mikrokontrolera i modułu radiowego oraz HAL_GPIO_EXTI_Callback(), obsługującej przerwania od wszystkich linii GPIO.

Fragment funkcji main(), zawierający pełną konfigurację mikrokontrolera oraz moduły S2-LP został przedstawiony na listingu 1. Rozpoczyna się on od inicjalizacji biblioteki Cube HAL, SPI i pinu Shutdown dla modułu radiowego, oraz GPIO dla przycisku i diody. W tej sekcji znajduje się również inicjalizacja znajdującej się na płytce pamięci EEPROM zawierającej m.in. fabrycznie zapisaną poprawkę do częstotliwości nośnej wykorzystywaną do korekcji wartości zmiennej radioConfig.lFrequencyBase. Kolejne wywołania to reset modułu S2-LP, synchronizacja zegara i konfiguracja linii przerwań służącej do powiadamiania mikrokontrolera. Następnie wysyłana jest komenda SABORT, która powoduje wyjście ze stanu transmisji lub odbioru i przejście do stanu READY. W tym ostatnim stanie możliwa jest konfiguracja parametrów radia, przekazywanych do funkcji S2LPRadioInit() za pomocą struktury SRadioInit. W przykładzie radio zostało skonfigurowane następującymi parametrami:

Zgodnie z nimi częstotliwość nośna wynosi 868 MHz, prędkość transmisji 300 bps, dewiacja częstotliwości 250 Hz, a pasmo odbiornika 5000 Hz. Typ modulacji został ustawiony na 2FSK. Jest to zwykła modulacja FSK z użyciem dwóch częstotliwości, w przeciwieństwie do 4FSK, w której do transmisji używa się czterech częstotliwości co umożliwia transfer dwóch bitów jednocześnie.

Kolejne wywołania to ustawienie mocy nadawczej na 14 dBm oraz parametrów filtracji RSSI. Jest to metoda detekcji pakietów przychodzących na podstawie zmian mocy sygnału. W przykładzie została ona skonfigurowana następująco:

 

Pierwszym parametrem jest wzmocnienie filtra RSSI w dBm, drugim próg RSSI po przekroczeniu którego pakiety danych zostaną odebrane, a ostatnim tryb filtracji. Tryb statyczny oznacza odbiór danych bezpośrednio po przekroczeniu progu, natomiast w trybie dynamicznym oprócz poziomu sprawdzany jest również przyrost RSSI.

W kolejnej sekcji konfigurowane są pakiety danych za pomocą struktury:

 

Struktura ta zawiera następujące informacje:

  • długość preambuły,
  • długość i wartość słowa synchronizującego,
  • stała lub zmienna długość pakietu,
  • rozmiar pola z długością danych (jeden lub dwa bajty),
  • typ sumy kontrolnej,
  • włączenie lub wyłączenie pola z adresem odbiornika,
  • włączenie lub wyłączenie autokorekty danych,
  • data whitening, czyli zapobieganie transmisji ciągów zer i jedynek.

Następnie ustawiana jest długość danych w pakiecie. W przypadku kiedy włączona jest opcja zmiennej długości danych (xFixVarLength = S_ENABLE), ustawiona długość dotyczy wyłącznie nadajnika, ponieważ odbiornik otrzyma tą wartość w pakiecie. W przeciwnym razie obie strony muszą mieć jawnie ustawioną długość danych za pomocą funkcji S2LPPktBasicSetPayloadLength().

Na koniec pozostały jeszcze do wybrania źródła przerwań. Z uwagi na fakt, że S2-LP używa tylko jednej linii przerwań, należy wybrać zdarzenia, które będą to przerwanie wywoływać. W przykładzie używane są tylko dwa źródła przerwań – koniec nadawania pakietu i jego udany odbiór.

Po skończonej konfiguracji można przełączyć moduł w stan odbioru pakietów. Czas oczekiwania na dane można skonfigurować funkcją S2LPTimerSetRxTimerCounter(). Argument 0 oznacza tryb ciągłego nasłuchu.

Druga z funkcji jest odpowiedzialna za obsługę przerwań GPIO, zarówno od modułu radiowego, jak i od przycisku użytkownika. Została ona przedstawiona na listingu 2. Z racji tego, że funkcja ta jest wywoływana przez bibliotekę Cube HAL do obsługi wszystkich zarejestrowanych przerwań GPIO, jest w niej wykonywane źródło przerwania na podstawie argumentu. Jeżeli przerwanie pochodzi od moduły S2-LP, należy najpierw pobrać stany wszystkich możliwych zdarzeń wywołując funkcję S2LPGpioIrqGetStatus(). Dla uproszczenia kodu w przykładzie obsługiwane są tylko dwa zdarzenia, skonfigurowane wcześniej jako bezpośrednie źródła przerwań: zakończenie transmisji i odbiór pakietu. Pierwsze z nich powoduje wyłączenie diody sygnalizującej stan nadawania i przejście w tryb nasłuchu. Drugie ze zdarzeń powoduje odczyt danych ze sprzętowej kolejki odbiorczej, opróżnienie jej, ponowne przejście w stan nasłuchu oraz ustawienie flagi rxReady. Flaga ta jest sprawdzana w pętli while() na końcu funkcji main(). Jeżeli zostanie ona ustawiona, wówczas na 100 ms zapalana jest dioda sygnalizująca odbiór danych.

Obsługa drugiej linii przerwań, sygnalizującej wciśnięcie przycisku, sprowadza się do wysłania komendy ABORT, która przełącza moduł radiowy w stan READY, opróżnienia sprzętowej kolejki nadawczej, nadania pakietu danych i zapalenia diody sygnalizującej stan transmisji danych.

 

List. 1. Konfiguracja radia w funkcji main()

List. 2. Obsługa przerwań GPIO w funkcji HAL_GPIO_EXTI_Callback

 

Test zasięgu

Głównym przeznaczeniem modułów S2-LP jest komunikacja na dużą odległość, dlatego w tym rozdziale przedstawione zostaną testy zasięgu. Podobnie jak w przypadku innym modułów radiowych, w tym także przedstawionych poprzednio SX1276, maksymalny zasięg jest uzależniony od konfiguracji modułu, położenia anten, ukształtowania terenu, przeszkód na drodze sygnału radiowego oraz innych czynników zewnętrznych. W teście zostały wykorzystane zarówno opisywane w artykule moduły S2-LP, jak i SX1276 w trybie modulacji FSK. Konfiguracja modemów została przedstawiona w tabeli 3.

Tab. 3. Konfiguracje testowanych modułów

Moduł S2-LP SX1276
Modulacja FSK FSK
Częstotliwość nośna 868 MHz 868 MHz
Dewiacja częstotliwości 600 Hz 600Hz
Prędkość transmisji danych 1200 bps 1200 bps
Pasmo odbiornika 5000 Hz 2600 Hz
Moc nadajnika 14 dBm 14 dBm

 

W obu przypadkach anteny były umieszczone na wysokości ok. 1,5 m nad ziemią, a na drodze sygnału nie znajdowały się żadne przeszkody, co można zobaczyć na rysunku 5. Maksymalny zasięg jaki udało się osiągnąć to ok. 1720 m. Zwiększenie odległości w przypadku obu modułów powodowało utratę pakietów danych.

 

Podsumowanie

Moduł radiowy S2-LP oparty na modulacji FSK jest układem dobrze spisującym się w komunikacji na dużą odległość. W zależności od wymagań projektu może być on skonfigurowany do różnych prędkości transmisji danych, co ma jednak wpływ na maksymalny zasięg sygnału radiowego. Dodatkowo, dostępne biblioteki i przykłady aplikacji sprawiają, że rozpoczęcie pracy z S2-LP jest stosunkowo proste i nie wymaga dużego nakładu pracy.

Krzysztof Chojnowski