[LoRa] Testy zasięgu zestawu startowego B-L072Z-LRWAN1 z STM32L072 i SX1276, część 1

Po dodaniu wszystkich źródeł trzeba uzupełnić ścieżki w projekcie. Można to zrobić w ustawieniach projektu: C/C++ General → Paths and Symbols. W zakładce Includes należy dodać ścieżki do nagłówków, a w zakładce Source Location ścieżki do plików źródłowych. Przy dodawaniu ścieżek warto zaznaczyć opcje dodania ich do wszystkich konfiguracji. Rozszerzenie I-CUBE-LRWAN potrzebuje do poprawnego działania także odpowiednich symboli – podobnie jak w przypadku ścieżek warto dodać je do wszystkich języków i konfiguracji. Wszystkie ustawienia zostały przedstawione na rysunku 5.

Rys. 5. Konfiguracja ścieżek i symboli projektu

Próba kompilacji tak skonfigurowanego projektu zakończy się błędem z powodu wielokrotnej definicji funkcji HAL_MspInit. Problem ten można rozwiązać usuwając plik HAL_Driver/Src/stm32l0xx_hal_msp_template.c dostarczający pustych definicji funkcji konfiguracyjnych.

Po pomyślnym skonfigurowaniu projektu z biblioteką I-CUBE-LRWAN można przystąpić do implementacji prostej komunikacji radiowej pomiędzy dwoma węzłami, których rolę pełnią dwa zestawy B-L072Z-LRWAN1.

Na listingu 1 została umieszczona funkcja main, w której znajduje się pełna konfiguracja radia.

List. 1. Funkcja main

Pierwsze trzy funkcje są odpowiedzialne za inicjalizację biblioteki STM32Cube (HAL_Init), zegara systemowego (SystemClock_Config, wygenerowana przy tworzeniu projektu), sterownika radia i biblioteki I-CUBE-LRWAN (HW_Init).

Następna sekcja to inicjalizacja modułu radiowego i konfiguracja parametrów transmisji. W pierwszej kolejności rejestrowane są callbacki wołane po skończonej transmisji i po odbiorze pakietu. Dla uproszczenia zostały pominięte pozostałe, odpowiadające m. in. za błędy transmisji i detekcję zajętości kanału radiowego. Użyte funkcje zostaną omówione w dalszej części tekstu. Kolejne linie kodu konfigurują parametry modemu radiowego.

Funkcja SetChannel ustawia częstotliwość sygnału, natomiast pozostałe dwie funkcje konfigurują parametry transmisji i odbioru. Listy argumentów obu funkcji zostały wyjaśnione w tabeli 2. Istotne w tym przypadku jest, aby zarówno odbiornik, jak i nadajnik były skonfigurowane w ten sam sposób. W tym momencie radio gotowe jest już do komunikacji, więc zostaje wprowadzone w tryb ciągłego nasłuchu (argument 0 funkcji Rx oznacza brak limitu czasu na odbiór pakietu).

W dalszej części programu konfigurowany jest licznik sterujący czasem świecenia diody sygnalizującej odbiór pakietu. Korzysta on z interfejsu dostarczanego przez moduł Lora/Utilities/timeServer. Dzięki niemu można w łatwy sposób zarządzać licznikami opartymi na sprzętowym RTC. Jest on używany przez sterownik SX1276, ale można go także wykorzystać w swoim kodzie.

Ostatnią czynnością wykonywaną przez funkcję main jest skonfigurowanie przycisku służącego do nadawania pakietu. Przerwanie jest włączane za pomocą funkcji dostarczanej przez moduł hw_gpio, natomiast konfiguracja GPIO znajduje się w BSP płytki B-072Z-LRWAN1.

 

Tab. 2. Parametry konfiguracji transmisji i odbioru

