VP-Digi: digi APRS & KISS modem

Projekt z strony Piotra SQ8L.

Źródło: https://sq8l.pzk.pl/index.php/vp-digi-tani-i-funkcjonalny-sterownik-digipeatera-aprs-wraz-z-modemem-kiss/

VP-Digi:
VP-Digi jest bardzo tanim, prostym w złożeniu i uruchomieniu, a jednocześnie funkcjonalnym sterownikiem digipeatera APRS, oferującym także funkcję modemu KISS czy monitora ramek.

Urządzenie jest oparte na popularnej płytce zwanej Blue Pill, zawierającej mikrokontroler STM32F103C8T6. Płytka ta jest bezproblemowo dostępna w polskich i chińskich serwisach aukcyjnych, a kosztuje mniej niż 20 zł. Do złożenia całego urządzenia potrzebne jest zaledwie kilka dodatkowych elementów zewnętrznych.
Zastosowanie procesora STM32 daje znacznie większe możliwości w porównaniu z podobnymi urządzeniami opartymi na Arduino, przy bardzo podobnych kosztach.

VP-Digi w wersji R2R. 3 rezystory są z drugiej strony płytki:

VP-Digi daje do dyspozycji 8 konfigurowalnych beaconów oraz digipeater APRS, który umożliwia ustawienie 4 aliasów typu n-N (np. WIDEn-N, SPn-N) oraz 4 aliasów prostych (np. MIASTO). Ponadto digipeater wyposażony jest w znaną z aprx funkcję viscous delay, która pozwala znacznie ograniczyć ilość niepotrzebnie przerzucanych pakietów. Możliwe jest także filtrowanie ramek po znaku nadawcy w trybie czarnej listy lub białej listy. Digipeater może działać zarówno jako digi regionalne, jak i pomocnicze.

Urządzenie wyposażone jest w port USB i dwa porty UART, z których każdy może niezależnie od siebie działać w trybie TNC KISS, monitora ramek lub konfiguracji. Konfiguracja jest dokonywana za pomocą prostych komend używając dowolnego programu terminalowego i zapisywana do wbudowanej pamięci flash.

VP-Digi wyposażone jest w bardzo efektywny modem 1200 bd (AFSK Bell 202) oparty o technikę DSP, który z płyty WA8LMF Track 2 dekoduje około 980 ramek. Ponadto zaimplementowane jest cyfrowe wykrywanie zajętości kanału (DCD), oparte o wykrywanie prawidłowego sygnału modulującego, a nie o sprawdzanie zdekodowanego ciągu danych, przez co jest znacznie bardziej efektywne i odporne na zakłócenia. Radiotelefon powinien mieć otwartą blokadę szumów podczas pracy.

Na identycznej konfiguracji sprzętowej (w wersji R2R) działa rzeszowskie digi SR8NDR od 7 miesięcy. Efekty jego pracy można zobaczyć tutaj.

Budowa:
Urządzenie może generować sygnał z użyciem drabinki R2R lub PWM. Obydwie metody działają podobnie, jednak trochę bardziej płaską charakterystykę ma drabinka. Do złożenia całości potrzebne jest zaledwie kilka typowych rezystorów, kondensatorów, dwa potencjometry i tranzystor NPN. Schemat dla obydwu wersji dostępny jest poniżej. Całość można zbudować na małej (5×7 cm) płytce uniwersalnej. Urządzenie jest tak zaplanowane, aby dać możliwość regulacji poziomu sygnału nadawanego i odbieranego za pomocą potencjometrów umieszczonych na płytce. Nic nie stoi jednak na przeszkodzie, aby usunąć odpowiednio elementy RV2, R15 i C4 lub RV4, R24 i C10 na przykład w przypadku, gdy poziom sygnału odbieranego możemy regulować w radiotelefonie i nie jest taka regulacja już potrzebna oddzielnie.
Jeśli PTT w radiotelefonie jest przełączane przez linię mikrofonową, należy rezystor 2.2k (odpowiednio R12 lub R16) wstawić między wyjście PTT a wyjście sygnału.
Istotne jest wstawienie rezystora 22k lub podobnego (R13 lub R22), aby zapobiec ewentualnemu uszkodzeniu wejścia przetwornika.
Kondensatory sprzęgające C1, C3, C4, C5, C9, C10 mogą być o większej pojemności (jest to wręcz wskazane), ale minimum to 100 nF.
Rezystory w drabince R2R (R1, R2, R3, R4, R5, R6, R7, R8) muszą pozostawać w proporcji 2:1, jednak nie należy schodzić z ich wartościami poniżej podanych na schemacie.
Tranzystor Q1 lub Q2 może być dowolnym tranzystorem NPN (BC547, 2N2222 itp.).
Płytkę należy zasilać z USB lub innego źródła 5V lub 3.3V, podłączając je do odpowiedniego złącza na płytce. Zalecane jest zasilanie dobrze przefiltrowanym napięciem dla najlepszego działania demodulatora.

