A few years ago I bought a “bifferboard“. This amazing little computer is about the size of a box of matches, and has the computing power of, well, about a Pentium 100. But it’s good enough to run a headless Linux environment. After I bought my bifferboard I was impressed with it, but couldn’t really come up with anything to do with it, so it languished in my parts drawer.
After idly looking at some youtube videos of people who had glued Arduiono boards into RC toys, I had the idea to do something similar with my old bifferboard. Using a more complete “PC” inside the model has several advantages:
- Quicker development as high-level languages can be utilised.
- Direct access to USB devices (webcams etc)
- Linux platform base
The disadvantage is that I/O would have been done through an intermediate board. Although the biffer has some GPIO pins, Arduiono and similar boards will have TTL compatible lines. I’d have to add those myself. In the end, this turned out to be much easier then I expected.
One of the things I wanted out of my project was a roving webcam. Other ideas I had at the outset were that it should be able to make noises; one of the things I’d done before with the bifferboard is to use flite as a text-to-speech engine. The biffer is just fast enough to render speech in a timely way, and if I could get my tank to talk it could be cool.
|Remote Control tank, before it was dismantled|
I got this from Amazon for about £80. It is ready to run and comes with a charger and 7.2V battery pack. It even has cute little accessories like plastic men to stick atop the tank. I chose this tank after finding out that some other companies sold “upgrades” (for the motors, gears etc). This indicated that the tank was customisable and could be dismantled easily without breaking it. Also, looking at some pictures of the guts showed the motors in the rear of the body with lots of room in front, which I would need for the bifferboard and other electronics.
As it turned out, I was sad to take this apart as it was great to play with. The tank itself is well built (good enough to play outside when the weather is dry), and of fairly thick plastic, though the transmitter is shockingly crappy. The tank has a rotatable turret, moveable (up and down) gun barel, and it even shoots plastic ball-bearings! It was this feature which lead me to take the thing apart on the day I bought it – the shooting mechanism on my tank was broken. Not to worry, as I didn’t want this anyway.The tank also has the usual assortment of lights (LEDs) and sounds.
On taking the tank apart and removing the RF control gear, etc, I found I had the ideal base for my computerised tank. Not only was there lots of room for my additional electronics, but I could re-use the battery compartment, power switch, motors, etc. There was even a speaker which I could reuse. I also had spare motors, LEDs etc.Dual USB bifferboard with case
|Bifferboard mini PC in half its case|
I started out with a regular single USB bifferboard, but I managed to fry the main circuit board somehow. The 2 port is slightly larger, but it has the advantage that, with the addition of the 4 port hub, I now have 5 useable USB ports for the tank. I had hoped to make use of the memory card slot, but this wasn’t practical as, when inserted, a memory card sticks out by about 1.5cm. In the confines of the tank “tub”. this is a lot!
- Approx 150Mhz i386 compatible CPU, without FPU
- 32MB RAM
- 1 onboard ethernet NIC
- 2 USB ports
- 5V power supply required (@200mA)
- Runs pretty much any flavour of linux.
|USB hub after removing case and superflous LED|
There are literally hundreds of different USB hubs out there on the market. But the tank’s requirements are a little special, because of the limited space. The one I settled on has the ports arranged in a 2 by 2 setup, and the connecting cable (to the PC) is built in, and nice and short. This minimised the space needed in the tank. I further saved space by stripping off the plastic shell. This hub came with a “night light” (it’s for laptops, apparently). Not much use – it was quickly unsoldered – but it’s a nice “free” (and bright) LED to add to the collection.
|VM167 with shortened USB cable|
This is my solution to the problem of I/O pins. This was actually the second board I tried. I first used another Vellman part, the K8055 (purchased from maplin), but it turned out that this board was much to big to fit inside the tank. I hope to use this in another project. The K8055 is great because it has screw terminals, push buttons for simulating inputs, and even pots for simulating analog signals, but as far as actual use the VM167 fits the bill and I highly recommend it for anyone wanting a solution to getting TTL signals in and out of a PC with the minimum of fuss.
- 8 TTL input/output lines, configureable as either inputs or outputs in 4 bit slices
- 2 TTL PWM outputs
- 5 analog inputs (0V .. 5V), at 10bit resolution
- Linux C API (3rd party, for some reason Vellman do not support Linux themselves)
This is a terrific little module, at a cost of about £30 from the nice guy at www.esr.co.uk. As I found out through trial and error, the TTL outputs are easily powerful enough to light some high-power LEDs, thus separate driver circuity is not needed when driving moderate loads, like collections of LEDs.2GB USB memory stick
|USB memory stick|
Any old memory stick would have sufficed, with 2GB of storage being easily enough for a substantial Linux distribution (see later on for a description of the software).
For space reasons, it is sometimes nice to be able to strip away the plastic cases for various devices, but in this instance the memory stick I used was nice and small already. Plus it meant I wouldn’t be “destroying” the pendrive.
|USB audio dongle|
I was nervous about ordering this – it only cost about £2 after all – but it seems to work well enough. Delivery took about a month from China. Driver support on Linux is good for USB sound devices, and this one is no exception. It has a few quirks, and it is not as easy to use as the Pantronics USB sound adaptor I have kicking about, but for the money I wont complain. The case was removed to save space (another great thing about this little device is that it is only about 5cm from the plug end to the 3.5mm jack end).
|Webam PCB, after stripping down|
This has a number of factors in its favor:
- UVC compliant so works well with Linux
- Small size
- Integrated microphone (though I haven’t made any use of this yet)
- Fairly cheap
Realtek USB WLAN adaptor
|Realtek USB WLAN|
I bought this from a Currys shop on a whim, and a hope that it would work on Linux. USB wireless support is one of the few things that remains patchy on Linux, but luckily this adaptor works well. Annoyingly it does not operate in Access Point mode, which means the tank will never be able to operate as self contains wireless network. Also, the power usage seems quite high. None the less, it works well.
Power and Motor Driver Board
The bought-in components wont do a lot on their own; I still had to figure out how to drive the track motors, and what would power the bifferboard computer. This was before I even thought about writing some software to control the thing.
I used to buy alot of electronic components from maplin, but the prices are (sorry to say) horrific. So I went to Rapid instead for my bits.
- Convert the 7.2V battery power into 5V for the bifferboard
- Drive the two track motors from the TTL signals from the VM167 board
The first thing is the simpler of the two. There are many voltage regulator ICs on the market, including the venerable (and somewhat junk) 7805. After looking at the spec sheet, I realised that the 7805 is not really meant for such a “small” drop from 7.2 to 5V. It’s minimum input voltage is about 8V. So I looked for an alternative and found the LM2940CT-5 (PDF). It is pinout the same as the 7805 but can take inputs down to about 6V.
|Power supply circuit|
|Power supply section of stripboard|
From top to bottom:
- 7.2V line, from the power switch in the bottom of the tank
- LM2940, with heatsink
- Couple of smoothing caps
- 5V plug (hot-glued)
The two PCB pins and the two screw terminal blocks are for hooking up other 5V circuits.
There is no parity notch on the PCB pins of course. Unfortunately the first time I hooked things up the parity was wrong. Some smoke from the caps resulted but, seemingly, no real damage.
After getting the parity right, success! The bifferboard booted up under the power of the 7.2V battery. This was the first real sign of progress. Unfortunately I immediately spotted a problem: the regulator was getting very hot, to the point where it couldn’t be touched. This wasn’t good, and shows how inefficient these voltage droppers are. The voltage drop, times the current, is effectively turned into heat. At 2.2V divided by 7.2V, this means about 30% of the power is wasted from the battery. Not good. Replacing the regulator with a switching power-supply (you can get some miniature ones which are pin-compatible with the 7805 for about £10 of ebay), which are much more efficient was a logical next step, but first I decided I would have a go at driving the motors.
The next step in the quest to get the tank moving under computer control was to figure out how to drive the track motors.PWM (Pulse Width Modulation) is a technique to send “variable” signals based on the length of a pulse. So if the “1” signal is present for 50% of the time, the signal is at “half”. For devices like motors and LEDs, this means they would be driven at roughly half-brightness or half-speed. The VM167 handily comes with two PWM outputs, one for each track motor.
In addition, the VM167 has ordinary digital outputs. While there are at least two ways to drive a motor a motor in two directions (when combined with a PWM signal) the simplest is to use two outputs, one for forward and one for backwards. When neither signal is set, the motor should be stationary, regardless of the PWM output.
The next problem was figuring out how to drive enough current into the motors. There is no way the VM167 would be up to this task. In my experience of playing with other RC models, some cars use big motors which are rated at up to 8 Amps. This could have been a problem, since high currents are more work to deal with.
After doing some research I found these little beauties: the L293E (PDF). It is a stepper motor controller, rated up to an Amp. It can drive either a 2 channel stepper or 2 ordinary motors, forwards and backwards. It looked ideal for my needs, though the single Amp rating was a concern. But looking at the thickness of the wires on the tank motors made me think an Amp should be enough to drive the tank reasonably well.
The circuit is fairly simple. Here only a single motor driver is shown:
|Motor controller circuit|
The schematic shows a L293D, but I actually used a L293E. The parts are almost the same; the ‘E has 4 extra pins for “sense” (which I did not use). In anycase, there are similar parts available from other manufacturers, such as the SN754410 (PDF).
This particular IC has two power pins, one for logic (VCC2 in the diagram) and one for the load. This is handy as it means the 5V “bifferboard line” can be used for the logic side of the motor driver, whilst the motor side of the driver is connected directly onto the 7.2V battery line.
The three resistors act as pull-ups, for when there is no input connected. In this case, pull-downs would have worked as well, except in the case of the PWM input which I wanted to be “optional”. Using pull-ups means if it is not connected it will float high.
The PWM input is connected to the “Enable” pin, whilst Forwards and Backwards inputs are connected into the respective inputs on the driver IC. The motor is connected between the 3Y and 4Y pins (labeled Output 1 and Output 2 in the datasheet).
The four diodes act to block return currents from the motors. They are positioned “backwards”. In my case I only used them on one of the motors (the one on the turret motor, which we will come to later). For the main track drive motors I omitted them and haven’t seen any problems.
After drawing out the circuit for the motor driver, it was time to solder it up on the same piece of stripboard as the power supply. This turned out to be easier then expected, and for good measure I attached a PC memory heat-sink to the L293E as it was certain to get hot.
|VM167 plugged into the combined power-supply and motor driver board. The blue heat-sinks cover the L293E ICs.|
It was then time to see if I could drive the track motors! But for that, I would need some software….
In the mean time, as teaser, here is a video of the tank under bifferboard control. This was taken just after I had the motors driving through a commandline program, which in turn was run via SSH. Apologies for the portrait orientation…. It seems the video is now broken. Ah well.