SetTxConfig SetRxConfig
Argument Opis Argument Opis
modem Typ modulacji (LoRa/FSK). modem Typ modulacji (LoRa/FSK)
power Moc sygnału nadawanego [dBm]. bandwidth Pasmo (LoRa 0: 125 kHz, 1: 250 kHz, 2: 500 kHz, FSK <2,6kHz:250kHz>).
fdev Dewiacja częstotliwości (tylko FSK). datarate Przepustowość (dla LoRa wyrażona jako 2SF , gdzie SF = {6…12}, dla FSK jako bit/s).
bandwidth Pasmo (tylko LoRa, 0: 125 kHz, 1: 250 kHz, 2: 500 kHz). coderate Korekcja błędów (tylko LoRa: 1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8).
datarate Przepustowość (dla LoRa wyrażona jako 2SF , gdzie SF = {6…12}, dla FSK jako bit/s). bandwidthAfc Pasmo automatycznej regulacji częstotliwości (tylko FSK <2,6kHz:250kHz>)
coderate Korekcja błędów (tylko LoRa: 1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8). preambleLen Długość preambuły pakietu.
preambleLen Długość preambuły pakietu. symbTimeout Maksymalny czas trwania trybu odbioru pojedynczego pakietu wyrażony w liczbie symboli (tylko LoRa).
fixLen Stała/zmienna długość pakietu danych. fixLen Stała/zmienna długość pakietu danych.
crcOn Włączona/wyłączona generacja CRC. payloadLen Długość pakietu danych, gdy fixLen = true.
freqHopOn Włączona/wyłączona opcja rozpraszania widma Frequency-hopping (tylko LoRa). crcOn Włączona/wyłączona kontrola CRC.
hopPeriod Okres zmiany częstotliwości jeśli freqHopOn = true (tylko LoRa). freqHopOn Włączona/wyłączona opcja rozpraszania widma Frequency-hopping (tylko LoRa).
iqInverted Inwersja sygnałów I oraz Q (tylko LoRa). hopPeriod Okres zmiany częstotliwości jeśli freqHopOn = true (tylko LoRa).
timeout Ograniczenie czasu transmisji w [ms]. iqInverted Inwersja sygnałów I oraz Q (tylko LoRa).
rxContinuous Włączony/wyłączony tryb ciągłego odbioru.

Do omówienia pozostały funkcje obsługi przerwań przedstawione na listingu 2:

  • gpioCallback – przerwanie od przycisku, przełącza radio w tryb nadawania pakietu, zapala diodę sygnalizującą nadawanie pakietu,
  • txDoneEventCallback – przerwanie po skończonej transmisji pakietu, przełącza radio z powrotem w tryb nasłuchu, gasi diodę nadawczą,
  • rxDoneEventCallback – przerwanie po odebraniu pakietu, zapala diodę sygnalizującą odbiór, uruchamia licznik kontrolujący czas świecenia diody, wypisuje treść otrzymanej wiadomości,
  • ledTimerCallback – przerwanie licznika kontrolującego diodę.

List. 2. Funkcje obsługujące zdarzenia radia oraz przerwania licznika i przycisku

Komentarza wymaga jeszcze funkcja PRINTF. W rzeczywistości jest to makro dostarczane przez moduł vcom, który pozwala na łatwe wypisywanie komunikatów na port szeregowy USART2 (TX: PA2, RX: PA3). Domyślnie jest on skonfigurowany w następujący sposób:

  • BaudRate – 115200
  • WordLength – 8
  • StopBits – 1
  • Parity – None
  • HardwareFlowControl – None

Z makra PRINTF korzysta także driver SX1276, o czym można się przekonać przeglądając plik źródłowy BSP/MLM32L07X01/Phy/sx1276.c. Można je wyłączyć modyfikując odpowiednio zawartość pliku vcom.h.

Po podłączeniu płytki do komputera należy kliknąć prawym przyciskiem myszy na nazwę projektu w drzewie plików po lewej stronie i wybrać opcję Debug As → Ac6 STM32 C/C++ Application aby zaprogramować pamięć mikrokontrolera.

Działanie przykładu jest następujące. Po przyciśnięciu przycisku urządzenie wysyła zdefiniowany w kodzie pakiet danych, co sygnalizuje niebieską diodą. Drugie urządzenie odbiera pakiet, co sygnalizuje zieloną diodą oraz wypisuje zawartość pakietu na port USART2. Jest to bardzo prosty przykład komunikacji za pomocą modemu LoRa SX1276, który pozwala na zapoznanie się z bibliotekami dostarczanymi przez ST. W ramach eksperymentów warto zmodyfikować parametry transmisji, jednocześnie obserwując czas nadawania sygnalizowany przez diodę.

Krzysztof Chojnowski

Do pobrania