BitESC - Electronic Speedcontroller for bitcars

The BitESC is a small electronic speed controller for those little RC cars like the MicroSizer / BitChar-G. It can be used in a small RC plane to have some control over the speed of the motor. The speed of the motor ramps up or down, depending on which of the buttons on the transmitter you press. If no button is pressed, the ESC will ramp the throttle down to a stop after a few seconds. This safety net comes in handy when the plane flies out of transmitter reach.

How to use

The BitESC weighs in at 0.3 grams, without leads, and has a size of 9 mm x 12 mm. It uses an IRLM 2502 to drive the motor and can pull 1.5 A continuous. The microprocessor used is an Atmel AVR 2343 which runs at 1Mhz.

To be able to use the BitESC, you'll first need to read about the different modifications required on either the transmitter and the reciever. You can read more about how to modify the receiver of a BitChar-G car at the following topics on

To get the best results, it is adviced to modify the receiver by adding a longer antenna. I use 1/8 of the wavelength, for 57MHz that gives an antenna length of approx. 63 cm. After extending the antenna, you should retune the receiver by adjusting the coil.

The best hack for the transmitter is to increase the power to the RF circuit and removing the cripple cap, if your TX has one.

This BitESC should cope easily with motor noise. I use a KP00 without a noise reduction capacitor on the Cootie and it works just fine. Although it is a very good idea to add a noise reduction cap to the motor.

The BitESC expects 5 leads to be soldered. The next schematic shows the wiring diagram. The negative of the motor is connected to the BitESC, the other lead goes to the plus lead of the battery (BAT+). The BitESC contains a small RC filter to filter out motor noise.


Here's a photo of my Cootie (Designed by Ralph Bradley ), which I equipped with a BitChar-G receiver and my BitESC. The actuator is connected to the H-bridge on the receiver, which normally connects to the motor and provides forward and backwards motion. The BitESC is connected to the left and right channels. To be able to use the transmitter comfortably, you'll need to switch the controls.


Making a BitESC yourself

If you want to make the BitESC yourself, the next information should get you going. Here's the link to the PCB layout. Assembly code can be found below in the article.

Here's a printout of the assembly source.

; BitESC
; (c) 2004 Johan Van den Brande

.include ""

.equ TIMEBASE_TICK = 15000
.equ SAFETY = 25
.equ PWM_MAX = 63
.equ ESC_POS_MAX = 15

.equ esc_bit = 0
.equ down_bit = 3
.equ up_bit = 4

.equ PORTB_INIT = (1<<down_bit) | (1<<up_bit)
.equ DDRB_INIT = 1<<esc_bit

.def tmp       = R16
.def esc_value   = R17
.def esc_pos    = R18
.def pwm_value   = R19
.def safety      = R20

.def timebase_l   = R24
.def timebase_h = R25

.macro loadesc
ldi   ZL,LOW(2*esc_values)
ldi   ZH,HIGH(2*esc_values)
clr   tmp
add   ZL,esc_pos
add ZH,tmp
mov   esc_value, R0

.org $0000
rjmp   main

ldi      tmp,LOW(RAMEND)
out      SPL,tmp

ldi      esc_pos, 0
ldi      safety, SAFETY
ldi      timebase_l, LOW(TIMEBASE_TICK)
ldi      timebase_h,   HIGH(TIMEBASE_TICK)
ldi      tmp, PORTB_INIT
out      PORTB, tmp
ldi      tmp, DDRB_INIT
out      DDRB, tmp


; pwm
ldi      tmp, PORTB_INIT | (1<<esc\_bit)
cp      pwm_value, esc_value
brlt   skip
cbr      tmp, 1<<esc_bit
out      PORTB, tmp
inc      pwm_value
andi   pwm_value, PWM_MAX

; check timebase
sbiw   timebase_l, 1
brne   loop

ldi      timebase_l, LOW(TIMEBASE_TICK)
ldi      timebase_h,   HIGH(TIMEBASE_TICK)

; read input states
sbic   PINB, down_bit
rjmp   skip_down
; reset safety
ldi      safety, SAFETY
; motor --
cpi      esc_pos, 0
breq   skip_down
dec      esc_pos

sbic   PINB, up_bit
rjmp   skip_up
; reset safety
ldi      safety, SAFETY
; motor ++
cpi      esc_pos, ESC_POS_MAX
brge   skip_up
inc      esc_pos

cpi    safety, 0
breq   safety_powerdown
dec    safety
rjmp   safety_proceed
cpi      esc_pos, 0
breq   safety_proceed
dec      esc_pos


rjmp   loop

.db   0,   2
.db   4,   6
.db   8,   10
.db   13,   16
.db   19,   23
.db   27,   32
.db   38,   46
.db   57,   63