Oprogramowanie:
Oprogramowanie (wsad HEX) dostępny jest poniżej:

Do zaprogramowania procesora potrzebować będziemy programatora ST-Link lub jakąś przejściówkę USB-UART (koszt jednego i drugiego ok. 2$ na Aliexpress).

Programowanie za pomocą ST-Link:
Ściągamy i instalujemy program ST-Link Utility i odpowiednie sterowniki. Podłączamy VP-Digi do programatora, a następnie programator do złącza USB. W ST-Link Utility wybieramy File->Open file i znajdujemy pobrany plik HEX z oprogramowaniem. Następnie wchodzimy w Target->Program & Verify i klikamy Start. Po chwili urządzenie się zrestartuje i uruchomi się właściwe oprogramowanie.

Programowanie za pomocą przejściówki USB-UART:
Upewnijmy się, że nasza przejściówka podaje na wyjściu napięcia 0/3.3V, a nie 0/5V czy -12/+12V. Jeśli to konieczne, instalujemy sterowniki do przejściówki. Pobieramy i instalujemy Flasher-STM32. Na płytce ustawiamy zworkę bliżej przycisku reset na położenie 0, a dalszą na 1. Podłączamy pin TX przejściówki do pinu PA10, a RX do PA9. Oczywiście podłączamy także zasilanie (może być z USB). W menedżerze urządzeń sprawdzamy, pod którym portem COM pokazała się nasza przejściówka. Następnie uruchamiamy Flasher, wybieramy odpowiedni port COM i klikamy Next. Jeżeli ukazał nam się błąd, zresetujmy mikrokontroler i sprawdźmy połączenia oraz ustawienie zworek. W następnym ekranie naciskamy Next. Na kolejnym wybieramy opcję Download to device i wybieramy plik HEX. Pod spodem wybieramy opcję Erase neccesary pages oraz Verify after download i klikamy Next. Po chwili układ powinien być zaprogramowany. Przestawiamy obydwie zworki z powrotem na położenie 0 i resetujemy mikrokontroler, a przejściówkę można odłączyć. Powinno uruchomić się właściwe oprogramowanie.

Uruchomienie:
VP-Digi zawsze uruchamia USB, UART1 i UART2 w trybie KISS, przy czym porty szeregowe działają domyślnie z prędkością 9600 bd. Można wówczas używać urządzenia jako zwykły modem KISS. Do skonfigurowania i obsługi potrzebujemy jakiś program terminalowy, np. TeraTerm. Aby przejść do trybu konfiguracji, należy podać komendę config i zatwierdzić enterem. W trybie KISS echo jest wyłączone, więc na ekranie nie zobaczymy tego, co wpisujemy. Jeśli poprawnie wpiszemy komendę, zostanie to obwieszczone stosownym komunikatem i zdalne echo zostanie włączone (będziemy więc widzieć, co wpisujemy).

