BLHeli Firmware for Multicopters
In response to the many new ESCs that contain SiLabs chips, the BLHeli ESC firmware has been rewritten by Steffen Skaug for SiLabs chips. Thanks Steffen for all your hard work! Although it’s named BLHeli, it has had has support for multirotor applications since rev5.0. This post describes the process I used to flash my SiLabs ESCs with great results. However, this firmware is new and this process should only be attempted by advanced hobbyists who realize an ESC may become unusable if it fails.
The stock firmware that is loaded on most off the self ESCs is not designed for multicopters. That firwmare typically averages speed changes that are sent to the motors. Multicopters perform better when immediate unaveraged speed changes are sent to the motors from the ESC and that is a simplified explanation of what the BLHeli firmware does.
ESCs with Atmega processors are flashable with similar firmware written by SimonK, a procedure that is outlined here. However, many ESC manufacturers use SiLabs processors and the SimonK firmware will not work on them. The BLHeli firwmare is desgigned to run on SiLabs ESCs. Interestingly, depending the version of a particular ESC, it may have either processor. For instance, older Turnigy Plush ESCs used Atmega and now use SiLabs.
Warning – It is possible to ruin an ESC when attempting this process. Also, the factory installed flash is overwritten.
Update: BLHeli rev8.0 with more features and supported ESCs! sskaug on RCG:
The changes are focused towards multirotor performance:
- Added a 2 second delay after power up, to wait for receiver initialization
- Added a programming option for disabling low voltage limit, and made it default for MULTI
- Added programable demag compensation, using the concept of SimonK
- Improved robustness against noisy input signal
- Refined direct startup
- Removed voltage compensation
- Miscellaneous other changes
And a lot of escs have been added:
- RCTimer 6A ESC / RCX 6A
- Turnigy AE45 ESC
- Turnigy Plush 40/60/80A
- Origin/Oversky/HK ESCs
- Hobbywing Skywalker 40A sbec
Continue reading to see the details of how I flashed my ESCs…
Choosing ESCs to Flash
So far the following are the only SiLabs ESCs that are BLHeli compatible. Also, see “BLHeli supported SiLabs ESCs.pdf” for more indivdual info by sskuag.
- Turnigy Plush 6/10/12/18/25/30/40/60/80A
- Turnigy AE 20/25/30/45A (All N-Fet design aka it runs cooler)
- DP 3A
- XP 3/7/7 Fast/12/18/25A
- SuperMicro 3.5A
- Origin 10A/Double (use XP 7 firmware)
- Skywalker 20/40A/40A Ubec
- HiModel Cool 22/33/41A
- RC Timer 6A
See the video at the bottom this post demonstration. I think you will see that the results I achieved made it well worth the time. Many other ESCs have SiLabs chips, but they aren’t supported quite yet (most ESCs that are used in multirotor applications are, i think).
SiLabs ESCs need a SiLabs Toolstick programmer to be flashed. For more advanced hobbyists, there is the Arduino Silabs programmer that can do the same as the Toolstick, but it requires more knowledge to setup.
Programming Pads and Pinouts
Below, is what a Plush 6A ESC looks like without the heat shrink.
(More pinouts are pictured at the bottom of this post)
As you can see in the previous picture, there are three pins to connect to: Gnd (black), C2CK (red), and C2D (white). To connect to these pads, I soldered on wires and put a male header peaking out of the heat shrink. This gave me solid connections and made it so i could easily reflash firmware, but requires a bit more soldering experience to get onto those pads. This way I simply plugged in a female header to the male header of the ESC and plugged it into the programmer.
If you have an ESC with a Silabs chip, but can’t find a picture online that shows where the pins are, you can look at the SiLabs chip on the ESC and read off the numbers (with a magnifying glass, of course!) and find the data sheet on Google. Then, you can trace the pins from the SiLabs chip to their break out pads.
Building the Flashing Rig
I used the following:
- 25AWG etc small solid wire
- Adjustable temp soldering iron
- Wire strippers
- 3 pin female/male headers
Soldering Directly to the Pads
First, I took off about a 1/8″ of the wire casing on one side and 1/16″ on the other, for all three of the needed wires (Gnd, C2CK, and C2D). The longer side is for the male 3 pin header and the short side is for the ESC solder pads. I tinned the end of short side of the wires and the pads on the ESC. One at a time, I placed the short end of the wire onto the pad and add some solder to connect the two. I used an adjustable temp soldering iron. This is needed so that the pads don’t break off from too much heat. Finally, I soldered the longer ends of the wires to a male headers that will stick out of the ESC somewhere that is visible, but secured with heat shrink and not subject to too much damage.
Alternative Soldering Points
Because the soldering pads are so close together, I found it easier to use other points on the ESC to solder my wires. I used the continuity function of my Digital Multimeter to find where these connections were available. See the image below that shows a 18A Plush ESC with these alternative connections. This can be done for any ESC.
The image below is my ESC before the heat shrink was redone:
* A clothespin flashing rig, similiar to the one used in the SimonK post, could also work. A disadvantage to that approach is that it requires removing the heat shrink and struggling to connect to the pads each time the ESC is reflashed. The above method easily handles new firmware releases. Connecting the headers is all that is required to connect to the ESC.
Flashing the ESCs
Remember, to flash the ESC, a Toolstick programmer(simpler, but more expensive) or an Arduino programmer(cheap for some people, but more complicated) can be used. I used the Arduino programmer because I already had all of the required components. You should remove the props for safety, and could also limit the current that goes to the ESC so that a bad flash cant ruin the ESC.
Option 1 – Flashing with the SiLabs Toolstick
- Toolstick Adapter(here)
- More wire
- Soldering iron
- Hot glue
- Female/male header
Setting up the Toolstick
- I bridged the two pins shown by the green circle in the image above with a blob of solder
- Then soldered on the white(C2D) wire as shown.
- Next, I flipped it over and looked at the back to solder on the red (C2CK) and black (Gnd) wires.
- Then I soldered the ends of these wires onto a 3pin male or female header for whatever best suits you. For example, if i’d you used the servo connector flashing rig, i’d probably want to use a female connector as you have the male on the opposite side of the cable from the female pins mounted on the ESC like I did. That’s it for the mods! Now on to software.
Click on the ESC firmware link above, click download as zip on the right side of the page, extract it, go into SiLabs\Hex Files then find your ESC hex file. You need the hex file that fits your ESC and has MULTI in the name, for ex: TURNIGY_PLUSH_18A_MULTI_REV6_0.HEX. Then install the programming utility. Now a flashed ESC is a few clicks away!
- Download the SiLabs Flashing utility and install it.
- Connect the ESC to the toolstick, then connect the toolstick to the computer, connect the battery to the ESC
- Finally, open the SiLabs Flashing Utility. The USB debug Adapter should automatically be selected and show your toolstick in the list below it.
- Click Connect.
- Go to the download Hex File/Go/Stop tab and browse for the hex file you got from the zip you downloaded, Check the Erase all code space box, and click Download.
- It may give you a warning that the device will be erased, click OK.
That’s it, now I could can do calibration through the GUI or the TX(a guide PDF is found in the zip from the ESC firmware link)!
Option 2 – Flashing with an Arduino
NOTICE: While this post does provide good information, it is outdated because of new developments in this area. OlliW is the author of the owSilProg firmware that allows Arduino boards to be used to flash SiLabs ESCs with BLHeli. Please visit his site at www.olliw.eu for the most up to date information on flashing SiLabs ESCs with BLHeli firmware.Hardware needs:
Then, I programmed my Arduino with the silprog hex which allows the Arduino to be used by the computer as a Silabs programmer like the Toolstick. At First i used the old method which is more complex because of the command line requirement, but now i use the new method which is an easy GUI program.
- AVRBurnTool and the Arduino Silprog hexs are at the bottom of this page under “Current firmware and software” which is currently called owSilProg v20120715 as of this posting.
- Extract the owSilProg v20120715 zip to a folder called BLHeli at C:\.
- Open the AVRBurnTool_vxxx.exe from the C:\BLHeli folder.
- Under “Select your ISP AVR Programmer”:If you have one of the following, select Arduino Bootloader @115200
Mini w/ 328pIf you have one of the following, select Arduino Bootloader @57600
Nano w/ 328p
Pro Mini w/328p
Duemilanove w/ 328p
Pro w/ 328p
- Underneath ”Select your ISP AVR Programmer”, select your Arduino COM Port (Baud is not changed if you use one of the above methods). You can find out which COM Port your Arduino uses by:-Looking in device manager
-In the ARduino IDE
-Click the port selector and memorize which ports are avaliable. Click out of the Port Selector, connect Your Arduino, and then click on the Port Selector again. The new Port that showed up is your Arduino.
- Select your target/device. For example, if you have an Arduino with a 328p chip, select “Arduino with m328p”.
- Select the bootloader/firmware hex file from C:\BLHeli. Select the file that has the name of your Arduino chip(m328p for example) and the speed (16mhz for example).
- Press “Burn all”
- It should say “xxxxx bytes of flash verified” if successful.
- Now you can go onto the “Flashing the ESC” part of the tutorial below.
- AvrDude and the Arduino Silprog hexs are in the zip file at the bottom of this page under “Current firmware and software” which is currently called owSilProg v20120715 as of this posting.
- Extract the owSilProg v20120715 zip to a folder called BLHeli at C:\. Also extract the BLHeli ESC hex files zip there too.
- Open command prompt by pressing Windows Key + R, and then type cmd and press enter.
- Type or copy cd C:\BLHeli
- Connect the arduino to the computer.
- For the following command, check which com port is yours and that the silprog_v007_promini16mhz.hex has the correct version number, Arduino speed(mhz), and Arduino type(promini). The other silprog hex files are also in the C:\BLHeli folder.
- Type or copy the command: avrdude -C avrdude.conf -p m328p -c arduino -P \\.\COM1 -b 115200 -D -Uflash:w:silprog_v007_promini16mhz.hex:i and press enter.
- The output should look like:
avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e950f avrdude: reading input file "C:\BLheli\silprog_v007_promini16mhz.hex" avrdude: writing flash (3898 bytes): Writing | ################################################## | 100% 0.64s avrdude: 3898 bytes of flash written avrdude: verifying flash memory against C:\BLheli\silprog_v007_promini16mhz.hex:avrdude: C:\BLheli\silprog_v007_promini16mhz.hex:avrdude: input file C:\BLheli\silprog_v007_promini16mhz.hex contains 3898 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.50s avrdude: verifying ... avrdude: 3898 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you.
Flashing the ESC
- Go to C:\BLHeli and open the SilProgTool_vxxx.exe.
- Click the … button and browse for the BLHeli ESC HEX files. These are in the C:\BLHELI\BLHeliHexFiles. You want to choose the one that is your ESC, has MULTI in the file name and is the latest REV. For ex: TURNIGY_PLUSH_18A_MULTI_REV6_1.HEX
- Connect the battery to the ESC and then connect the flashing rig to the Arduino and ESC.
- Select the com port of the arduino and click flash. Then verify when it’s done.
- The status window should look somewhat like this when complete:
Flash hex file... Please wait! v... OlliW SilProg v0.06 r... rok d... dok0A i... iok e... eok bw... bw:030000000212E306ok bw... bw:03000B0002008070ok bw... bw:03002B000202943Aok bw... bw:03005B000203AEEFok bw... bw:030073000203A4E1ok bw... bw:10008000C2AFC0D0C0E0D2D3758B00206226055E1Fok bw... bw:10009000E526700302028BC374059526400A955E1Fok .....cut out for length..... bw... bw:101A500023424C48454C4923463333302320202031ok bw... bw:101A60002020202020202020202020202020202076ok Flash hex file... DONE!
- Since this is beta software, you might get a line where it stops on the middle and doesn’t say ok at the end like:
Either the connections are broken between the Arduino and ESC or the software is just buggy. Either way, check your connections and restart the SilProgTool software.
- Now open C:\BLHeli\BLHeliTool_vxxx.exe and click Read and Change the settings for your new BLHeli ESC!
Throttle Range Calibration
This is new as of rev 7.0!!!! It is like any throttle calibration:
- Turn on the TX and bring throttle up to max.
- Power up the ESC (make sure it is connected to the throttle channel).
- It will give the normal start-up beeps and then do a higher beep for 3 seconds (measuring high throttle).
- It will do a low to high beep sequence three times and then do quick beep beep pairs for 3 seconds while measuring minimum throttle).
- Finally, it will do three high to low sequences; here you can lower the throttle to prevent going into programming mode.
Wrap It Up
I made sure all the solder connections for the programming header were good and then covered the connections to the pads with 5min epoxy to make sure they didn’t vibrate loose or break. I finished it up with some 1″ heat shrink around each ESC.
I used the above process to flash my Turnigy 18 Amp Plush and Turnigy 25 Amp Plush ESCs. While they don’t have specific multi rotor hex files yet, I decided to give it a try with the Plush 6 amp hex file. While I suggest others wait until hex files are released for specific ESCs, the process worked fine for me and below you will find a before and after video.
Here are more pinouts for BLHeli Flashable ESCs: