# Precise motor positioning

I am trying to make a device that uses several motors all with an arrow fixed on top that has 8 fixed positions (N,NE,E,SE,S,SW,W,NW). I am trying to avoid servos and steppers because of the price, so I was wondering if anyone had ideas on how this could be achieved. The only way I can think of is to calibrate pulses to the amount of rotation that the motor would experience. It seems like there should be a better solution than this!

You want an arrow to point in one of 8 fixed positions? Just use magnetized needles and 8 minimal electromagnets to pull the needle in the direction you want?

• Nice idea! Could require more I/O to implement... – Adam Davis Mar 5 '10 at 18:03
• That's kind of a stepper motor :) – Bryan Boettcher Sep 24 '12 at 18:27

The only way I can think of is to calibrate pulses to the amount of rotation that the motor would experience.

I have difficulty thinking that this would work, which means you should definitely get a motor and try it out! Set it up with a stop so you can apply a long pulse and get it to rest on the stop at a known position, then apply pulses of various lengths, currents, etc and see if you can get repeatable results.

Keep in mind that friction will change slightly with temperature, humidity, and other factors depending on the motor design, but since you only need 8 positions you may have enough room for error that it won't matter. Your biggest problem is likely to be that you have to calibrate each motor, even if they're the same type, since they'll all have slightly different torque/A characteristics, and that this will change over time as the motor ages and how the environment affects it.

However, to get better results, you'll need some sort of feedback loop.

The easiest/cheapest is probably to attach a potentiometer and read its position with an a/d converter. Since the potentiometer will be too hard to turn, make your own with a piece of cardboard and pencil. Draw a thick black circle almost all the way around the cardboard, cut a hole in the center and attach it to the motor. Attach a wire to one end of the semicircle, and drag a wire along the other end so as the motor turns you get varying resistance. Use that with an A/D.

You can also reverse this - put the moving contact on the arrow with the thick black line below it (so you don't have to turn the cardboard, just the moving contact). If you are creative with your design people will just think the black semicircle is part of the display face.

It will be very, very noisy and unreliable, though, depending on construction, and won't last for a long time, but it is cheap and easy and with your low resolution positioning requirements it should give you enough feedback to get in the right 45 degree area.

Another (more reliable) option would be to use one optical sensor with notches cut in the rotating cardboard. Just count the pulses until you're in the right spot. You can get rid of the (expensive) optical encoder and use two wires that touch in the notches, and are separated when there's no notch.

Good luck, and please tell us what you tried and how it worked!

• Insightful and creative answers; I learned at least two absolutely new things here. And +1 for bringing up a case where pencil beats potentometer! – boardbite Aug 27 '12 at 15:20

Use a photointerrupters like the one in the link. Attach a thin 'arm' to the motor shaft that points the direction you want to point. Then place 8 of the photointerrupters at the angles you want to point to, positioned such that the arm moves through the interrupter when it's at the right position. Then, just move the motor until you detect that the correct interrupter has been interrupted.

If you want cheap...

I have messed around with pulling simple DC motors out of inkjet printers and then using the inkjet's optical encoders for positioning.

I used an Arduino for testing, but you could use any microcontroller.

Check this out.