Computer Controlled Train Set
Submitted by Jane L, Northampton, UK
I had two objectives in starting this mini project. One was to help me get a better understanding of using a PC for control and automation. The other was to make my younger brother’s train set a little less boring. I never could understand the pleasure in watching a train just going round and round in a circle. The train set was a modest "Hornby Rural Rambler" which came complete with some track, a power supply a train and some carriages. The idea was to be able to vary the speed and direction of the train under computer control while monitoring it’s position around the track with some strategically placed sensors. While I considered starting from scratch and trying to hook up some inputs and outputs to the PC printer port I found that using the Motor-Bee from PC User was a better option for getting me into the fun part a bit earlier. This offered control of up to 4 motors and, crucially for me, also had some digital inputs to hook up to my sensors. On closer inspection the 4 motor capability was for uni-directional motors. Since I wanted a reversible train I needed to use it in it’s bi-directional mode which meant using two of the motor outputs. This was fine for me and left me wondering how I could use the remaining two. The Motor-Bee also had 4 digital outputs and an output for a servo which I had no immediate need for.
The first stage was to get the train working with the Motor-Bee without any sensors. To do this I used the supplied “Motor-Way” software and connected it to the train set as shown on the left, and also shown below with the USB cable from the computer connected. The connection was very simple. I cut the twin core cable that normally connects the power supply to the track (out of sight of my brother) and connected the +12v and GND from the supply to Vm+ and GND on the Motor-Bee respectively . It was important to get the supply connections to the Motor-Bee in the correct polarity so I had to be careful which way the direction selector switch was set on the train power supply. I then connected OP1 and OP2 on the Motor-Bee to the track connector end of the cut cable It didn't matter which way round this was connected since the drive was reversible.
I was pleasantly surprised how effective this simple, 5 minute, connection was. I initially just used Motor-Way in manual mode moving the sliders on the screen to run the train forwards and backwards at different speeds. I then progressed to using the automatic mode which allowed a number of “steps” to be specified. Each step had a duration and a speed and direction setting for the train. I soon had the train speeding up, slowing down and stopping at the stations. Whilst a lot of fun and definitely much better than just going round in a circle I aimed for still more authenticity. i.e. setting fixed durations and speed you can estimate where the train is going to stop (i.e. at the station) but it eventually ends up stopping at other locations since there is no actual feedback to say it is at the station. This is where sensors make their contribution.
Initially I thought about using simple micro-switches to sense the position of the train but eventually decided on a non-contact optical method. I used a combination of an infra-red photo-emitter and a matching photo-transistor. These were available from an online component supplier and were relatively cheap (about 30p each)
The circuit I used is shown above. I used 4 of these altogether, positioned at key locations around the track; at the station entrance and exit, half way round and at the spur (more on that later).. This was as far as I could go with the software supplied with the Motor-Bee. It was now time to write my own. I normally write using Visual Basic wherever possible and did so here. The DLL (Dynamic Link Library) supplied with the Motor-Bee cut through all of of the USB comms problems and provided me with three basic functions. InitMotoBee() to initialise the environment, SetMotors() to set speeds and directions etc.., and Digital_IO() to read the digital inputs and set the digital outputs. My first stab at the task was to copy the example Visual Basic program supplied on the Motor-Bee installation disk and start there. I use Microsoft Visual Studio for my VB and this example code came in a Visual Studio compatible workspace form, so it dropped straight in and compiled. It is a very basic program but at least it highlights how to do the basics (forgive the pun). It allows you to type in the numerical values for speed and then a button to send that configuration to the Motor-Bee. It also reads the digital inputs and puts them on the screen as tick boxes. I used this to test my optical input sensors.
Without going into the fine details of my VB program, the essence of it is to repeatedly scan the digital inputs and, depending on when individual sensors are activated, switch to new control sequences to implement a series of speed and direction changes. This leads to slow down at station, pause at station, speed up exiting etc… Not only does this allow a variety of motions around the track, but by keeping count of the activations of the sensor inputs, I changed the control sequences each time, giving the impression of a very complex train behaviour (schedule). Very pleasing to the eye.
There is also a spur track with a track switch (points), which I decided to try and use in some way. Although it’s a mechanical movement to switch the track I decided to try and automate it. My initial thoughts were to use a solenoid actuator controlled by one of the digital outputs via some relay driving IC . After consideration, and in the interests of furthering my knowledge, I decided to use a servo. I have never used a servo before so had to do a bit of reading up. Although it is a bit of an overkill to use a servo for this simple task , it does the business with some style. The servo I chose to use is a Hitec model HS310. This uses 6v power and the signal direct from the Motor-Bee. Connection details below.
The servo came with a small bag of various attachments for the moving part allowing me to improvise a push rod type linkage to the track switch. Control of the servo was fairly simple once I realised that there was no off condition. i.e. sending the number 128 to the MotorBee DLL function for the servo position actually sets it to it’s mid way (or neutral ) position. A number between 128 and 0 makes it go anti-clockwise by that amount (0 being the extreme anti-clockwise position) and a number between 128 and 255 goes clockwise. The total range of movement of the servo was 180 degrees. I found that the extreme ends of the range (i.e. above 220 and less than 25) had no effect on the servo since it was already at it’s limit. In fact setting it to these values caused it to buzz slightly. On further reading I found out that, due to the range of servo types, you can’t assume that 255 is maximum position. It varies with each servo design and the MotorBee control allows for worst case in its range. When you set a servo beyond its range it doesn’t explode (thankfully) it just gets a little warm and buzzes ! On the left you can see how the servo was arranged beside the track switch before it was bolted to the support platform. With the track switch now under my program control I then wrote some program to create a sequence that stopped the train just past the spur, switch the points and then reverse the train into the branch line. Very, very pleasing to the eye. I considered the possibilities of having more than one train on the track and using the spur to select the active one. This would involve shutting off the supply to sections of track under program control. This would be possible using some of the digital outputs and perhaps a relay or two but I decided it was a bridge too far at this point. With a little more work on the program and it’s sequences I managed to put together some interesting and varied combinations of train movements. The net effect of running this program was quite stunning to watch. It transformed a simple train set into something that held your attention. It certainly stunned and re-enthused my younger brother.
PC Control Ltd: All articles are publish as submitted in good faith but we do not accept any responsibility to the authenticity or content of these articles. Any article breaching copyright will be removed from this website as soon as we are made aware.