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 rcgroups.com:
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.
Example
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.
Schematic
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 and hex file.
I can provide a programmed 2343 and/or a PCB and/or the components, for those who want to solder the BitESC, but so not want to make the PCB or program the MCU.
Here’s a printout of the assembly source.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
; BitESC ; (c) 2004 Johan Van den Brande .include "2343def.inc" .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 lpm mov esc_value, R0 .endmacro .cseg .org $0000 rjmp main 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 loadesc loop: ; pwm ldi tmp, PORTB_INIT | (1<<esc_bit) cp pwm_value, esc_value brlt skip cbr tmp, 1<<esc_bit skip: 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 skip_down: 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 skip_up: cpi safety, 0 breq safety_powerdown dec safety rjmp safety_proceed safety_powerdown: cpi esc_pos, 0 breq safety_proceed dec esc_pos safety_proceed: loadesc rjmp loop esc_values: .db 0, 2 .db 4, 6 .db 8, 10 .db 13, 16 .db 19, 23 .db 27, 32 .db 38, 46 .db 57, 63 |