Tryby pracy portów:
– KISS – domyślny tryb, w którym odebrane ramki automatycznie wysyłane są na port, a także są przyjmowane z portu i nadawane. Można tego trybu używać w połączeniu np. z UI-View32. Aby przejść do niego z innego trybu, należy użyć komendy kiss.
– monitor – tryb umożliwiający kontrolę pracy urządzenia. W przyjazny sposób pokazywane są ramki odbierane i nadawane oraz inne komunikaty. W tym trybie można także uruchomić testową transmisję dla wyregulowania poziomu sygnału nadawanego. Do tego trybu przejść można za pomocą komendy monitor.
– konfiguracji – tryb umożliwiający sprawdzenie aktualnej konfiguracji oraz ustawienie nowej. Do tego trybu przejść można za pomocą komendy config.

Na portach mogą być otwarte równocześnie różne tryby. Wszystkie funkcjonalności VP-Digi (beacon, digipeater itp.) działają niezależnie od aktualnie uruchomionego trybu.

Podłączenie VP-Digi do radia jest proste. Najpierw należy odłączyć zasilanie, a następnie połączyć masę z masą, wyjście sygnału z radia do wejścia opisanego jako SIG_IN, a wyjście sygnału do radia do wyjścia SIG_OUT. Jeśli radio potrzebuje oddzielnego sygnału PTT, to jego także przyłączamy. Jeśli nie, wstawiamy rezystor między wyjście PTT a mikrofonowe (patrz sekcja Budowa). Na końcu włączamy zasilanie.

Należy pamiętać, że urządzenie operuje na poziomach logicznych 0 do 3.3V.

Wstępna konfiguracja:
Po wykonaniu połączeń używając programu terminalowego wchodzimy do trybu monitor i czekamy na pojawienie się jakiegoś ruchu w sieci radiowej. Przy każdej odebranej ramce podany jest poziom jej sygnału (signal level). Potencjometrem na płytce lub w radiu regulujemy tak poziom sygnału odbieranego, aby poziom sygnału większości ramek był w okolicach 50-70%. Różne stacje nadają sygnały o różnym poziomie, dlatego takie ustawienie może być czasem niemożliwe. Wówczas należy tak ustawić tak poziom sygnału, aby wszystkie ramki mieściły się w przedziale 10-100%.

Należy także wyregulować poziom sygnału wyjściowego. Niestety ten etap jest często wykonywany bardzo nieumiejętnie i niepoprawnie. Przez takie nieodpowiednie wysterowanie nadajnika właściwości sygnału znacznie pogarszają się, a inne stacje mogą mieć problem z demodulacją ramek.
Do zestrojenia nadajnika potrzebujemy dodatkowy odbiornik nastrojony na taką samą częstotliwość, jak nadajnik.
W trybie monitor wpisujemy komendę cal high (włączy się nadawanie tonu 2200 Hz) i regulujemy potencjometrem poziom sygnału wejściowego, powoli przejeżdżając do góry. W tym czasie słuchamy poziomu tonu odbieranego przez odbiornik. Powinien on rosnąć. Po pewnym punkcie ustawienia potencjometru poziom sygnału przestanie się zwiększać. Wówczas należy zatrzymać się w tym punkcie i delikatnie cofnąć potencjometr (nieznacznie zmniejszyć poziom sygnału). Wpisujemy komendę cal stop. Od teraz nadajnik powinien być wysterowany poprawnie. Należy pamiętać, że lepiej jest mieć sygnał trochę za słaby, niż trochę za mocny. W tym drugim przypadku może to spowodować duże zniekształcenia.

Dalsza konfiguracja i komendy:
Do użycia VP-Node jako modem KISS po USB powyższa konfiguracja jest wystarczająca.
Gdy chcemy używać urządzenia do nadawania beaconów i jako digipeater, należy skonfigurować ustawienia programowe. Przechodzimy do trybu konfiguracji, wpisując komendę config. Po zmodyfikowaniu koniecznych ustawień należy zapisać je za pomocą komendy save.

Instrukcje do przykładowych konfiguracji (beacony, digi W1, digi Wn, viscous delay) są dostępne na końcu strony.

