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 DH and DL to the GCS XBee's SH and SL values.

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

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:

Vimdrones XBee SX Pinout

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:

  1. Stop sending data and wait at least one second.
  2. Type +++ without pressing Enter.
  3. Do not send anything for at least one more second.
  4. The XBee responds with OK when 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 High
  • SL — 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

  1. Disconnect the ground radio from XCTU.
  2. Connect it to the GCS computer by USB.
  3. Open the serial connection in the GCS at 115200 baud.
  4. Power one vehicle and confirm that its heartbeat and telemetry appear.
  5. 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 SH and SL values 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/SL as its DH/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.