BDESC-S10E-RTR Electronic Speed Control Setup for Brushed Motor

This is not so much a question, but a statement of what I found in setting up this Electronic Speed Control (ESC) and I thought this forum was the right place to put it.

I looked online for information about this cheap ESC and found no manual or much information at all. I wanted to find how it gets armed, the control range and how the reversing function works.

Firstly, I was motivated to use this after purchasing two of these on eBay, along with two 12v toy car motor gearbox units that are used in the cars kids can sit in and drive. This is part of a tracked Unmanned Land Vehicle (ULV) I am building.

Some background on the bad old days. RC cars etc. had a dodgy mechanical speed control which had 7 speeds; stop, full speed forward and reverse and 2 other settings in between, duplicated for reverse. However, the inbetween speeds were achieved by putting resistors in series with the motor. This effectively meant that battery power was “burnt off” while moving at lower speeds. The mechanical speed controller was driven by a servo, with zero in the centre and full speed forward on one side (eg at 45 degrees on the servo) and full speed reverse on the other (eg at 135 degrees on the servo).

Because I was using the ESC to also be the steering of the ULV, it needed to have a reasonable degree of fine control to be able to even drive in a straight line. This is yet to be proven as I am still building the prototype. I could still put on a toothed wheel to provide feedback to keep the speed of each track constant.

What are the downsides of using this ESC? There is only two ways it can provide you with any feedback - a single LED and beeps sent to the motor. The single LED is either off, flashing or on. If it’s off, then nothing is happening (although it can still be powered up). If it’s on it is usually happy with what is happening with voltages and controls. However, flashing can mean a under- or over-voltage, it’s changing from one speed setting to another or sometime else unknown. Therefore, the beeps need to be listened to. A single beep will sound on initial power-up. The same single beep will sound when it gets the zero signal (1.5 ms pulse). I also read that there was a 3 beep sound, but I have never heard this and don’t know what it means even with trying several combinations of maximum and minimum throttle during setup.

I finally found a generic process for arming ESCs generally. Either you have to have the throttle at full or at zero for the ESC to calibrate itself. Because the zero point of the old mechanical speed controller was at the centre, it made sense that the centre point of the output needs to also be in the centre. This was found to be at 1.5ms pulse width and seems to be industry standard. I found suggestions that Receivers range from 1ms to 2ms. This also makes sense if the ESC is replacing a mechanical speed controller which didn’t go full scale from 0 - 180 degrees anyway.

After several attempts I found the ESC wanted to see a 1.5ms pulse to calibrate where zero should be. I therefore put servo.write(90) in setup and held it on for 5 seconds. (Experimentation found this value can be between 66 and 101, so the tolerance on the 1.5ms is actually quite wide). This gives time to connect power to the ESC or turn it on using the ON-OFF switch on the ESC. It can then be operated by servo.write(x) statements to control speed, where x<90 makes the motor go in one direction, and x>90 goes in the other direction. I also tested if the PWM frequency needed to be changed, and found the default 490Hz worked fine.

What is the control range? As the pulse width seemed to go between the “standard” 1ms to 2 ms, I found the minimum setting was 60 and the maximum was 120. Anything outside this range still works, but won’t change the speed of the motor.

Another slight irritation is the selection of reverse. Because this ESC is made principally for RC cars, going straight from full forward to full reverse (although satisfying from a driver’s perspective with the huge amounts of dust created) in the bad old days with mechanical speed control can be damaging to gearboxes. Therefore, the ESC has a safety feature: to engage reverse, the transmitter throttle control has to be pushed all the way to reverse, then back to the zero or neutral position. Then when the transmitter throttle control is again pressed to reverse, the motor will go in the opposite direction at an increasing speed. Also, reverse is only about 50% the speed going forward (this makes sense for a car or boat). My code has taken this into account with a 20ms delay for “selecting” reverse and returning to neutral.

Below is my test code. I tried to put in as many comments as I could to explain what was happening. I hope this all makes some sense and I welcome any comments or suggestions. If anyone has a manual for this unit I would appreciate you posting a link here. I also read that you can reprogram these ESC’s but I am yet to find out how this is done.

#include <Servo.h>

Servo myservo; 
 
int pos = 0;

int zeroThrottle = 90; //90 Needs to be between 66 and 101.
int maxThrottle = 120; //120 seems to be where the maximum is. Above this doesn't give any extra speed.
int minThrottle = 60;  //60 This represents the "reverse" speed.
 
void setup()
{

  Serial.begin(9600); //Pour some serial

myservo.attach(9); // attaches the servo on pin 9 to the servo object

Serial.println("Zero Throttle");
myservo.write(zeroThrottle);  // Set the output to the middle or "zero" position. CONNECT THE ESC DURING THIS DELAY!!
delay(5000);       // This delay allows the ESC to be connected and powered on. The motor will beep once on
                    // power up and once when it recognises the zero position.

Serial.println("Max");
myservo.write(maxThrottle); // Make sure your test bed is safe for the motor to turn at this point. It will run at maximum speed!
delay(2000);

Serial.println("Zero");
myservo.write(zeroThrottle); // Simulates the receiver sending a zero throttle signal again
delay(2000);

Serial.println("Min");
myservo.write(minThrottle); // "engages" reverse.
delay(20);

Serial.println("Zero");
myservo.write(zeroThrottle); // back to neutral
delay(20);

Serial.println("Min");
myservo.write(minThrottle); // motor runs in reverse
delay(2000);

Serial.println("Setup Complete");
  
}
 
void loop()
{
  
for(pos = zeroThrottle; pos < maxThrottle; pos += 1)  // goes from zero to max throttle
  {                                  
    myservo.write(pos);               // tell the ESC to position in variable 'pos'
    delay(200);                       // waits 200ms for the ESC to reach the position
    Serial.println(pos);              // print "pos"
  }

myservo.write(maxThrottle);           // Hold the max position for 2 seconds
delay (2000);

myservo.write(zeroThrottle);          // Go back to zero for 2 seconds

delay (2000);

myservo.write(minThrottle);           // Select reverse

delay (20);

myservo.write(zeroThrottle);          // Back to zero again

delay (20);
  
  for(pos = zeroThrottle; pos>=minThrottle; pos-=1)     // goes from zero to "min" or motor turns in reverse
  {                               
    myservo.write(pos);               // tell the ESC to position in variable 'pos'
    delay(200);                       // waits 200ms for the ESC to reach the position
    Serial.println(pos);              // print "pos"
  }
delay(2000);

myservo.write(zeroThrottle);          // Go back to zero position

delay(2000);
  
}
1 Like

Thanks, you saved my day. I was struggling with the very same ESC and you nailed the problem.
Now I wonder if it is possible to remove this nasty behaviour some way, maybe by updating the firmware

Karma for this post Aussie