Merge pull request #12 from SQ9MDD/main

A few small details collectively
pull/13/merge
Piotr Wilkoń 2022-11-08 19:15:47 +01:00 zatwierdzone przez GitHub
commit b529529095
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 75 dodań i 21 usunięć

Wyświetl plik

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>F103C8T6_DIGI_USB</name>
<comment />
<comment></comment>
<projects>
</projects>
<buildSpec>
@ -24,23 +24,4 @@
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
<nature>fr.ac6.mcu.ide.core.MCUProjectNature</nature>
</natures>
<linkedResources>
<link>
<name>USB_Device_Library/usbd_core.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c</location>
</link><link>
<name>USB_Device_Library/usbd_ctlreq.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c</location>
</link><link>
<name>USB_Device_Library/usbd_ioreq.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c</location>
</link><link>
<name>USB_Device_Library/usbd_cdc.c</name>
<type>1</type>
<location>PARENT-2-PROJECT_LOC/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c</location>
</link></linkedResources>
</projectDescription>

48
README_pl.md 100644
Wyświetl plik

@ -0,0 +1,48 @@
# VP-Digi (PL)
VP-Digi to funkcjonalny, tani, łatwy w montażu i konfiguracji sterownik APRS digipeater oparty na STM32 z wbudowanym modemem KISS.
* modem 1200 Bd Bell 202 (standard VHF APRS)
* Generowanie sygnału R2R lub PWM
* Analogowo-cyfrowe wykrywanie zajętego kanału (wykrywanie nośnika danych)
* koder/dekoder AX.25 zaprojektowany dla ramek APRS
* digipeater: 4 ustawialne aliasy n-N, 4 proste aliasy, opóźnienie lepkie (znane z aprx) lub tylko bezpośrednie, lista czarno-biała.
* 8 niezależnych beaconów
* tryb KISS (może być używany jako zwykły modem z UI-View, APRSIS32, XASTIR itp.)
* USB i 2 UART-y: niezależne, działające w trybie KISS, monitora lub konfiguracji
## Opis, schemat, instrukcja
Jeśli nie interesuje Cię kod źródłowy, to repozytorium nie jest dla Ciebie. Możesz znaleźć pełny opis projektu, schematy, skompilowany firmware i instrukcje [na mojej stronie](https://sq8l.pzk.pl/index.php/vp-digi-cheap-and-functional-aprs-digipeater-controller-with-kiss-modem/).
## Wykorzystanie kodu źródłowego
Firmware został napisany przy użyciu System Workbench for STM32 (SW4STM32) i powinieneś być w stanie zaimportować to repozytorium bezpośrednio do IDE. Kod źródłowy jest publicznie dostępny od wersji 1.3.0.
## Opis techniczny
Projekt został zaprojektowany do uruchomienia na płytce Blue Pill (STM32F103C8T6) z kryształem 8MHz. Firmware został napisany z wykorzystaniem jedynie operacji na rejestrach (z nagłówkami ST) oraz bibliotek CMSIS. HAL jest tam tylko dla USB. Kod jest (dość) obszernie komentowany tam gdzie trzeba, więc nie powinien być bardzo trudny do zrozumienia.
### Demodulator
Są dwa demodulatory (i dekodery) pracujące równolegle, aby zapewnić lepszą wydajność. Sygnał jest próbkowany z częstotliwością 38400Hz (32 próbki na symbol) przez DMA. Przerwanie jest generowane po otrzymaniu 4 próbek, a próbki są decymowane. Następnie przechodzą one przez filtr preemfazy/deemfazy (jeśli jest włączony), który wyrównuje amplitudy tonów. Przefiltrowane próbki są mnożone przez lokalnie generowane tony znakowe i przestrzenne (ich części I i Q - cosinus i sinus). Daje to współczynnik korelacji pomiędzy sygnałem wejściowym a każdym tonem. W międzyczasie wytwarzany jest niefiltrowany symbol, który służy do wysterowania PLL detekcji nośnej danych. Różnica współczynników korelacji stanowi nową próbkę i jest przepuszczana przez filtr dolnoprzepustowy w celu wyeliminowania szumu. Filtrowane próbki są porównywane z zerem i demodulowany symbol jest wysyłany do mechanizmu odzyskiwania bitów.
### Odzyskiwanie bitu (i dekoder NRZI)
Mechanizm odzyskiwania bitów jest oparty na cyfrowym PLL. PLL pracuje nominalnie z częstotliwością 1200Hz (=1200 Baud). Zmiana symbolu powinna nastąpić w pobliżu zera licznika PLL, tak aby licznik przepełnił się w połowie symbolu i wartość symbolu została spróbkowana. Przy każdej zmianie symbolu licznik jest mnożony przez współczynnik <1, aby zbliżyć go do zera, utrzymując PLL i sygnał przychodzący w fazie. Sygnał DCD jest multipleksowany z obu modemów. Wyjaśnione więcej w [modem.c](Src/drivers/modem.c). Próbkowany symbol jest dekodowany przez dekoder NRZI i wysyłany do warstwy AX.25.
### Dekodowanie AX.25
Dekoder AX.25 jest dość standardowy. CRC, PID i Control Byte są sprawdzane i obie ścieżki modemu są multipleksowane, aby wyprodukować tylko jedną ramkę wyjściową.
### Wykrywanie nośnika danych
DCD wykorzystuje podejście analogowo-cyfrowe: oparte na PLL, ale pracujące na cyfrowym, niefiltrowanym strumieniu symboli. PLL działa w taki sam sposób jak PLL odzyskiwania bitów, z wyjątkiem tego, że jest zaimplementowany specjalny mechanizm liczenia impulsów DCD, wyjaśniony w [modem.c](Src/drivers/modem.c). Takie podejście wydaje się być znacznie bardziej efektywne niż typowa, cyfrowa, oparta na AX.25 detekcja.
### Kodowanie AX.25
Koder AX.25 jest również dość prosty. Może obsługiwać wiele ramek w rzędzie (ograniczone długością bufora). Każda transmisja rozpoczyna się od flag preambuły, następnie flag nagłówka, danych rzeczywistych, CRC, flag stopki/rozdzielających, danych rzeczywistych, CRC, flag stopki/rozdzielających... i flag ogona. Bity surowe są żądane przez modulator.
### Modulator (i koder NRZI)
Koder NRZI pracuje dokładnie z częstotliwością 1200Hz (=1200 Baud) i żąda bitów od kodera AX.25. Bity są kodowane do symboli, a interwał timera próbkowania DAC jest ustawiony w zależności od wartości symbolu. Z tego powodu używana jest tylko jedna tabela sinusów. Dla tonu 1200 Hz interwał timera jest większy niż dla tonu 2200 Hz - częstotliwość próbkowania jest zmieniana, aby zmienić częstotliwość sygnału wyjściowego. Indeks tablicy jest zawsze zachowany, aby faza sygnału wyjściowego była ciągła.
## Używanie kodu VP-Digi w twoim projekcie
Chciałbym usłyszeć o projektach, które implementują kod źródłowy VP-Digi. Jeśli tworzysz taki, daj mi znać na sq8vps(at)gmail.com.
## Referencje
Ukończenie projektu zajęło sporo czasu, ale obecnie jest to prawdopodobnie najbardziej efektywny, publicznie dostępny modem oparty na STM32 i najbardziej konfigurowalny, oparty na mikrokontrolerze digipeater APRS. Chciałbym wspomnieć o kilku źródłach, które uznałem za naprawdę przydatne lub inspirujące:
* [multimon-ng](https://github.com/EliasOenal/multimon-ng) - ogólny pomysł na demodulator (korelacja)
* [BeRTOS](https://github.com/develersrl/bertos) - dekoder AX.25
* [Forum thread by SP8EBC](http://forum.aprs.pl/index.php?topic=2086.0) - inspiracja
* [DireWolf](https://github.com/wb2osz/direwolf) - pomysł na odzyskanie bitów PLL
* [A High-Performance Sound-Card AX.25 Modem](https://www.tau.ac.il/~stoledo/Bib/Pubs/QEX-JulAug-2012.pdf) - pomysł na preemfazę i filtrowanie dolnoprzepustowe
* [UZ7HO Soundmodem](http://uz7.ho.ua/packetradio.htm) - pomysł DCD opartego na PLL
## Przyczynianie się
Wszystkie wkłady są doceniane, ale proszę o utrzymanie kodu w miarę czystego. Proszę również upewnić się, że firmware działa dobrze przed stworzeniem pull request.
## Licencja
Projekt jest objęty licencją GNU GPL v3 (zobacz [LICENSE](LICENSE)).

Wyświetl plik

@ -448,46 +448,71 @@ void term_parse(uint8_t *cmd, uint16_t len, Terminal_stream src, Uart_data_type
if(checkcmd(cmd, 4, (uint8_t*)"help"))
{
term_sendString((uint8_t*)"\r\nCommands available in config mode:\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"print - prints all configuration parameters\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"list - prints callsign filter list\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"save - saves configuration and reboots the device\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"eraseall - erases all configurations and reboots the device\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"help - shows this help page\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"reboot - reboots the device\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"version - shows full firmware version info\r\n\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"call <callsign> - sets callsign\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"ssid <0-15> - sets SSID\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"dest <address> - sets destination address\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"txdelay <50-2550> - sets TXDelay time (ms)\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"txtail <10-2550> - sets TXTail time (ms)\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"quiet <100-2550> - sets quiet time (ms)\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"rs1baud/rs2baud <1200-115200> - sets UART1/UART2 baudrate\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"pwm [on/off] - enables/disables PWM. If PWM is off, R2R will be used instead\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"flat [on/off] - set to \"on\" if flat audio input is used\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"beacon <0-7> [on/off] - enables/disables specified beacon\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"beacon <0-7> [iv/dl] <0-720> - sets interval/delay for the specified beacon (min)\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"beacon <0-7> path <el1,[el2]>/none - sets path for the specified beacon\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"beacon <0-7> data <data> - sets information field for the specified beacon\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi [on/off] - enables/disables whole digipeater\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-7> [on/off] - enables/disables specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-7> alias <alias> - sets alias for the specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-3> [max/rep] <0/1-7> - sets maximum/replacement N for the specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-7> trac [on/off] - enables/disables packet tracing for the specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-7> viscous [on/off] - enables/disables viscous-delay digipeating for the specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-7> direct [on/off] - enables/disables direct-only digipeating for the specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi <0-7> filter [on/off] - enables/disables packet filtering for the specified slot\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi filter [black/white] - sets filtering type to blacklist/whitelist\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi dupe <5-255> - sets anti-dupe buffer time (s)\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"digi list <0-19> [set <call>/remove] - sets/clears specified callsign slot in filter list\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"autoreset <0-255> - sets auto-reset interval (h) - 0 to disable\r\n", 0);
term_sendBuf(src);
term_sendString((uint8_t*)"monkiss [on/off] - send own and digipeated frames to KISS ports\r\n", 0);
term_sendBuf(src);
return;
@ -557,7 +582,7 @@ void term_parse(uint8_t *cmd, uint16_t len, Terminal_stream src, Uart_data_type
term_sendBuf(src);
for(uint8_t i = 0; i < 8; i++)
{
term_sendString((uint8_t*)"\r\n\r\nBeacon ", 0);
term_sendString((uint8_t*)"\r\nBeacon ", 0);
term_sendByte(i + 48);
term_sendString((uint8_t*)": ", 0);
if(beacon[i].enable)