LoRa APRS iGate - můj první počin z radioamatérského světa

Technologie LoRa (speciální modulace vyvinutá firmou Semtech, která zároveň vyrábí radiové čipy) mě zaujala od první chvíle, kdy jsem se s ní seznámil. Hodí se báječně pro bateriová IoT zařízení, která mají přenášet data o velmi malém objemu na veliké vzdálenosti při naprosto minimální spotřebě.

Navíc existují celosvětové LoRaWAN sítě s volným přístupem (například The Things Network). Pro aplikaci v pikobalónech má ovšem LoRa jednu značnou nevýhodu. Svět je totiž rozdělen do oblastí používajících pro LoRa přenos různá bezlicenční frekvenční pásma (866 MHz Evropa, 915 MHz Amerika, 433MHz Asie atd.). Pokud by tedy balón obíhající zeměkouli chtěl tuto technologii používat, musel by obsahovat tři LoRa moduly a přepínat pomocí geofencingu, který se má zrovna využívat. Pro pikobalóny několik zbytečných gramů navíc - takže nepoužitelné.

V nedávné době jsem se ovšem dozvěděl, že LoRa moduly používají i radioamatéři v systému APRS a to po celém světě jednotně v pásmu 433 MHz. Takže jsem neváhal a z Číny objednal potřebné moduly (https://www.ebay.com/itm/123735978609, ale zájemncům doporučuji spíše něco jako https://www.ebay.com/itm/224299703358, který má SMA konektor namísto toho nepříjemného MHF4 pidižvíka). 

Potřebný kód pro APRS gateway najdete na https://github.com/lora-aprs/LoRa_APRS_iGate. Nevýhodou je, že autorem je rakušan, který komunikuje převážně v němčině a kód neobsahuje téměř žádné komentáře a je poměrně složitý, takže trvá, než se v tom člověk zorientuje, proto zde popíšu pár poznatků, které snad zájemcům trochu zjednoduší rozchození.

  1. Prvním krokem je vyplnit konfiguraci v souboru data/is-cfg.json Vyplňuje se tam volací značka s doplněným SSID. Hned u tohoto kroku jsem se zasekl na víc jak 14 dní, protože jsem netušil, jak má SSID v síti APRS vypadat a zarputile jsem tam cpal OK1SE-01. APRS síť sice tuto iGate zaregistrovala, ale odmítala přijímat forwardované packety, protože, jak jsem po dlouhch bojích zjistil SSID se chová jako číslo 1 až 15 a nevýznamné nuly tam být nesmí. Navíc v ČR je konvence, že gatewaye by měly mít SSID 12 (případně 14 nebo 15). Takže teď už mojí gateway najdete se správnou značkou OK1SE-12.
    Dále se tam vyplní údaje o poloze, údaje pro lokální WiFi síť, (režim získání IP adresy, hostname, SSID a heslo do WiFi, údaje do sítě APRS (typicky server euro.aprs2.net, port 14580 a passcode získaný třeba z http://apps.magicbug.co.uk/passcode/) a případně je možno změnit NTP server nebo další hodnoty podle potřeby. 
  2. Skompiluje se hlavní program (src/LoRa_APRS_iGate.cpp), modul se připojí USB kabelem a stiskem tlačítka RST za současného držení tlačítka PRG se zresetuje do stavu, kdy očekává nahrání programu. Po nahrání 100% kódu ještě vydržte pár vteřin, než se ukáže řádka Success, pak teprve je možné modul odpojit nebo zresetovat.  
  3. Po resetu se po úspěšném uploadu kódu sice modul spustí, ale fungovat ještě nebude. Schází mu totiž onen konfigurační soubor z kroku 1. který je uložen v jednoduchém filesystemu ve flashce modulu. Ten se tam vytvoří/nahraje pomocí ikonky Platformio aliena (v levém panelu Platformia) a dále PROJECT TASKS/lora_board/Platform/Upload Filesystem Image. Modul musí být před tím opět zresetován do programovacího režimu a opět čekáme po nahrání na hlášku Success. 
  4. Pokud se vše podařilo, bude už modul vypisovat informace na svůj minidisplej a pokud si v Platformiu připojíte sériový monitor, bude prostřednictvím USB posílat log i do počítače. Po chvilce byste ho také měli najít na stránce aprs.fi. Program má také zabudován mechanizmus OTA (Over The Air programing), takže další nahrávání upraveného programu lze provádět prostřednictvím WiFi s modulem umístěným třeba na střeše. Stačí do platformio.ini napsat IP adresu nebo hostname modulu a odkomentovat řádky upload_protocol = espota a upload_port = <IP adresa modulu>

Jediná nevýhoda, na kterou jsem u tohoto softwaru narazil je, že k přijatým packetům nepřidával informace o kvalitě signálu (RSSI a SNR). Proto jem si kód mírně upravil (asi to není úplně programátorsky čisté, ale funguje to). Úprava je v souboru TaskModem.cpp zhruba kolem řádku 40. Pod řádek  if (_lora_aprs.checkMessage()) přidáme deklaraci proměnné sig:

String sig = "";    // přidáno
a pod následující řádek std::shared_ptr msg = _lora_aprs.getMessage(); ještě vložíme:
sig = " SNR=" + String(_lora_aprs.packetSnr()) + " RSSI=" + String(_lora_aprs.packetRssi());     // přidáno
msg->getBody()->setData(msg->getBody()->getData() + sig);    // přidáno

Dále už následuje původní kód. 

Tahle úprava způsobí, že na konec packetu se připíše text s hodnotami SNR a RSSI a teprve takto upravený se odešle na APRS servery.

73! Jakub, OK1SE