Implementing CAN alongside DSHOT when FC limits force split channels

Back

When configuring your flight platform, depending on the Flight Controller used, DSHOT outputs sometimes cannot be configured with sequential Servo Outputs within ArduPilot, especially when Bidirectional DSHOT is required.
This can create a challenge when integrating DroneCAN ESCs because CAN output mapping in ArduPilot defaults to sequential servo outputs.
Fortunately, with a few configuration adjustments on both ArduPilot and Hargrave ESCs, it’s possible to run Bidirectional DSHOT as the primary motor control while keeping DroneCAN as a secondary or backup.

Example Configuration Scenario

In this example, the aircraft uses:

  • Bidirectional DSHOT as the primary motor control protocol
  • DroneCAN as the backup/secondary control path
  • Two Hargrave 4LPi 4-in-1 ESCs

Because of clock-speed requirements and bidirectional support, the available DSHOT outputs must be placed on:

  • Main ports 1–4
  • Aux ports 1–4

Within ArduPilot, these correspond to:

  • Servo outputs 1–4
  • Servo outputs 9–12
ArduPilot Servo output list


This creates a gap, skipping outputs 5–8, which is where the configuration adjustment becomes necessary.

NOTE: Splitting channels in this way increases overhead over CAN telemetry by approximately 30% so keep this in mind and make sure telemetry rates on devices are kept low to reduce the chance of issues over CAN. CAN should be used as the secondary or backup form of control due to this additional overhead.

Step 1: Configure ESC Indexing

ESC indexing must align with the servo outputs used by ArduPilot. The relationship is:
ESC Index = Servo Output – 1

 

First ESC

The first ESC can remain in its default configuration:
  • ESC indexes 0-3
  • Corresponds to Servo outputs 1–4 (ESC index = servo output - 1)
This mapping works directly without modification.

Second ESC

Because servo outputs 5–8 are skipped, the ESC indexes for the second unit must shift accordingly.
Instead of using indexes 4–7, they must align with servo outputs 9–12:
  • ESC indexes 8–11
  • Corresponds to Servo outputs 9–12 (ESC index = servo output - 1)
This offset ensures ArduPilot correctly maps motor outputs across both ESC units.

Step 2: Configure the CAN ESC Bitmask in ArduPilot

Next, ArduPilot needs to be told which servo outputs should be used for CAN ESC control.
This is done using the parameter: CAN_D1_UC_ESC_BM
This parameter is a bitmask that specifies which servo outputs are associated with CAN-enabled ESCs.
In our configuration we want CAN to follow the same outputs used for DSHOT:
  • Servo outputs 1–4
  • Servo outputs 9–12
The resulting bitmask value for this configuration is: 3855
Once these changes are made, you should be able to output via CAN to the same outputs used for DSHOT.

Why This Matters

Some flight controllers and carrier boards have strict limitations on physical outputs, particularly when using DSHOT or Bidirectional DSHOT.
This configuration provides a practical workaround, allowing systems with more than four motors to run DSHOT and DroneCAN side by side, enabling both high-performance motor control and system redundancy.