XIAO ESP32-S3 Wio mit RS232 betreiben

Seit einiger Zeit beschäftige ich mich intensiv mit MeshCore - einer auf LoRa (Long Range) basierenden Anwendung für einfache Textkommunikation fernab des Internets und Mobilfunks. Die Technik ist zwar recht langsam, dafür jedoch sehr energieeffizient und kann auch weite Strecken überbrücken. In Zeiten von Messenger-Monopolen und sich häufenden Angriffen auf kritische Infrastruktur sind Mesh-Techniken (wie das vergleichbare Meshtastic) nicht zwangsläufig nur eine nerdige Bastelei.

Hinweis

Grundlagen zu MeshCore werden in folgendem MRMCD 2026-Vortrag (📽️) und in dieser C-RadaR Radiosendung erläutert.

Um am MeshCore-Netz partizipieren zu können wird ein sogenannter Companion benötigt. Mit einem Computer oder Smartphone verbunden fungiert dieser als "Modem" und übernimmt den Datenaustausch. Die meisten Companions werden mit einem verbauten Akku betrieben - es gibt jedoch auch via USB-betriebene Varianten, wie den XIAO ESP32-S3 & Wio-SX1262.

Verschiedene MeshCore-Companions

Bluetooth, USB - RS232?

In den meisten Fällen werden Companions via Bluetooth oder USB verbunden - in beiden Fällen wird eine serielle Verbindung aufgebaut, über die dann das MeshCore-eigene Protokoll angewandt wird. Durch einen Zufall bin ich auf eine Webseite gestoßen, die einen Meshtastic-Client für einige Retro-Plattformen (Amiga, Atari, MS-DOS) anbietet. Technisch gesehen wird hier ein handelsüblicher Companion über eine serielle RS232-Verbindung mit der betagten Hardware verbunden; die Software übernimmt die Protokoll-Kommunikation, um Meshtastic zu nutzen. Ich habe mir also folgerichtig die berechtigte Frage gestellt, wie aufwändig es wohl sein dürfte, einen vergleichbaren Client für MeshCore und MS-DOS zu entwickeln.

MeshCore bietet für unterstützte Companions aktuelle Firmware-Versionen zum Download und zur direkten Installation über den Web-Browser an. Da die Geräte meistens auf gängigen Micro-Controllern basieren, lässt sich die Firmware komfortabel aktualisieren und wechseln - beispielsweise auch um zwischen MeshCore und Meshtastic zu wechseln.

Serial-Support in der MeshCore-Firmware

Während der Recherche bin ich auf ein Projekt gestoßen, welches Textnachrichten mit zwei Companions zwischen Meshtastic und MeshCore transportieren kann. Interessant ist, dass hierfür kein angeschlossener Computer benötigt wird - der Datenaustausch erfolgt direkt über eine serielle Datenverbindung zwischen den beiden Geräten. Hierfür bietet die MeshCore-Firmware einen sogenannten Bridge-Mode, der über entsprechende Compiler-Flags im Quellcode aktiviert werden muss:

 1[env:Xiao_S3_WIO_repeater_bridge_rs232]
 2extends = Xiao_S3_WIO
 3...
 4build_flags =
 5  ${Xiao_S3_WIO.build_flags}
 6  -D ADVERT_NAME='"RS232 Bridge"'
 7  ...
 8  -D WITH_RS232_BRIDGE=Serial2
 9; RS232 bridge Pins have been relocated from 5,6 which is the i2c bus on xiao_s3
10  -D WITH_RS232_BRIDGE_RX=3
11  -D WITH_RS232_BRIDGE_TX=4
12  -D BRIDGE_DEBUG=1
13  ...

variants/xiao_s3_wio/platformio.io - Auszug des Build Targets für eine Serial Bridge

MeshCore-Firmware kompilieren

