English version

-

ESP-igate v3 albo iGate, który dogadał się z iPhone'em


Firmware iGate do dsTNCv2 ma już swoją historię. Pierwszą wersję napisał Krzysiek SP9SKP na moduł ESP01 i działała dobrze przez lata - niestety źródła zaginęły i zostały same binarki. Przepisałem więc całość od zera, a skoro już siedziałem w tym kodzie, to przy okazji przeniosłem go na coś nowszego niż ESP01: Seeed XIAO ESP32-C6. Modułek jest wielkości paznokcia, kosztuje tyle co dwie kawy i ma na pokładzie WiFi, BLE 5, 4 MB flasha i własne USB.

Powód był jednak konkretniejszy niż "bo nowsze". Użytkownicy Androida mają APRSDroid i Bluetooth Classic SPP - i to działa od zawsze. Tylko że iOS nie udostępnia SPP w ogóle, więc z iPhonem nie dogadasz się w ten sposób ani przez HC-05, ani przez żaden inny modulik BT. Jedyna droga to Bluetooth Low Energy. ESP01 nie ma BLE, ESP32-C6 ma - i stąd ta wersja. iGate wystawia więc KISS-a po BLE jako Nordic UART Service i telefon widzi go jak zwykły TNC.

Przy okazji zrobiło się luźniej z zasobami. Na ESP01 modem zajmował jedyny UART, więc log diagnostyczny musiał lecieć po sieci. Na C6 USB jest osobnym kawałkiem sprzętu, modem ma własny UART, a ja mogę patrzeć w konsolę kablem i po UDP jednocześnie. Konfiguracja przeniosła się z ręcznie liczonego sektora flasha do NVS, więc nie trzeba już zgadywać, gdzie SDK trzyma swoje dane.

Aktualny status projektu

  • iGate RF → APRS-IS z filtrem odległościowym i filtrem duplikatów
  • iGate dwukierunkowy - wiadomości z APRS-IS trafiają na RF do stacji słyszanych lokalnie
  • Digipeater WIDEn-N z podmianą znaku (WIDE2-2 → MYCALL*,WIDE2-1)
  • De-tunelowanie pakietów third-party i retransmisja w normalnym formacie
  • Serwer TNC po TCP - KISS albo TNC2 (text), do 2 klientów jednocześnie
  • KISS po BLE - Nordic UART Service, iPhone/iPad, do 2 klientów
  • Gatowanie BLE ↔ APRS-IS w obu kierunkach, każdy kierunek osobnym przełącznikiem
  • Beacon pozycji, obsługa wiadomości APRS z potwierdzeniami
  • WebUI z konfiguracją i statusem, konfiguracja w NVS
  • Log po USB-CDC i po UDP multicast (239.199.9.1:9199)
  • Antena wbudowana albo gniazdo U.FL - do wyboru w konfiguracji

Uwaga: to świeża wersja, dopiero po porcie. Jeśli traficie na coś dziwnego - piszcie, poprawię.

Jak to podłączyć

Wszystko na poziomach 3V3, wspólna masa, 19200 8N1. Trzy przewody plus masa:

XIAO D6 (GPIO16)  ---->  RX modemu dsTNCv2
XIAO D7 (GPIO17)  <----  TX modemu dsTNCv2
XIAO D3 (GPIO21)  <----  CTS modemu (HIGH = gotowy, LOW = zajety)
                         * wejscie z wewnetrznym pull-up *
GND               -----  GND

CTS ma podciąganie do plusa, więc jak zapomnicie tego przewodu, to iGate uzna modem za wiecznie gotowy i będzie nadawał na oślep. Lepiej podłączyć - dsPIC gubi ramkę, jeśli druga wjedzie mu w UART, kiedy jeszcze nadaje pierwszą.

Kierunki gatowania

Trzy niezależne przełączniki w zakładce APRS. Domyślnie włączony jest tylko pierwszy, czyli BLE zachowuje się jak zwykły TNC:

PrzełącznikDomyślnieCo robi
BLE → RFwłączonyramka z telefonu idzie w eter
BLE → APRS-ISwyłączonyramka z telefonu idzie do sieci - ścieżka kończona TCPIP*, q-konstrukt dokłada serwer
APRS-IS → BLEwyłączonycały strumień z filtra serwera podawany telefonowi jako KISS

Ostatni kierunek jest tym, po co to w ogóle powstało: telefon bez zasięgu LTE dostaje pełny ruch APRS-IS przez iGate, po BLE. iGate odsiewa echa, żeby ta sama ramka nie wpadła na mapę dwa razy - raz z eteru, raz z sieci.

Do pobrania

W paczce są dwa pliki bin: factory (bootloader + tablica partycji + aplikacja, wgrywany od zera) i app (sama aplikacja, do aktualizacji bez ruszania konfiguracji), skrypt flash.sh i krótkie README.

FAQ

Jak wgrać firmware?
XIAO ma USB-C i nie potrzebuje żadnego programatora. Pod linuxem:

esptool.py --chip esp32c6 --port /dev/ttyACM0 --baud 460800 \
    write_flash -z 0x0 esp-igate_v3.0_factory.bin
Aktualizacja, bez ruszania bootloadera:
esptool.py --chip esp32c6 --port /dev/ttyACM0 --baud 460800 \
    write_flash -z 0x10000 esp-igate_v3.0_app.bin
Jeśli płytka nie daje się złapać, wejdźcie w bootloader ręcznie: trzymać B, kliknąć R, puścić B.

