LogoHam

Konstrukce i-gate pro analogové APRS, část první

I-gate je rozhraní mezi analogovým vysíláním signálu APRS z vysílačky a internetem. Krátký obecný popis jsem uvedl v prvním článku tady včetně vysvětlení, proč se pustit do jeho stavby. Zde najdete podrobný návod na jeho konstrukci. Přesto jej berte spíš jen jako inspiraci, protože dost záleží na konkrétní volbě použitých komponent.

Obsah:

  1. Použité součásti
  2. Příprava linuxu
  3. Zprovoznění přijímače
  4. Aktivace zvukové karty, ovládání rádia formou služby

1) Použité součásti:

  • rádiový přijímač typu SDR s rozhraním USB
  • software ovládající rádio
  • Raspberry Pi
  • Program Direwolf
  • internetový modem s rozhraním USB nebo mobil jako WiFi hotspot

1.1) Rádiový přijímač. Výběr tohoto dílu se při mých pokusech ukázal být klíčový. Mám k dispozici dva typy. Starší Dexatek DK DVB-T Dongle (Logilink VG0002A) a nejnovější RTL-SDR Blog V4. Přesto, že oba přijímače mají stejný čip digitálního rozhraní RTL2832U, nechovají se stejně.
Starší rádio funguje vcelku korektně a podle očekávání. Má však oscilátor s menší stabilitou, takže při uvádění do chodu je potřeba experimentálně ověřit optimální korekční konstantu PPM, kompenzující výrobní odchylky jednotlivých kusů. Při prohledávání internetu se většinou dozvíte, že tohle je zásadní problém. Můj kus ale po správném nastavení fungoval spolehlivě.
Přesto jsem si pořídil i moderní rádio s nesrovnatelně vyšší přesností a stabilitou. Při testech ve windows fungovalo naprosto precizně. Při použití v linuxu byl nf signál na výstupu slabý a tedy nepoužitelný. Zatím jsem nepřišel na to proč. V této konstrukci tedy používám starší rádio.

1.2) Software ovládající rádio pro linux se jmenuje rtl-sdr. Lze jej nainstalovat přímo z linuxového repozitáře. Ale tam je starší verze. Já budu popisovat kompilaci nejnovější verze ze zdrojových textů. Přesto údajně neobsahuje podporu moderních rádií Blog V3 ani V4 (platí 6.8.2025). Pro tato rádia existuje upravená verze programu rtl-sdr, ale jak jsem se už zmínil, ani s tou mi rádio Blog V4 nefungovalo správně.

1.3) Raspberry Pi. Pro běžný provoz bude asi nejlepší verze Zero 1 WH (WiFi + GPIO konektor) nebo Zero1 W (WiFi). Má totiž bezkonkurenčně nejmenší spotřebu. To zároveň znamená, že má starší procesor zvládající OS linux pouze v 32bitové verzi. Rpi Zero 2 WH (Zero 2 W) už zvládá i 64bitový OS, ale díky modernějšímu procesoru má i poněkud vyšší spotřebu. Pro první konstrukční pokusy na seznámení s problematikou je výhodné použít Rpi3. Má nejen spoustu výkonu, takže kompilace programů je rychlejší. Ale má i 4 USB porty, které se hodí. A připojení k síti kabelem, které nevyžaduje znalost IP adresy. Terminál se umí připojit i pomocí názvu domény.

1.4) Program Direwolf. Převádí nf APRS signál na digitální data, tedy dekóduje jej protokolem AX.25. Data odesílá na server. V případě obousměrné komunikace přijímá data ze serveru, zakóduje je protokolem AX.25 (umí i protokol FX.25) a vytvořený nf signál APRS poskytne vysílačce. Jedná se o velice komplexní program a za celou dobu pokusů jsem neměl potřebu hledat alternativu. Je pěkně zdokumentovaný, což se hodí při sestavování parametrů pro příkazový řádek. Budeme ale používat jen jeho základní funkce, takže žádných speciálních modifikací v rámci nastavení se nemusíte obávat.

1.5) Internetový modem s rozhraním USB nebo mobil jako hotspot. Připojení do internetu se ukázalo být také rozsáhlejší téma, než jsem původně předpokládal. Na pokusy jsem si pořídil speciální datovou SIM O2. Aniž bych chtěl dělat jakoukoliv reklamu, líbí se mi, že za jednu roční platbu mám k dispozici dostatečné množství GB dat a nic víc nemusím řešit. Koupil jsem si i USB modem Alcatel IK41VE1, ale tady začaly problémy. Rpi Zero má jen jedno rozhraní USB. Modem zvyšuje spotřebu ze zdroje a vyžaduje použít USB HUB, který také zvyšuje spotřebu. Výhodnější je tedy použít pro připojení do internetu WiFi hotspot ve vašem mobilu. Já mobil běžně připojený k internetu nemám, proto jsem v něm použil zmíněnou SIM O2.