call SP8ABC – ustawia znak wywoławczy. Maksymalnie 6 znaków A-Z i 0-9, bez SSID
ssid 4 – ustawia SSID z zakresu 0 do 15
txdelay 300 – ustawia długość preambuły do nadawania przed ramką, która jest potrzebna odbiornikom do synchronizacji. Wartość w milisekundach, z zakresu 30 do 2550
txtail 10 – ustawia długość flag nadawanych po ramce. Wartość w milisekundach, z zakresu 10 do 2550. Jeśli nie zachodzi potrzeba, należy ustawić wartość minimalną.
quiet 300 – ustawia czas, który musi upłynąć pomiędzy zwolnieniem się kanału a włączeniem nadawania. Wartość w milisekundach z zakresu 100 do 2550.
rs1baud 19200 – ustawia baudrate portu UART1. Wartość z zakresu 1200 do 115200.
rs2baud 19200 – j. w., ale dla portu UART2
pwm on – ustawia typ DAC. on dla trybu PWM, off dla drabinki R2R
beacon 0 on – on włącza, off wyłącza określony beacon (z zakresu 0 do 7)
beacon 0 iv 10 – ustawia interwał (w minutach) określonego beaconu (z zakresu 0 do 7)
beacon 0 dl 10 – ustawia opóźnienie/przesunięcie nadawania (w minutach) określonego beaconu (z zakresu 0 do 7)
beacon 0 path WIDE1-1,WIDE2-2 – ustawia ścieżkę określonego beaconu (z zakresu 0 do 7). Komenda przyjmuje jeden (np. WIDE2-2) lub dwa (np. WIDE2-2,SP3-3) elementy ścieżki albo opcję none dla braku ścieżki
beacon 0 data >Test – ustawia pole informacji określonego beaconu (z zakres 0 do 7), np. beacon 0 data !5002.65N102157.91E#Digi Rzeszow
digi on – on włącza, off wyłącza digipeater
digi viscous on – on włącza, off wyłącza funkcję viscous-delay
digi direct on – on włącza, off wyłącza funkcję powtarzania tylko ramek odebranych bezpośrednio
digi 0 on – on włącza, off wyłącza obsługę określonego aliasu (z zakresu od 0 do 7)
digi 0 alias WIDE – ustawia alias w określonym slocie (z zakresu 0 do 7). W przypadku slotów 0-3 (typ n-N) przyjmuje do 5 znaków bez SSID, w przypadku slotów 4-7 (aliasy proste) przyjmuje aliasy w formie jak znak wywoławczy wraz z SSID lub bez
digi <slot> max <n> – ustawia maksymalne n (z zakresu 1 do 7) dla normalnego powtarzania w przypadku aliasów typu n-N, slot z zakresu 0 do 3
digi <slot> rep <n> – ustawia minimalne n (z zakresu 0 do 7), przy którym aliasy typu n-N będą przetwarzane jak aliasy proste, slot z zakresu 0 do 3. n równe 0 wyłącza tę funkcję
digi 0 trac on – ustawia wybrany alias (z zakresu 0 do 7) jako trasowalny (on) lub nietrasowalny (off)
digi 0 filter on – on włącza, off wyłącza filtrowanie ramek dla określonego aliasu (z zakresu 0 do 7)
digi filter black – ustawia typ listy filtrującej ramki: black (czarna lista – ramki od znaków z listy nie będą powtarzane) lub white (biała lista – tylko ramki od znaków z listy będą powtarzane)
digi dupe 30 – ustawia czas bufora filtrującego duplikaty, który zapobiega wielokrotnemu powtarzaniu tej samej ramki przez to samo digi. Czas z sekundach, z zakresu od 5 do 255
digi list 0 set SQ8VPS-* – wpisuje znak na wybraną pozycję (z zakresu 0 do 19) listy filtrującej. Można używać znaku * do zamaskowania wszystkich liter do końca lub do zamaskowania SSID. ? maskuje pojedynczą literę w znaku, w SSID działa identycznie jak *
digi list 0 remove – usuwa wybraną pozycję (z zakresu 0 do 19) z listy filtrującej
autoreset 24 – ustawia interwał automatycznych restartów urządzenia w godzinach, z zakresu 0 do 255. 0 wyłącza tę funkcję
list – pokazuje pełną listę filtrującą
print – pokazuje aktualne ustawienia
save – zapisuje ustawienia do pamięci i restartuje urządzenie. Należy zawsze użyć tej komendy po zakończeniu konfiguracji. W przeciwnym wypadku niezapisana konfiguracja zostanie porzucona.
help – pokazuje skrócone opisy komend
reboot – restartuje urządzenie
version – pokazuje informacje o wersji oprogramowania
monitor – przełącza port do trybu monitora
kiss – przełącza port do trybu KISS

