robotlab_275_71.png home | robots | microflight | other projects

BitESC

Introduction

BitESC sitting on a 1 euro coin. bitesc_overview.jpg 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.

bitesc_small.gif

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.

bitcootie_small.jpg

Schematic

bitesc_schema.gif

Buying a BitESC

For those who want to buy this BitESC, I sell it for 15€, you'll have to add 2.5€ for P&P if you do not live in europe. The BitESC comes soldered and tested, together with a printed sheet with the wiring diagram. Please email me first to see how long the delivery will take. Normally I should be able to send it to you in the same week. But it takes approx. two weeks before I have access to new components if I run out of them.

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.

; 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

 

Print » Edit | Attach | Diff «