Jakie jest hasło do WiFi i jak to ustawić?
Tak samo jak w starym ESP01: po wgraniu firmware moduł startuje w trybie konfiguracji i rozgłasza sieć SSID:dsTNC z hasłem 123456789. WebUI siedzi pod 10.0.0.1. Podłączamy się do tej sieci, wpisujemy swoją sieć WiFi, znak, passcode APRS-IS i pozycję. DHCP jest domyślnie włączony, ale można też przypisać adres statycznie.

Czy mogę używać WiFi i BLE jednocześnie?
Tak - i to jest największa różnica względem starego rozwiązania. Przy ESP01 i HC-05 trzeba było wybrać: albo WiFi, albo Bluetooth, bo to były dwa różne moduły w jednym gniazdku. C6 obsługuje jedno i drugie równolegle. Radio 2.4 GHz jest wspólne, więc przy przesyłaniu dużych plików obie strony trochę na tym tracą, ale ruch APRS to kilka ramek na sekundę i nie ma tam czego dzielić.

Jak podłączyć iPhone'a?
Potrzebna jest aplikacja obsługująca KISS po BLE. iGate rozgłasza się jako dsTNC i wystawia Nordic UART Service:

serwis  6E400001-B5A3-F393-E0A9-E50E24DCCA9E
RX      6E400002-B5A3-F393-E0A9-E50E24DCCA9E  (write - telefon do iGate)
TX      6E400003-B5A3-F393-E0A9-E50E24DCCA9E  (notify - iGate do telefonu)
To standardowe UUID NUS, więc w aplikacji zwykle wystarczy wybrać gotowy preset "Nordic UART" i nie trzeba niczego przepisywać z palca. Sam używam własnej aplikacji na iOS, którą jeszcze szlifuję - jak będzie się nadawała dla ludzi, dorzucę tutaj link.

Czemu nie zwykły ESP32 z Bluetooth Classic, żeby działał APRSDroid?
Bo iPhone i tak nie zobaczy SPP - iOS tego profilu nie udostępnia aplikacjom. Musiałbym wybierać, komu ma być wygodnie. Android nie zostaje jednak na lodzie: jest serwer TNC po TCP (domyślnie port 8001, KISS albo TNC2), a APRSDroid łączy się po sieci równie dobrze jak po Bluetooth. Do tego telefon po BLE i komputer po TCP mogą wisieć jednocześnie - obaj dostają ten sam ruch.

Czy mogę podłączyć to do radia z wbudowanym TNC, bez dsTNCv2?
Tak, o ile radio potrafi wystawić KISS-a albo TNC2 po porcie szeregowym - np. Kenwood TM-D710 (TNC przełączony w tryb KISS) czy nowsze Yaesu w rodzaju FTM-510; jak dokładnie przełączyć port danych, trzeba sprawdzić w instrukcji konkretnego modelu. Firmware sam rozpoznaje, czy dostaje ramki KISS, czy linijki tekstowe TNC2, więc z tej strony nie ma nic do ustawiania - prędkość portu wpisuje się w WebUI.

Trzeba natomiast dopasować poziomy do 3V3. Port COM w Kenwoodach to RS-232 z prawdziwymi poziomami, więc potrzebny jest konwerter w rodzaju MAX3232; jeśli radio ma port w logice 5 V, wystarczy przesuwnik poziomów albo dzielnik. Krytyczny jest kierunek do ESP: 5 V, a tym bardziej 12 V z RS-232, podane wprost na pin C6 kończy się wymianą modułu. W drugą stronę jest łagodniej, bo 3V3 z ESP zwykle wystarcza wejściu radia jako stan wysoki.

Linii CTS w takim układzie nie ma czym podłączyć i nie trzeba - wejście jest podciągnięte, więc iGate uzna nadajnik za wiecznie gotowy. Dla iGate'a tylko odbiorczego to bez znaczenia. Jeśli włączycie digipeater albo gatowanie wiadomości z APRS-IS na RF, to warto pamiętać, że bez CTS iGate nie wie, kiedy TNC radia nadaje, i może wepchnąć mu ramkę w trakcie nadawania. dsTNCv2 tę linię ma i dlatego jest tam pewniej.

Czy stary ESP01 przestaje działać?
Nie. Firmware na ESP8266 stoi tam, gdzie stał, i dalej można go wgrywać - linki są na stronie dsTNCv2. Nowe rzeczy będą jednak powstawać na C6; utrzymywanie dwóch wersji tego samego kodu to droga do błędów w obu.

Antena wbudowana czy zewnętrzna?
XIAO ma jedno i drugie: ceramiczną na płytce i gniazdko U.FL. Domyślnie pracuje ta na płytce. Przełącznik jest w WebUI w zakładce Network i wymaga restartu. Jeśli wybierzecie zewnętrzną, upewnijcie się, że antena jest wkręcona - nadawanie w rozwarte gniazdo nie jest zdrowe dla toru.

Po aktualizacji zniknęła konfiguracja - co się stało?
To normalne, jeśli w firmware zmienił się format konfiguracji. Struktura ma numer wersji i przy niezgodności moduł wstaje na ustawieniach fabrycznych - lepiej to niż czytanie starych danych jako nowych i tłumaczenie potem, dlaczego iGate nadaje nie tam, gdzie miał. Znak, passcode i pozycja do wpisania jeszcze raz.

Skąd wziąć moduł?
XIAO ESP32-C6 to gotowy produkt Seeed Studio, można go kupić u nich albo w typowych sklepach z elektroniką. Nie ma tu nic do lutowania poza trzema przewodami do dsTNCv2.

Jeśli masz pytania - zapraszam do mailowania. Pamiętaj jednak, że mam sporo zajęć i mogę odpowiadać z opóźnieniem :-) 73! DE Tomek, SP9UOB.

Jeśli podoba Ci się mój projekt, możesz go wesprzeć przekazując darowiznę:

-