Tryb monitora udostępnia komendy:
help – pokazuje skrócone opisy komend
reboot – restartuje urządzenie
version – pokazuje informacje o wersji oprogramowania
config – przełącza port do trybu konfiguracji
kiss – przełącza port do trybu KISS
beacon 0 – nadaje od razu określony beacon (z zakresu 0 do 7)
cal low/high/alt/stop – low rozpoczyna nadawanie tonu 1200 Hz, high tonu 2200 Hz, alt naprzemiennie zmieniających się tonów (lub inaczej bajtów 0x00), stop kończy nadawanie

Jak tutaj działa digipeater? Co to jest max i rep?
W VP-Digi zastosowany został dość specyficzny algorytm digipeatera, który na pierwszy rzut oka niekoniecznie będzie zrozumiały.
Weźmy na przykład ścieżkę WIDEn-N. Jeśli w odebranej ramce liczba n będzie mniejsza lub równa wartości max, to ta ramka zostanie normalnie powtórzona: np. SQ8L>APRS,WIDE2-2, gdy max=2będzie powtórzona jako SQ8L->APRS,SR8NDR*,WIDE2-1, czyli w standardowy sposób dla ścieżek typu n-N. Jeśli w ramce odebranej n będzie większe do max, to ta część algorytmu nie zrobi nic. Tutaj wchodzi jednak w grę wartość rep.
Jeśli w ścieżce WIDEn-Nn będzie większe lub równe wartości rep, to ta część ścieżki zostanie zastąpiona znakiem digi (powtórzenie jak aliasu prostego), np. ramka SQ8L>APRS,WIDE3-3, gdy rep=3, będzie powtórzona jako SQ8L>APRS,SR8NDR*.
Najbardziej naturalnym przypadkiem będzie ustawienie takie, że rep=max+1, np. max=2, a rep=3. Wówczas ramki ze ścieżką WIDE2-N lub krótszą będą powtarzane normalnie, a ze ścieżką WIDE3-N lub dłuższą będą powtarzane jak aliasy proste. Można oczywiście zostawić także „dziurę”, w której digipeater nie będzie powtarzał ramek, np. dla max=2 i rep=5. Wtedy powtarzane normalnie będą ramki ze ścieżką WIDE2-N i krótszą, WIDE3-N i WIDE4-N nie będą powtarzane w ogóle, ale WIDE5-N i dłuższe będą powtarzane jak aliasy proste.
Opcja rep ma zastosowanie oczywiście jako ogranicznik zbyt długich ścieżek. Może zostać wyłączona przez wpisanie wartości 0.
Normalnie rep>max, jednak w przypadku niepoprawnego ustawienia (max>=rep) pierwszeństwo będzie miało powtarzanie jak ścieżek n-N aż do poziomu max.

Schemat urządzenia:

Wszystkie problemy, pytania i sugestie proszę kierować na mój e-mail: sq8vps[at]gmail.com

Przykładowe konfiguracje:

Beacon:
Przykład dla beaconu o numerze 0. Dostępne są beacony od 0 do 7.
1. „beacon 0 data !5002.63N/02157.91E#Digi Rzeszow” – ustawienie danych beaconu w standardzie APRS
2. „beacon 0 path WIDE2-2,SP2-2” – ustawienie ścieżki (1 lub 2 elementy rozdzielone przecinkami albo none)
3. „beacon 0 iv 15” – beacon co 15 minut
4. „beacon 0 dl 5” – beacon będzie nadany po raz pierwszy po 5 minutach od uruchomienia urządzenia
5. „beacon 0 on” – uruchomienie beaconu

