ArduPilot Multi-Vehicle DigiMesh Point-to-Multipoint Setup
This tutorial shows how to connect one ground control station (GCS) to multiple ArduPilot vehicles through a shared DigiMesh network. Each vehicle uses a Vimdrones XBee SX connected to a telemetry port, while another XBee SX connects to the GCS by USB.
The ground XBee broadcasts commands to all vehicle radios. Each vehicle XBee sends its telemetry directly back to the ground XBee. MAVLink identifies each vehicle by its unique ArduPilot system ID.
Transparent Mode is required
Every XBee in this setup must use Transparent Mode (AP=0). In Transparent Mode, MAVLink bytes received on the UART are transmitted over the radio link without XBee API frames. ArduPilot and the GCS cannot use this setup if a radio is in API mode.
Network Topology
┌── XBee SX ── Vehicle 1 (SYSID 1)
GCS ── USB ── XBee SX )))───┼── XBee SX ── Vehicle 2 (SYSID 2)
└── XBee SX ── Vehicle 3 (SYSID 3)
Only the destination addresses need to be changed:
- GCS XBee: set the broadcast destination
DH=0,DL=FFFF. - Vehicle XBee: set
DHandDLto the GCS XBee'sSHandSLvalues.
This creates a broadcast downlink from the GCS and individual unicast uplinks from the vehicles.
Use only for a small fleet
The GCS downlink uses broadcast traffic, which is not acknowledged or retried at the DigiMesh application level. All vehicles still share the same RF airtime, so link congestion increases as vehicles and MAVLink stream rates are added. Bench-test the complete fleet before flight and use conservative telemetry rates.
Hardware Required
- One Vimdrones XBee SX for the GCS
- One Vimdrones XBee SX for each vehicle
- Compatible antennas for the XBee SX frequency variant
- ArduPilot flight controllers with available telemetry ports
- A computer with a serial terminal or Digi XCTU, plus a multi-vehicle-capable GCS
Software Required
- A serial terminal, or optionally Digi XCTU
- GCS: QGroundControl, Mission Planner, or MAVProxy
Use matching radio variants and firmware
All modules must support the same frequency band and run compatible DigiMesh firmware. Do not mix an SX 868 network with an SX 900 network, or DigiMesh firmware with Point-to-Multipoint firmware.
Step 1 — Wire the Vehicle Radios
Connect each XBee SX to a flight controller telemetry port:

| XBee SX | Flight controller telemetry port |
|---|---|
5V |
5V |
GND |
GND |
TX |
RX |
RX |
TX |
CTS |
RTS (only when flow control is enabled) |
RTS |
CTS (only when flow control is enabled) |
USB and Telem share one UART
The Vimdrones XBee SX has one UART shared by the USB port and Telem connector. Do not use both data connections at the same time. Disconnect the vehicle telemetry cable while configuring that radio through USB.
Step 2 — Configure Destination Addresses
The destination addresses can be configured either with Digi XCTU or directly from a serial terminal using AT Command Mode. Confirm that every radio uses Transparent Mode (AP=0); with that prerequisite satisfied, only DH and DL need to be changed for this point-to-multipoint setup.
Option 1: Serial Terminal and AT Command Mode
Connect one XBee at a time to the computer by USB and open its serial port at the radio's current baud rate.
To enter AT Command Mode:
- Stop sending data and wait at least one second.
- Type
+++without pressing Enter. - Do not send anything for at least one more second.
- The XBee responds with
OKwhen Command Mode is active.
Disconnect MAVLink while entering Command Mode
The +++ escape sequence requires quiet time before and after it. Disconnect the vehicle telemetry connector and close any GCS or other program using the same serial port, otherwise continuous MAVLink traffic may prevent the radio from entering Command Mode.
AT commands are terminated by pressing Enter.
Configure the GCS XBee
First read and record the GCS XBee's unique address:
ATAP
ATSH
ATSL
ATAP must return 0. If it does not, set Transparent Mode and save it before continuing:
ATAP0
ATWR
Then configure its destination as broadcast, save the settings, and exit Command Mode:
ATDH0
ATDLFFFF
ATWR
ATCN
Configure Each Vehicle XBee
Enter the GCS XBee's SH and SL values as the vehicle radio's destination. For example, if the GCS radio reports SH=0013A200 and SL=12345678:
ATDH0013A200
ATDL12345678
ATWR
ATCN
Repeat this procedure for every vehicle XBee. ATWR saves the values to non-volatile memory; ATCN exits Command Mode.
Option 2: Digi XCTU
Configure one radio at a time through USB. In XCTU, add the radio and open its configuration page. Confirm that AP — API Enable is set to Transparent Mode [0]. Leave the existing radio configuration unchanged except for DH and DL.
1. Read the GCS XBee Address
On the GCS XBee, locate these read-only values:
SH— Serial Number HighSL— Serial Number Low
Record both values. Together they form the GCS XBee's unique 64-bit address and will be entered into every vehicle radio.
2. Configure the GCS XBee for Broadcast
| XCTU parameter | Value | Purpose |
|---|---|---|
DH — Destination Address High |
0 |
High half of the broadcast address |
DL — Destination Address Low |
FFFF |
Broadcast to all vehicle XBee radios |
Click Write to save the settings.
3. Configure Each Vehicle XBee for Unicast
Enter the GCS XBee address recorded above into every vehicle XBee:
| Vehicle XBee parameter | Value |
|---|---|
DH — Destination Address High |
GCS XBee SH |
DL — Destination Address Low |
GCS XBee SL |
For example, if the GCS XBee reports SH=0013A200 and SL=12345678, configure every vehicle XBee with:
DH 0013A200
DL 12345678
Click Write, then read the radio again to verify that the values were saved. Repeat this step for every vehicle XBee.
Do not broadcast vehicle telemetry
Do not set the vehicle radios to DH=0, DL=FFFF. Pointing every vehicle at the GCS XBee reduces unnecessary reception of other vehicles' telemetry and gives the vehicle-to-GCS packets a unicast destination.
Step 3 — Configure Each ArduPilot Vehicle
Set the telemetry port connected to the XBee SX to MAVLink2. This example uses SERIAL2 / Telem2:
SERIAL2_PROTOCOL 2 # MAVLink2
SERIAL2_BAUD 115 # 115200 baud
SYSID_THISMAV 1 # Unique for this vehicle
Reboot the flight controller after changing the serial parameters.
Repeat the configuration on every vehicle, changing only SYSID_THISMAV to a unique value:
| Vehicle | SYSID_THISMAV |
|---|---|
| Vehicle 1 | 1 |
| Vehicle 2 | 2 |
| Vehicle 3 | 3 |
Never duplicate system IDs
Two active vehicles with the same SYSID_THISMAV are indistinguishable to the GCS. Commands and telemetry may be associated with the wrong aircraft.
If you use a telemetry port other than Telem2, replace SERIAL2_* with that port's SERIALx_* parameters.
Optional Hardware Flow Control
For an initial setup, use 115200 baud with flow control disabled. If the fleet requires a higher UART rate, connect both RTS/CTS signals and enable hardware flow control for the corresponding flight-controller serial port. The radio and flight controller must use the same flow-control configuration.
Step 4 — Connect the Ground Station
- Disconnect the ground radio from XCTU.
- Connect it to the GCS computer by USB.
- Open the serial connection in the GCS at 115200 baud.
- Power one vehicle and confirm that its heartbeat and telemetry appear.
- Power the remaining vehicles one at a time and confirm that each appears under its own system ID.
Verify one vehicle at a time
During initial setup, keep all other vehicles powered off. This makes wiring, baud-rate, radio-network, and system-ID problems much easier to isolate.
For MAVProxy, a typical connection looks like:
mavproxy.py --master=/dev/ttyUSB0 --baudrate=115200
Replace /dev/ttyUSB0 with the serial device used by the ground XBee. On Windows, use the corresponding COM port.
Step 5 — Reduce Airtime Before Flight
All vehicles share one half-duplex RF channel. Start with low-rate telemetry and enable only the streams needed for operation. High-rate messages such as raw IMU data can saturate a multi-vehicle link quickly.
Use the GCS MAVLink message-interval controls or the applicable ArduPilot stream-rate parameters for the XBee-connected serial port. Validate the following with the complete fleet powered:
- Every vehicle remains visible and keeps a stable heartbeat.
- Commands are received by the selected vehicle only.
- Parameter downloads do not cause other vehicles to time out.
- Telemetry remains usable at the intended maximum operating distance.
- The link recovers after one vehicle or radio is power-cycled.
Bench test without propellers
Perform command-routing tests with propellers removed. Confirm the selected vehicle's system ID before changing modes, arming, or sending actuator commands.
Troubleshooting
| Symptom | Check |
|---|---|
| No radios communicate | Confirm the radios already belong to the same DigiMesh network and use compatible firmware and frequency bands |
| XCTU works but no MAVLink appears | Confirm every radio uses Transparent Mode (AP=0), matching baud rates, crossed TX/RX, and common ground |
| Vehicles receive commands but GCS receives no telemetry | Confirm every vehicle XBee's DH/DL exactly matches the GCS XBee's SH/SL |
| GCS receives telemetry but vehicles receive no commands | Confirm the GCS XBee uses DH=0, DL=FFFF |
| GCS shows one vehicle instead of several | Give every flight controller a unique SYSID_THISMAV, then reboot |
| Vehicles disappear when more nodes start | Reduce MAVLink stream rates; the shared RF channel is likely congested |
| Address changes do not take effect | Reconnect the radio in XCTU, read the settings back, and verify that they were written |
| Link is intermittent on the bench | Attach the correct antenna, separate radios physically, and lower transmit power for close-range testing |
Configuration Checklist
- [ ] The GCS XBee's
SHandSLvalues have been recorded correctly. - [ ] Every XBee uses Transparent Mode (
AP=0). - [ ] The GCS XBee uses
DH=0,DL=FFFF. - [ ] Every vehicle XBee uses the GCS XBee's
SH/SLas itsDH/DL. - [ ] Every vehicle has a unique
SYSID_THISMAV. - [ ] The GCS serial link is set to 115200 baud.
- [ ] All vehicles are visible simultaneously during a propeller-free bench test.
- [ ] Telemetry rates remain stable with the complete fleet online.