I have a small motorized vehicle with gears as wheels running up and down a track made of gear racks. How can this robot know when it has run half the track? And what's the best method to keep it from running off its track at the end and then return to start.

The robot is carrying water, not exactly the same amount each time, so it will not weigh the same. Therefore it might not be the same amount of steps in the stepper-motor each time.

Here I have some ideas that might work, though I am a beginner, and don't know what's the best solution.

  • GPS tracking it (overkill on such a small scale?)
  • Some kind of distance measurer
  • Have a knob it will hit at the middle of the track, telling program to delay for a given time
  • Track amount of steps the motor has performed (won't be as accurate?)
  • 1
    $\begingroup$ If your track is geared, then you are guaranteed to use the same number of stepper motor steps every time. If the weight of the water changes then you will use different amounts of power to make those steps, but the size of each step is constant. $\endgroup$
    – Ian
    Jan 18, 2013 at 19:24
  • 2
    $\begingroup$ @Ian, that assumes that the motor is specified for a worst case scenario, and there are no external factors applying (such as something blocking the tracks). See the Soft endstops section of my answer and my comments on Spiked3's and Joe Baker's answers. $\endgroup$
    – Mark Booth
    Jan 21, 2013 at 13:37

4 Answers 4


If you are running on a fixed track, by far the easiest method is to use a pair of endstops.

Typically these would be mechanical, magnetic or optical.


A mechanical endstop could be as simple as a physical barrier at the end of your track, much like a train track buffer stop. Your vehicle would bump up to buffer, detect that it wasn't moving and take that as a signal that it had reached the end of travel.

If you are moving slowly, with low toque and the restraining force of the buffer is significantly greater than the motive force of the vehicle plus the force from dissipating the momentum of the vehicle, then a simple mechanical endstop might be sufficient.

If you want to get a little more sophisticated, you could add a mechanical switch to your vehicle bumpers, ideally on a spring such that it is closed before the main body of the vehicle hits the buffer. When the buffer stop is close, the control system would be told by the closing of the switch that and could apply the brakes.


A magnetic endstop would be a magnet on the track with a reed-switch attached to your control system. When the reed switch rolls over the magnet, the circuit is closed and the control system can stop the vehicle.

This has the advantage over the mechanical switch that it is non contact, so is less likely to be damages if the vehicle becomes a run-away.


An optical endstop would be a slotted optical switch on the vehicle and a blade of metal near the end of travel on the track, which runs through optical switch, blocking the beam when the vehicle gets close to the end of travel.

This has the advantage that rather than relying on a magnet that is in one spot on the track being detected, it can signal an end of travel condition for the whole distance from the end of required travel right up to any mechanical endstop.

Soft endstops

Essentially, this is just keeping track of where you have commanded your stepper motor to move and applying limits on how far you allow the higher level software to move. If you are requesting motion which is well within the parameters of the motor you have specified for your vehicle (speed, torque and acceleration profile etc.), then it should not be skipping steps and soft end-stops may well be sufficient.

If you do this though, I would also recommend adding one of the other mechanisms as belt and braces.


Most industrial systems have multiple end of travel detection and over travel prevention systems, usually soft limits and either a mechanical endstop plus limit switches or soft limits, mechanical endstop plus opto endstop. All three systems have to fail in order for the system fail overall.

You might also want to have a look at the answers to Why do I need an endstop sensor with stepper motor? over on Electrical Engineering Stack exchange.


If you are running gears as wheels on gear tracks, I do not understand how weight could change the number of steps. How can they slip? If there is no slippage, then the amount of steps should always be sufficient, although as mark suggested, most real world solutions would also include a limiting touch switch in case of mechanical failure.

Since using number of steps involves some math, it may be just easier and as good to use only limiting touch switches. It is common to put touch switches at any location such as the middle. In the case for a middle switch, some protrusion on the tracks would trigger the switch on the robot.

typical switch

Touch Switch

  • 1
    $\begingroup$ Hall effect sensors (magnet + sensor) might be better, removing the mechanical switch from the "might break" list $\endgroup$
    – Andrew
    Jan 20, 2013 at 14:53
  • $\begingroup$ If you are commanding the stepper motor to perform a move which is beyond it's capability (for instance requesting too high an acceleration for the weight load) then the motor itself could slip even if the gears etc don't. $\endgroup$
    – Mark Booth
    Jan 21, 2013 at 11:04
  • $\begingroup$ Isn't that true for ANYTHING? I assume we were talking 'within mechanical limits' here, if not then I'd challenge any answer. $\endgroup$
    – Spiked3
    Jan 21, 2013 at 11:47
  • $\begingroup$ Yup, but it is worth mentioning in your answer (as I did), since not taking account of it is a common mistake. I've even know large expensive industrial systems brought low because a little too much friction at one point in a move caused the system to miss steps occasionally, and whacking a bigger stepper motor on it just caused another part of the system to break (it couldn't cope with the new torque output of the motor). $\endgroup$
    – Mark Booth
    Jan 21, 2013 at 13:32
  • $\begingroup$ gotcha. I made the mistake once of thinking a servo would make it better - they just flash a fault light - still cause the same problems :( $\endgroup$
    – Spiked3
    Jan 21, 2013 at 13:56

A stepper motor actually will move the same amount of steps per control signal regardless of weight, drawing more current as needed to turn the motor shaft the same amount. If there was wheel slip to account for, weight would be a factor there. However, given your gear rack track, wheel slip is negligible and can be ignored.

I've built small line-follower robots in the past using 5V geared stepper motors running off AA batteries. Wheel slip was fairly small due to rubber O-rings mounted to the wheels. We took two identical prototypes and set them side by side and sent a move forward signal to both simultaneously. They moved in perfect lockstep over the course of a meter. We then placed a glass bottle of beer on one of the robots and repeated the experiment. Same result despite the weight difference.

The specifications for your stepper motor will list a Step Angle, the number of degrees that the motor shaft turns for a single step (I'm assuming that you're not doing any microstepping). You then need to account for the gear ratio to figure out how far you actually move. This is a little trickier to calculate with a rack and pinion than a normal pair of spur gears. Gear ratio is normally determined by the diameter of the input and output gears, but your output gear (the rack) is technically of infinite diameter.

If you haven't already, set up your control code so that you can make your stepper motor turn a given number of steps. Suppose the step angle of your motor is 7.5 degrees. The number of steps required to turn 360 degrees is:

360° / 7.5° per step = 48 steps

You can verify your 360 degree turn code by by placing a small mark on the pinion gear. Now set your robot on the rack and measure how far it travels along the rack when you turn the motor 360 degrees (48 steps in this case). You can use this measurement to determine how far along the rack the robot moves per step. Suppose it travels 12 centimeters.

12 cm / 48 steps = 0.25 cm of linear motion per step

Try the track measurement again with the maximum water load and verify that a 360 degree turn of the pinion gear still occurs. If not, you are trying to step too fast for the motor torque to keep up and it's missing steps. Increase the interval between steps until you get a full 360 degree turn of the pinion gear with the water weight.

You can now encode movements to 0.25 cm resolution. If you know the length of the track and can guarantee your start position, you can get away with not having an endstop or limit switch. That being said, it's always a good idea to have them there anyways just in case.


I would suggest you to check the HC-SR04 Ultrasonic Sensor that could easily wired and programmed into your robo vehicle. By adjusting the sensor to correctly emit ultrasound on a fixed object and measuring echo/ping from the object, you can judge the distance quite accurately. enter image description here Another option would be to lay encoder track(alternate black and white zebra-striped track, so you can use an optical eye -an LDR or LED opto sensor to count the contrast changes while traversing through the track). enter image description here (I am not so good with photoshop, HTH :) )


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.