Two Axis Stepper Controller

From OpenCircuits
Jump to navigation Jump to search

What

Very incomplete, still working on it.

For some time I have wanted to aim a laser with good precision across a room. Long time ago I did this with servo motors, Worked fine excpt for the good precision. I thought that steppers might do better. The problem is that steppers move ( typically ) over a degree per step. Gearing the motor down decreases the speed, but improves the precision. And these motors, with built in gears are available, and they can be cheap ( Amazon.com : Longruner 5x Geared Stepper Motor 28byj 48 Uln2003 5v Stepper Motor Uln2003 Driver Board for arduino LK67 : Camera & Photo ) With these in hand and a 3D printed mount ( *Bare Bones 28BYJ-48 Gimbal. by mmontee - Thingiverse ) for them I went forward with the software.

You can aim the laser in both altitude and azimuth. Once you get it to a place you want the program can memorize the location as a target and then go back there on demand.

How

Laser/Motor Mount

These can be cheap ( Amazon.com : Longruner 5x Geared Stepper Motor 28byj 48 Uln2003 5v Stepper Motor Uln2003 Driver Board for arduino LK67 : Camera & Photo ) With these in hand and a 3D printed mount ( *Bare Bones 28BYJ-48 Gimbal. by mmontee - Thingiverse ) for them I went forward with the software.

Arduino and Driver

These can be cheap ( Amazon.com : Longruner 5x Geared Stepper Motor 28byj 48 Uln2003 5v Stepper Motor Uln2003 Driver Board for arduino LK67 : Camera & Photo ) With these in hand and a 3D printed mount ( *Bare Bones 28BYJ-48 Gimbal. by mmontee - Thingiverse ) for them I went forward with the software.

Arduino Software

In the old days I would have writen the code from the ground up. With the arduino you can often get a well tested library for this. I found the following and decided to use it.

For a long time I have had a belief that almost all arduino programs should have some sort of serial interface. And this is what I did for this project. The arduino is sent commands, typically a single character optionally followed by a number. From the help command built into the program here is a summary of the commands:

Arduino:  TwoAxis Ver1 2017 11 14.00
mnn    chooseMotor  
tn     move to Target n  
t-n    save Target n  
b      baklash adj   
nn     cmotor nudge n  !!
snn    cmotor setSpeed
ann    cmotor setAcceleration
dnn    doDance
z      both motors zeroPosition
w      statusReport WhatWhere
v      Version of software
ok

Here is a bit more detail on the commands.

  • m --> select the active Motor, either motor one or 2. Motor 1 is the asumith, x motor. Motor 2 is the altitude, y motor. The commands are m1 or m2
  • n --> Nudge the active motor forward or backward by some number of steps. So commands look like n22, n-99 n 10 and so on.
  • t --> Target the laser at one of several ( 12 or more ) different targets that are coded into the program. The commands look like t5, t7.....

you can also change the steps for a target to the "current" location of the target by using a negative target numbers. So t-7 saves the current steps to target 7

  • b --> Backlash adj wiggles both motors so hopefully the backlash is consistent no matter what the prior motion of the motors
  • s --> this sets the top Speed of the current or active motor as set by the m command
  • a --> this sets the Acceleration of the current or active motor as set by the m command
  • z --> both motors Zeros the position.
  • w --> this gives a status report of What and Where the motors are doing, see example below.
  • v --> Version of software is reported. Looks something like this: TwoAxis Ver1 2017 11 14.00

Status Report Example

Note that the position of each target is given, it is also give in the form of a c++ array that can be plugged back into the code to make the target setting "permanent".


# <<< Status
# <<< TwoAxis Ver1 2017 11 14.00
# <<< Current Motor: 1 = x
# <<< Target Position: 0
# <<< Current Position 1, x : 0
# <<< Current Position 2, y : 0
# <<< Motor 1, x Speed = 1000.00  Acc = 50.00
# <<< Motor 2, Y Speed = 1000.00  Acc = 50.00
# <<< print out targets:... 
# <<< Target: 1 x: 24 y: 24
# <<< Target: 2 x: 36 y: 36
# <<< Target: 3 x: 50 y: 50
# <<< Target: 4 x: 150 y: 150
# <<< Target: 5 x: 200 y: 200
# <<< Target: 6 x: 250 y: 250
# <<< Target: 7 x: 12 y: 12
# <<< Target: 8 x: 24 y: 24
# <<< Target: 9 x: 36 y: 36
# <<< Target: 10 x: 50 y: 50
# <<< Target: 11 x: 150 y: 150
# <<< Target: 12 x: 200 y: 200
# <<< c format for targets:... 
# <<< int  target_coords[]  = { 12, 24, 24, 36, 36, 50, 50, 150, 150, 200, 200, 250, 250, 12, 12, 24, 24, 36, 36, 50, 50, 150, 150, 200,  }; 
# <<< ok



  • with move the current motor, either motor 1 the asumith x motor or motor 2 the altitude, y motor. So commands look like m22, m-99 m 10 and so on.