BLHeli ESCs and DShot for Combat Robots

Does anyone have experience with running BLHeli ESCs in bidirectional mode via DShot for Combat Robot purposes?

Back in October last year I had DShot working on the custom controller I built for Keith the Teeth, but I had to give up and switch back to PWM because while it gave excellent control of speed the BLHeli firmware did not seem to provide a way to stop the motors without disarming and later rearming the ESCs.

DShot isn’t super well documented, but each packet is 16 bits with 11 bits for the command being transmitted, 1 bit for telemetry request and 4 bits for a checksum. This gives 2048 commands you can send, with the first 48 being reserved for special commands.

Based on the documented commands (https://github.com/betaflight/BLHeli_S/blob/master/Dshotprog%20spec%20BLHeli_S.txt) there are a couple of seemingly obvious ways to stop the motors.

The first being sending a zero (DSHOT_CMD_MOTOR_STOP) which at first seemed promising, but as the document says it’s unimplemented on BLHeli. In practice it seemed to arm or disarm the ESC.

Outside of the special commands values 48 through 1047 map to the positive throttle range and 1049 through 2047 to the negative throttle range, and this seemed to work nicely in my tests. This leaves 1048 as a sensible looking value for ‘just stop the motors please’, but again in practive this seems to be just ignored leaving the motor running at the previous speed.

I spent some time poring through the BLHeli code (https://github.com/betaflight/BLHeli_S/blob/master/src/BLHeli_S.asm) and everything I found seemed to confirm these findings, which I guess makes sense since the feature isn’t particularly useful for drone purposes

Given that I’ve heard of people using DShot for their combat robots this leaves me with the question of how they have made it work. Are they using a different brand of ESC where the stop command is respected? Custom firmware with added support? Or am I just missing something obvious?

I’m tempted to have a go at adding support myself, the main blocker being getting setup to flash a new firmware onto an ESC, but I wanted to test the waters and see if others have looked at this in the past (or again, if I’m just missing something).

In a combat robot setting, unless you have a requirement for an interstitial controller (such as a Meltybrain) using PWM/PPM would suffice fine for direct RX/TX communications. In most cases, simpler is better here.

However, if you have a specific use case for a faster comms, these days you might have better luck with a 32-Bit based ESC that supports BlHeli_32 or AM32. AM32 especially supports DShot 300 and 600, if you want to stick to OSS. Though getting AM32 onto an existing ESC that didn’t ship with it is still a bit of a mixed bag.

If you can’t change the ESC and need to stick with 8-Bit, perhaps BlueJay might work for you? This also supports DShot 150/300/600.

1 Like

I have been thinking about meltybrains on and off, but mostly it’s stubbornness and curiosity at this point.

Both beetleweights I’ve built have used a microcontroller between the receiver and ESCs, partly to mess around with gyros, but mostly because the weapon setups of both bots needed some sort of non-standard feedback mechanism to make them manageable for the driver. Once there’s a microcontroller on board DShot felt like a no-brainer to save adding 20ms of latency and to avoid having to worry about how the PWM endpoints are setup between different ESCs. This weird quirk, which to be fair might just be a BLHeli_S thing since I’ve not looked at other ESCs, seems to be the main downside.

I don’t necessarily need to stick with 8-bit ESCs, but I have a bunch of them now so seeing if BlueJay supports them and works for this purpose is a good call.

Thanks for the advice and sanity check!

Hi, I absolutely got Dshot working in my meltybrain (attempt) and will use it again in the future if I go back to it.

It is definitely possible to stop the motor without disarming. Remember though that just like the PWM, you need to continue to send dshot commands regularly otherwise the ESC will disarm. As far as I can remember, all zeros (0) is just “zero throttle” including in bidirectional mode.

1 Like

Hey Mark,

Do you know/remember what firmware your ESCs were using? I’m pretty sure at this point this is a BLHeli_S quirk, so once I’m out of the building frenzy for Subterranean Showdown I’ll probably mess around with reflashing some of my ESCs or try some that ship with different firmware.

I tried a bunch of variations at the time I was messing with this, but I definitely tried sending zeroes at the same update rate as other commands.

Yeah I used blheli32 ESCs (“HakRC 35A”) because I wanted to get the ESC telemetry signal out.

1 Like