Digi WIDE1-1 (pomocnicze):
Przykład dla slotu digi o numerze 0. Dostępne są sloty 0-3.
1. „digi 0 alias WIDE” – powtarzanie aliasów typu WIDEn-N. Liczby n i N NIE są ustawiane tutaj.
2. „digi 0 max 1” – powtarzanie ścieżek maksymalnie WIDE1-1
3. „digi 0 rep 0” – bez upraszczania ścieżek i digipeatingu po przekroczeniu limitu
4. „digi 0 trac on” – ścieżka WIDEn-N jest z definicji trasowana (wstawiany jest znak digi po powtórzeniu)
5. „digi 0 on” – włączenie obsługi konkretnego aliasu
6. „digi on” – włączenie całego digi

Digi pomocnicze viscous-delay (zalecana konfiguracja):
Przykład dla slotu digi o numerze 0. Dostępne są sloty 0-3.
1. „digi viscous on” – włączenie trybu viscous delay
2. „digi 0 alias WIDE” – powtarzanie aliasów typu WIDEn-N. Liczby n i N NIE są ustawiane tutaj.
3. „digi 0 max 2” – powtarzanie ścieżek maksymalnie WIDE2-2
4. „digi 0 rep 3” – ścieżki WIDE3-3 i dłuższe będą upraszczane przy powtarzaniu
5. „digi 0 trac on” – ścieżka WIDEn-N jest z definicji trasowana (wstawiany jest znak digi po powtórzeniu)
6. „digi 0 on” – włączenie obsługi konkretnego aliasu
7. „digi on” – włączenie całego digi

Digi regionalne WIDEn-N + SPn-N (zalecana konfiguracja):
Przykład dla slotów 0 (dla WIDE) i 1 (dla SP).
1. „digi 0 alias WIDE” – powtarzanie aliasów typu WIDEn-N. Liczby n i N NIE są ustawiane tutaj.
2. „digi 0 max 2” – powtarzanie ścieżek maksymalnie WIDE2-2
3. „digi 0 rep 3” – ścieżki WIDE3-3 i dłuższe będą upraszczane przy powtarzaniu
4. „digi 0 trac on” – ścieżka WIDEn-N jest z definicji trasowana (wstawiany jest znak digi po powtórzeniu)
5. „digi 0 on” – włączenie obsługi konkretnego aliasu
6. „digi 1 alias SP” – powtarzanie aliasów typu SPn-N. Liczby n i N NIE są ustawiane tutaj.
7. „digi 1 max 7” – powtarzanie maksymalnie ścieżek SP7-7
8. „digi 1 rep 0” – ścieżek SP nie limitujemy
9. „digi 1 trac off” – ścieżka SPn-N jest z definicji nietrasowana (nie jest wstawiany znak digi po powtórzeniu)
10. „digi 1 on” – włączenie obsługi konkretnego aliasu
11. „digi on” – włączenie całego digi

Po dokonaniu koniecznych modyfikacji należy zapisać ustawienia komendą „save”.

Znane problemy:
– urządzenie sporadycznie przekazuje ramki już powtórzone (gdy ramka zostanie odebrana dwukrotnie po powtórzeniu przez dwa różne digi). Patrząc na kod nie mogę odnaleźć tutaj problemu – może jest to kwestia zmiany jakichś bitów przez niektóre urządzenia, przez co ramka nie zostaje rozpoznana jako już powtórzona.

Zmiany:
v. 1.1.2 – 27.10.2020 – poprawka schematu, zmiana wyjścia diody RX z PB3 na PB5 (zmienił się schemat i oprogramowanie) – dziękuję Alfredo IZ7BOJ za zauważenie problemów
v. 1.1.1 – 10.09.2020 – poprawka błędu (konfiguracja aliasów 4-7 digi była wyświetlana niepoprawnie)
v. 1.1.0 – 02.08.2020 – zewnętrzne diody TX i RX, lekka wewnętrzna zmiana konfiguracji modemu
v. 1.0.0 – 01.08.2020 – pierwsze wydanie