2) Příprava linuxu

O instalaci linuxu na SD kartu jsem už napsal tento článek. Proto zde použiji jen zkrácenou verzi. Jako HW jsem vybral Rpi Zero1 WH. To znamená, že v programu Rpi Imager musíme zvolit 32bit Raspbian a nesmíme zapomenout nastavit parametry WiFi. Pro připojení z terminálu jsem musel použít IP adresu, kterou jsem si zjistil programem IPScan. Během prvního spuštění Rpi probíhá interní konfigurace, která chvíli trvá. Je možné připojit monitor, abyste viděli průběh. Ale není to nutné. Úvodní uživatelské nastavení je jednoduché. Do okna terminálu zadejte příkaz:

sudo raspi-config

1 System Options / S5 Boot / B1 Console
6 Advanced Option / A1 Expand
Reboot? Yes

Následně provedeme aktualizace.

sudo apt-get update
sudo apt-get full-upgrade -y
sudo reboot

Pak musíme nainstalovat knihovny potřebné pro kompilaci, provoz a případné testy.

sudo apt-get install git -y
sudo apt autoremove rpicam-apps-lite -y
sudo apt-get install cmake libtool autoconf automake -y
sudo apt-get install libusb-1.0-0-dev libasound2-dev libudev-dev -y
sudo apt-get install libavahi-client-dev libavahi-common-dev libindi-dev libnova-dev -y
sudo apt-get install libhamlib-dev libgps-dev gpsd -y
sudo apt-get install indi-bin ax25-tools sox libsox-fmt-all -y
sudo reboot

První důležitou změnou systému je v případě používání WiFi vypnutí jejího powersave režimu, tedy usínání. Když totiž Rpi usne, nelze ji na dálku přes WiFi probudit, a musíme provést odpojení a znovu připojení zdroje. Jestli je powersave režim aktivní zjistíte příkazem

iw dev wlan0 get power_save

V tuto chvíli se zcela jistě dozvíte, že je aktivní. Vypnutí se musí provést automaticky po spuštění Rpi. V moderních systémech se to dělá většinou formou služby. Tato služba bude zvláštní tím, že nebude spuštěná trvale, ale provede se jen jednou. Nejprve vytvoříme skript služby:

sudo nano /etc/systemd/system/wifi-power-save-off.service

Obsah souboru:

[Unit]
Description=Disable WiFi Power Management (delayed)
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'sleep 10 && /sbin/iw dev wlan0 set power_save off'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Soubor se uloží pomocí Ctrl+O, Enter a program nano se vypíná pomocí Ctrl+X. Pak musíme službu aktivovat.

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable wifi-power-save-off.service
sudo systemctl start wifi-power-save-off.service

V tuto chvíli už musí být režim powersave vypnutý. Mnohem důležitější ale je, jestli bude vypnutý i po restartu.

sudo reboot
iw dev wlan0 get power_save

3) Zprovoznění přijímače

Pro úplnost uvádím, že novější verze programu rtl-sdr pro přijímače typu Blog V3 nebo V4 najdete na adrese git clone https://github.com/rtlsdrblog/rtl-sdr-blog.git Já se ale zaměřím na původní verzi pro starší přijímače.

git clone https://gitea.osmocom.org/sdr/rtl-sdr.git
cd rtl-sdr
mkdir build
cd build
cmake .. -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON -DENABLE_ZEROCOPY=ON -DCMAKE_BUILD_TYPE=Release
make
sudo make install
sudo ldconfig
cd ~
sudo reboot

Parametr DINSTALL_UDEV_RULES znamená, že se nastaví i přístupová práva pro používání rádia běžným uživatelem pi. Parametr DDETACH_KERNEL_DRIVER umí vypnout už aktivovaný defaultní ovladač rádia v jádru linuxu. Funkčnost rádia můžeme prověřit dvěma příkazy.

rtl_test
rtl_test -p30

V obou případech rádio zůstane spuštěné a musíte ho ručně zastavit klávesovou kombinací Ctrl+C. Druhý příkaz nechte spuštěný několik minut. Každých 30 s vypíše, o kolik se posunula frekvence oscilátoru. Upřímně, netuším, k čemu je tato informace dobrá.

4) Aktivace zvukové karty, ovládání rádia formou služby

Program pro ovládání rádia i program Direwolf budou spuštěné jako dvě samostatné služby. Výhodou je, že se po spuštění Rpi aktivují automaticky, navzájem se neovlivňují a nepotřebují ani za provozu žádnou obsluhu. Problém je s předáváním zvukových dat mezi těmito službami. Nakonec se ukázalo jako nejvýhodnější řešení využít integrovanou zvukovou kartu jako buffer. Jedna služba do něj zapisuje, druhá z něj čte. Vhodná velikost bufferu slouží i k vyrovnávání nestejných rychlostí zápisu / čtení. Pro tuto funkci už je v jádru připravený modul Alsa Loopback.
Modul se neinstaluje, jen se spustí. Protože záleží na pořadí, v jakém se zvuková zařízení spouští, nebudu vás učit ruční režim a rovnou si řekněme, že pro automatické spuštění po startu Rpi budeme muset upravit soubor /etc/modules.

sudo nano /etc/modules

Tento soubor může být prázdný, ale nemusí. V každém případě na konec dopíšeme: snd-aloop Pak soubor uložíme a restartujeme Rpi. 

sudo reboot

Pro zajímavost si můžete ověřit existenci modulu Loopback dvěma příkazy:

aplay -l
arecord -l

V obou případech musí být Loopback jako zařízení na card 0. V tom případě se výstup z rádia připojí na hw:0,0,0 a vstup programu Direwolf bude připojený na hw:0,1,0 .
Teď už můžeme program ovládání rádia nastavit jako službu. Bohužel to nejde udělat přímo. Nejprve musíme vytvořit skript příkazového řádku a teprve ten jako službu nainstalujeme.

sudo nano /usr/local/bin/rtl_sdr.sh

Obsah souboru:

#!/bin/bash

# Spuštění programu rtl_fm a posílání výstupu do ALSA loopback
rtl_fm -f 446118750 -s 24000 -g 48 -p 15 -M fm - | aplay -r 24000 -f S16_LE -t raw -D hw:0,0,0 --buffer-size=65536

Parametry programu rtl_fm:
-f: frekvence, na které má rádio poslouchat, PMR10
-s: vzorkování nf signálu
-g: zesílení rádia, starší typy neumí automatiku a ta se ani nedoporučuje
-p: korekce frekvence oscilátoru, 15 je střed mezi hodnotami, kdy moje rádio přestalo přijímat zvolenou frekvenci
-M: typ modulace, úzkopásmová fm
- : standardní výstup, musí být

Parametry programu aplay, který předává zvuk do zařízení Loopback:
-r: vzorkování nf signálu, musí být shodné s rádiem
-f: zvukový formát
-t: surová data bez doplňování identifikačních hlaviček
-D: zařízení, kam se zvuk posílá
-- buffer-size: velikost bufferu zvukovky. Nejedná se o počet bajtů, ale o počet zvukových frame

| je symbol pipeline, tedy způsob propojení programů rtl_fm a aplay. Tohle korektně funguje jen z příkazového řádku a nelze to použít přímo ve službě. Proto používáme okliku přes skript rtl_sdr.sh.
Ještě nastavíme jeho příznak pro spouštění:

sudo chmod +x /usr/local/bin/rtl_sdr.sh

Teď už můžeme vytvořit soubor služby:

sudo nano /etc/systemd/system/rtl_sdr.service

Obsah souboru:

[Unit]
Description=rtl_fm APRS to ALSA Loopback
After=network.target sound.target
Requires=alsa-restore.service

[Service]
ExecStart=/usr/local/bin/rtl_sdr.sh
Restart=always
User=pi
Group=audio

[Install]
WantedBy=multi-user.target

A službu spustíme.

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable rtl_sdr.service
sudo systemctl start rtl_sdr.service

Že služba opravdu běží můžeme v tuto chvíli i kdykoliv po startu RPi zkontrolovat příkazem:

systemctl status rtl_sdr.service

Ve výpisu musí zářit zelené označení: active (running). Pokud se to podařilo, máte za sebou první poločas. Uvařte si kávu a vrhněte se na druhý díl.

Žádné komentáře

Zanechat komentář

Odpověď na Some User

E-mail: hugocz@jevicko.org Lokátor: JN89IP