Plug the board in
Use a real USB-C data cable — charge-only cables won't show up as a serial port. If it's your first flash, hold the BOOT button while plugging in.
Pick a build below and hit Flash
Chrome, Edge, or Opera on desktop. Your browser will show a list of serial ports — pick the XIAO. The install takes about 30 seconds.
Wire it to a Heltec V3
All three builds send Remote ID JSON out UART on GPIO5 (TX) / GPIO6 (RX). Wire that to a Heltec V3 running Meshtastic in serial TEXTMSG mode at 115200. See the wiring diagram.
RemoteID Mesh — Dualcore
Single-board build. Core 0 sniffs WiFi (Open Drone ID NAN + beacon vendor IEs), Core 1 scans BLE for ODID advertisements. Every detection goes straight out USB and out UART to your Heltec. Use this if you have one detector and one Heltec mesh — no multi-node dedup needed.
- Target
- XIAO ESP32-S3
- Mode
- WiFi + BLE, concurrent
- UART Out
- GPIO5 TX / GPIO6 RX @ 115200
- JSON
- to USB Serial + Heltec V3
Node Mode splits the standard build into two firmwares: put Remote on every field detector, and Home on the base receiver plugged into mesh-mapper.py. Deploy as many Remotes as you want.
┌─────────────────────────────────────────────────────────────┐ │ REMOTE NODE (field) │ │ XIAO ESP32S3 ──UART──> Heltec V3 (Meshtastic) ──LoRa──> │ │ WiFi + BLE drone GPIO5 TX -> Heltec RX │ │ detection GPIO6 RX <- Heltec TX │ │ (Open Drone ID) │ └─────────────────────────────────────────────────────────────┘ │ LoRa Mesh Network (multiple hops OK) │ ┌─────────────────────────────────────────────────────────────┐ │ HOME NODE (base) │ │ Heltec V3 (Meshtastic) ──UART──> XIAO ESP32S3 ──USB──> │ │ receives mesh data GPIO6 RX <- Heltec TX computer │ │ GPIO5 TX -> Heltec RX running │ │ NO detection. dedup engine mesh-mapper│ │ Just a smart bridge. │ └─────────────────────────────────────────────────────────────┘
The dedup problem: when 5 Remotes see the same drone, without dedup the mapper gets 5 copies of one detection. Every Remote tags its JSON with a unique node_id derived from its ESP32 MAC. The Home node keys on the drone's MAC — the first hit forwards instantly, duplicates from other Remotes within 500ms are dropped, and after 500ms the next hit goes through (drone moved). Near real-time tracking, no multi-node spam.
Node Mode — Remote (Field Detector)
Dual-core: WiFi promiscuous on Core 0, BLE scan on Core 1. Every detection tagged with node_id (4-char hex from the ESP32 MAC) so the Home node can dedup. LED blinks per detection, heartbeat every 60s.
- Target
- XIAO ESP32-S3
- Role
- Detection + mesh sender
- UART
- GPIO5 TX / GPIO6 RX @ 115200 → Heltec V3
- Deploy
- One per field board (N remotes OK)
Nothing shows up in the port picker
Try a different USB-C cable (charge-only won't work), install CH340 or CP210x drivers if your OS doesn't auto-detect, or hold BOOT while plugging in to force download mode.
Heltec not receiving JSON from a Remote
Confirm serial module is enabled on the Heltec: serial.enabled true, serial.mode TEXTMSG, serial.baud BAUD_115200, serial.rxd 19, serial.txd 20. All Heltecs must share the same Meshtastic channel + key.
mesh-mapper.py sees duplicate detections
You're probably running Standard Dualcore on multiple boards feeding one mapper. That build has no dedup. Reflash the field boards with Node Mode / Remote and the base board with Node Mode / Home.
No drone detections at all
Confirm firmware is running: open serial monitor at 115200 and look for the heartbeat line. Some drones don't broadcast Remote ID — required in many jurisdictions but not universal.