Während es vorgefertigte Firmware-Abbilder für BLE- und USB-Companions gibt, muss bei RS232-Varianten der Compiler selbst angeworfen werden. Hierfür müssen das Git-Repository des MeshCore-Projekts geklont und einige Entwicklungstools installiert werden:

1$ python3 -m venv meshcore-venv
2$ cd meshcore-venv && source bin/activate
3$ pip install -U platformio
4$ git clone https://github.com/meshcore-dev/MeshCore.git
5$ cd MeshCore

PlatformIO übernimmt die Übersetzung und Übertragung der Firmware - hierfür muss der verwendete User bei den meisten Linux-Distributionen Mitglied der dialout-Gruppe sein.

Verschiedene Tests mit den Compiler-Flags der RS232-Bridge waren erfolglos - glücklicherweise existiert jedoch auch ein Build Target für reine serielle Kommunikation:

 1[env:Xiao_S3_WIO_companion_radio_serial]
 2extends = Xiao_S3_WIO
 3build_flags =
 4  ${Xiao_S3_WIO.build_flags}
 5  ...
 6  -D SERIAL_TX=D6
 7  -D SERIAL_RX=D7
 8;  -D MESH_PACKET_LOGGING=1
 9;  -D MESH_DEBUG=1
10  ...

variants/xiao_s3_wio/platformio.io - Auszug des Build Targets der seriellen Variante

Hier dient USB nur noch zur Stromversorgung und zum Aktualisieren der Firmware - das Anwendungsprotokoll wird ausschließlich über die Pins D6 und D7 des verbauten ESP32-S3 angesprochen. Genau das, was ich suche! 🥸

Mit dem pio-Programm wird die Firmware erstellt und übertragen:

1$ pio run -e Xiao_S3_WIO_companion_radio_serial -t upload --upload-port /dev/ttyACM0

/dev/ttyACM0 muss ggf. durch das entsprechende Gerät des USB-Companions ersetzt werden - hier helfen die Kommandos dmesg oder journalctl beim Anschließen des Companions:

1# journalctl -f
2...
3Okt 05 17:57:30 st-p14sg3 kernel: cdc_acm 3-2:1.0: ttyACM0: USB ACM device
4Okt 05 17:57:30 st-p14sg3 kernel: usbcore: registered new interface driver cdc_acm
5Okt 05 17:57:30 st-p14sg3 kernel: cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

Funktionstest

Wenn der Upload geklappt hat, sollte sich der Companion mit meshcore-cli ansprechen lassen - wer es lieber grafisch mag, greift zu Meshy.

Um das Gerät mit einem Computer zu verbinden, wird noch ein RS232-zu-TTL-Konverter (Transistor-Transistor Logic) benötigt. Bei den üblichen Online-Händlern gibt es für wenige Euro fertige Module auf Basis des MAX3232-Chips. Für moderne Computer wird auch noch ein RS232-zu-USB-Konverter benötigt.

XIAO ESP32-S3 WIO mit angeschlossenem RS232-TTL-Converter

1$ meshcore-cli -s /dev/ttyUSB0 -b 115200
2INFO:meshcore:Serial Connection started
3INFO:meshcore:Connected to stdevel-bot running on a v1.17.1 (13) fw.
4Interactive mode, most commands from terminal chat should work.
5Use "to" to select recipient, use Tab to complete name ...
6Some cmds have an help accessible with ?<cmd>. Do ?[Tab] to get a list.
7"quit", "q", CTRL+D will end interactive mode
8Fetching contacts ..... Done
9Fetching channels ..... Done

Meshy, der GTK-basierte MeshCore-Client

Fazit

Auch wenn das MeshCore-Projekt keine vorgefertigten Firmware-Images mit RS232-Support anbietet ist das Erstellen eigener Firmware-Abbilder erfreulich einfach. Auch das Anbinden des RS232-Companions mit gängigen Meshcore-Clients funktionierte anstandslos. Was jetzt noch fehlt ist ein entsprechender Client für MS-DOS. 🤓

Übersetzungen: