LocoArm: Robot Locomotion on Rails

Sivan Toledo, March 2007

LocoArm about to grab a ballA robot that moves on rails can traverse large distances quickly and still reach its destination accurately, because it only needs to navigate a one-dimensional world, rather than the two-dimensional floor. If the robot only moves in a straight line, you can easily create rails for it to move on from Lego beams. But if the track needs to turn, then you need real railroad tracks and a vehicle that can move on these tracks.

In this robot I used Lego train tracks from the RC Trains line, along with a train motor from the same line. The motor is a 9V motor that can be controlled by the NXT using a converter cable. Train wheels with rubber tires connect to the motor using technic axles. The top of the motor is smooth and has a pin that fits into a hole in a special train-base plate. The smooth top and the pin allows the motor to rotate when the train traverses a curve. The other side of the train-base plate is supported by a similar structure that is not motorized. You can see them in the picture below.

The RC train motor

Normally, the motor in an remote-controlled (RC) train is connected to a battery-box/infrared-controller that is attached to a special train base plate. But in this robot the NXT is controlling the motor, not the infrared remote control, so I used a normal train base plate.

The train base plate has studs, so I attached to it Technic beams with studs and attached the rest of the structure to these beams. Apart from the NXT itself, the moving platform supports two additional structures: a light sensor that detects stations in which the robot is supposed to carry out a task, and a robotic arm. The grabber arm is pretty much the grabber from RoboArm T-56, including the touch sensor that detects the presense of a ball.

The yellow and red bricks opposite to the arm are just balast; they balance the robot. I discovered that it is extremely important for the robot to be perfectly level. Without these bricks, the robot tilts a bit due to the weight of the arm. This increases the distance between the light sensor and the black tiles that mark the station, so it often fails to detect the station. When the robot is tilted even just a bit, there is often only a tiny drop in reflected light reading when it is above the black tile. But when it is horizontal, the drop is large (drops from above 40 to less than 20). The following two pictures show the robot approaching the station and then on top of it. The distance to the black tiles should be small.

LocoArm approaching a station

LocoArm at a station

Here is the entire track with two stations. LocoArm is able to detect both of them, and to approach them from either side. Opposite the black tiles that mark a station there is a little tower that can hold a ball.

The entire track with two stations

Here is a closeup of a station.

A closeup of a station

LocoArm is fairly reliable in picking up the ball, but not 100%. When it fails to grab the ball, it's usually because it didn't stop with the light sensor just above the black tiles but a bit earlier.

It was actually much harder to make LocoArm reliable than I expected. Two issues make accurate stopping at a station difficult:

I solved this problem by stopping the motor when the light sensor detects the station. The robot always overshoots the station. So after it stops the motor and waits for 0.3 seconds, it starts moving in short bursts in the other direction. It runs the motor (at 100% power) for 10ms, then breaks it for 75ms, and checks the light sensor. If repeats until it detects the station. As long as the robot is not tilted, this is pretty reliable.

Here are a few more pictures.




© 2007, Sivan Toledo