diff options
Diffstat (limited to 'libraries/Stepper')
| -rw-r--r-- | libraries/Stepper/Stepper.cpp | 220 | ||||
| -rw-r--r-- | libraries/Stepper/Stepper.h | 83 | ||||
| -rw-r--r-- | libraries/Stepper/examples/MotorKnob/MotorKnob.ino | 41 | ||||
| -rw-r--r-- | libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino | 44 | ||||
| -rw-r--r-- | libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino | 44 | ||||
| -rw-r--r-- | libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.ino | 48 | ||||
| -rw-r--r-- | libraries/Stepper/keywords.txt | 28 | 
7 files changed, 508 insertions, 0 deletions
| diff --git a/libraries/Stepper/Stepper.cpp b/libraries/Stepper/Stepper.cpp new file mode 100644 index 0000000..5d6b5e5 --- /dev/null +++ b/libraries/Stepper/Stepper.cpp @@ -0,0 +1,220 @@ +/* +  Stepper.cpp - - Stepper library for Wiring/Arduino - Version 0.4 +   +  Original library     (0.1) by Tom Igoe. +  Two-wire modifications   (0.2) by Sebastian Gassner +  Combination version   (0.3) by Tom Igoe and David Mellis +  Bug fix for four-wire   (0.4) by Tom Igoe, bug fix from Noah Shibley   + +  Drives a unipolar or bipolar stepper motor using  2 wires or 4 wires + +  When wiring multiple stepper motors to a microcontroller, +  you quickly run out of output pins, with each motor requiring 4 connections.  + +  By making use of the fact that at any time two of the four motor +  coils are the inverse  of the other two, the number of +  control connections can be reduced from 4 to 2.  + +  A slightly modified circuit around a Darlington transistor array or an L293 H-bridge +  connects to only 2 microcontroler pins, inverts the signals received, +  and delivers the 4 (2 plus 2 inverted ones) output signals required +  for driving a stepper motor. + +  The sequence of control signals for 4 control wires is as follows: + +  Step C0 C1 C2 C3 +     1  1  0  1  0 +     2  0  1  1  0 +     3  0  1  0  1 +     4  1  0  0  1 + +  The sequence of controls signals for 2 control wires is as follows +  (columns C1 and C2 from above): + +  Step C0 C1 +     1  0  1 +     2  1  1 +     3  1  0 +     4  0  0 + +  The circuits can be found at  +  +http://www.arduino.cc/en/Tutorial/Stepper +  +  + */ + + +#include "Arduino.h" +#include "Stepper.h" + +/* + * two-wire constructor. + * Sets which wires should control the motor. + */ +Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2) +{ +  this->step_number = 0;      // which step the motor is on +  this->speed = 0;        // the motor speed, in revolutions per minute +  this->direction = 0;      // motor direction +  this->last_step_time = 0;    // time stamp in ms of the last step taken +  this->number_of_steps = number_of_steps;    // total number of steps for this motor +   +  // Arduino pins for the motor control connection: +  this->motor_pin_1 = motor_pin_1; +  this->motor_pin_2 = motor_pin_2; + +  // setup the pins on the microcontroller: +  pinMode(this->motor_pin_1, OUTPUT); +  pinMode(this->motor_pin_2, OUTPUT); +   +  // When there are only 2 pins, set the other two to 0: +  this->motor_pin_3 = 0; +  this->motor_pin_4 = 0; +   +  // pin_count is used by the stepMotor() method: +  this->pin_count = 2; +} + + +/* + *   constructor for four-pin version + *   Sets which wires should control the motor. + */ + +Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4) +{ +  this->step_number = 0;      // which step the motor is on +  this->speed = 0;        // the motor speed, in revolutions per minute +  this->direction = 0;      // motor direction +  this->last_step_time = 0;    // time stamp in ms of the last step taken +  this->number_of_steps = number_of_steps;    // total number of steps for this motor +   +  // Arduino pins for the motor control connection: +  this->motor_pin_1 = motor_pin_1; +  this->motor_pin_2 = motor_pin_2; +  this->motor_pin_3 = motor_pin_3; +  this->motor_pin_4 = motor_pin_4; + +  // setup the pins on the microcontroller: +  pinMode(this->motor_pin_1, OUTPUT); +  pinMode(this->motor_pin_2, OUTPUT); +  pinMode(this->motor_pin_3, OUTPUT); +  pinMode(this->motor_pin_4, OUTPUT); + +  // pin_count is used by the stepMotor() method:   +  this->pin_count = 4;   +} + +/* +  Sets the speed in revs per minute + +*/ +void Stepper::setSpeed(long whatSpeed) +{ +  this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed; +} + +/* +  Moves the motor steps_to_move steps.  If the number is negative,  +   the motor moves in the reverse direction. + */ +void Stepper::step(int steps_to_move) +{   +  int steps_left = abs(steps_to_move);  // how many steps to take +   +  // determine direction based on whether steps_to_mode is + or -: +  if (steps_to_move > 0) {this->direction = 1;} +  if (steps_to_move < 0) {this->direction = 0;} +     +     +  // decrement the number of steps, moving one step each time: +  while(steps_left > 0) { +  // move only if the appropriate delay has passed: +  if (millis() - this->last_step_time >= this->step_delay) { +      // get the timeStamp of when you stepped: +      this->last_step_time = millis(); +      // increment or decrement the step number, +      // depending on direction: +      if (this->direction == 1) { +        this->step_number++; +        if (this->step_number == this->number_of_steps) { +          this->step_number = 0; +        } +      }  +      else {  +        if (this->step_number == 0) { +          this->step_number = this->number_of_steps; +        } +        this->step_number--; +      } +      // decrement the steps left: +      steps_left--; +      // step the motor to step number 0, 1, 2, or 3: +      stepMotor(this->step_number % 4); +    } +  } +} + +/* + * Moves the motor forward or backwards. + */ +void Stepper::stepMotor(int thisStep) +{ +  if (this->pin_count == 2) { +    switch (thisStep) { +      case 0: /* 01 */ +      digitalWrite(motor_pin_1, LOW); +      digitalWrite(motor_pin_2, HIGH); +      break; +      case 1: /* 11 */ +      digitalWrite(motor_pin_1, HIGH); +      digitalWrite(motor_pin_2, HIGH); +      break; +      case 2: /* 10 */ +      digitalWrite(motor_pin_1, HIGH); +      digitalWrite(motor_pin_2, LOW); +      break; +      case 3: /* 00 */ +      digitalWrite(motor_pin_1, LOW); +      digitalWrite(motor_pin_2, LOW); +      break; +    }  +  } +  if (this->pin_count == 4) { +    switch (thisStep) { +      case 0:    // 1010 +      digitalWrite(motor_pin_1, HIGH); +      digitalWrite(motor_pin_2, LOW); +      digitalWrite(motor_pin_3, HIGH); +      digitalWrite(motor_pin_4, LOW); +      break; +      case 1:    // 0110 +      digitalWrite(motor_pin_1, LOW); +      digitalWrite(motor_pin_2, HIGH); +      digitalWrite(motor_pin_3, HIGH); +      digitalWrite(motor_pin_4, LOW); +      break; +      case 2:    //0101 +      digitalWrite(motor_pin_1, LOW); +      digitalWrite(motor_pin_2, HIGH); +      digitalWrite(motor_pin_3, LOW); +      digitalWrite(motor_pin_4, HIGH); +      break; +      case 3:    //1001 +      digitalWrite(motor_pin_1, HIGH); +      digitalWrite(motor_pin_2, LOW); +      digitalWrite(motor_pin_3, LOW); +      digitalWrite(motor_pin_4, HIGH); +      break; +    }  +  } +} + +/* +  version() returns the version of the library: +*/ +int Stepper::version(void) +{ +  return 4; +} diff --git a/libraries/Stepper/Stepper.h b/libraries/Stepper/Stepper.h new file mode 100644 index 0000000..4094aee --- /dev/null +++ b/libraries/Stepper/Stepper.h @@ -0,0 +1,83 @@ +/* +  Stepper.h - - Stepper library for Wiring/Arduino - Version 0.4 +   +  Original library     (0.1) by Tom Igoe. +  Two-wire modifications   (0.2) by Sebastian Gassner +  Combination version   (0.3) by Tom Igoe and David Mellis +  Bug fix for four-wire   (0.4) by Tom Igoe, bug fix from Noah Shibley + +  Drives a unipolar or bipolar stepper motor using  2 wires or 4 wires + +  When wiring multiple stepper motors to a microcontroller, +  you quickly run out of output pins, with each motor requiring 4 connections.  + +  By making use of the fact that at any time two of the four motor +  coils are the inverse  of the other two, the number of +  control connections can be reduced from 4 to 2.  + +  A slightly modified circuit around a Darlington transistor array or an L293 H-bridge +  connects to only 2 microcontroler pins, inverts the signals received, +  and delivers the 4 (2 plus 2 inverted ones) output signals required +  for driving a stepper motor. + +  The sequence of control signals for 4 control wires is as follows: + +  Step C0 C1 C2 C3 +     1  1  0  1  0 +     2  0  1  1  0 +     3  0  1  0  1 +     4  1  0  0  1 + +  The sequence of controls signals for 2 control wires is as follows +  (columns C1 and C2 from above): + +  Step C0 C1 +     1  0  1 +     2  1  1 +     3  1  0 +     4  0  0 + +  The circuits can be found at  +  http://www.arduino.cc/en/Tutorial/Stepper +*/ + +// ensure this library description is only included once +#ifndef Stepper_h +#define Stepper_h + +// library interface description +class Stepper { +  public: +    // constructors: +    Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2); +    Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4); + +    // speed setter method: +    void setSpeed(long whatSpeed); + +    // mover method: +    void step(int number_of_steps); + +    int version(void); + +  private: +    void stepMotor(int this_step); +     +    int direction;        // Direction of rotation +    int speed;          // Speed in RPMs +    unsigned long step_delay;    // delay between steps, in ms, based on speed +    int number_of_steps;      // total number of steps this motor can take +    int pin_count;        // whether you're driving the motor with 2 or 4 pins +    int step_number;        // which step the motor is on +     +    // motor pin numbers: +    int motor_pin_1; +    int motor_pin_2; +    int motor_pin_3; +    int motor_pin_4; +     +    long last_step_time;      // time stamp in ms of when the last step was taken +}; + +#endif + diff --git a/libraries/Stepper/examples/MotorKnob/MotorKnob.ino b/libraries/Stepper/examples/MotorKnob/MotorKnob.ino new file mode 100644 index 0000000..d428186 --- /dev/null +++ b/libraries/Stepper/examples/MotorKnob/MotorKnob.ino @@ -0,0 +1,41 @@ +/* + * MotorKnob + * + * A stepper motor follows the turns of a potentiometer + * (or other sensor) on analog input 0. + * + * http://www.arduino.cc/en/Reference/Stepper + * This example code is in the public domain. + */ + +#include <Stepper.h> + +// change this to the number of steps on your motor +#define STEPS 100 + +// create an instance of the stepper class, specifying +// the number of steps of the motor and the pins it's +// attached to +Stepper stepper(STEPS, 8, 9, 10, 11); + +// the previous reading from the analog input +int previous = 0; + +void setup() +{ +  // set the speed of the motor to 30 RPMs +  stepper.setSpeed(30); +} + +void loop() +{ +  // get the sensor value +  int val = analogRead(0); + +  // move a number of steps equal to the change in the +  // sensor reading +  stepper.step(val - previous); + +  // remember the previous value of the sensor +  previous = val; +}
\ No newline at end of file diff --git a/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino b/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino new file mode 100644 index 0000000..2dbb57d --- /dev/null +++ b/libraries/Stepper/examples/stepper_oneRevolution/stepper_oneRevolution.ino @@ -0,0 +1,44 @@ + +/*  + Stepper Motor Control - one revolution +  + This program drives a unipolar or bipolar stepper motor.  + The motor is attached to digital pins 8 - 11 of the Arduino. +  + The motor should revolve one revolution in one direction, then + one revolution in the other direction.   +  +   + Created 11 Mar. 2007 + Modified 30 Nov. 2009 + by Tom Igoe +  + */ + +#include <Stepper.h> + +const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution +                                     // for your motor + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8,9,10,11);             + +void setup() { +  // set the speed at 60 rpm: +  myStepper.setSpeed(60); +  // initialize the serial port: +  Serial.begin(9600); +} + +void loop() { +  // step one revolution  in one direction: +   Serial.println("clockwise"); +  myStepper.step(stepsPerRevolution); +  delay(500); +   +   // step one revolution in the other direction: +  Serial.println("counterclockwise"); +  myStepper.step(-stepsPerRevolution); +  delay(500);  +} + diff --git a/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino b/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino new file mode 100644 index 0000000..36d3299 --- /dev/null +++ b/libraries/Stepper/examples/stepper_oneStepAtATime/stepper_oneStepAtATime.ino @@ -0,0 +1,44 @@ + +/*  + Stepper Motor Control - one step at a time +  + This program drives a unipolar or bipolar stepper motor.  + The motor is attached to digital pins 8 - 11 of the Arduino. +  + The motor will step one step at a time, very slowly.  You can use this to + test that you've got the four wires of your stepper wired to the correct + pins. If wired correctly, all steps should be in the same direction. +  + Use this also to count the number of steps per revolution of your motor, + if you don't know it.  Then plug that number into the oneRevolution + example to see if you got it right. +  + Created 30 Nov. 2009 + by Tom Igoe +  + */ + +#include <Stepper.h> + +const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution +                                     // for your motor + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8,9,10,11);             + +int stepCount = 0;         // number of steps the motor has taken + +void setup() { +  // initialize the serial port: +  Serial.begin(9600); +} + +void loop() { +  // step one step: +  myStepper.step(1); +  Serial.print("steps:" ); +  Serial.println(stepCount); +  stepCount++; +  delay(500); +} + diff --git a/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.ino b/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.ino new file mode 100644 index 0000000..1a67a55 --- /dev/null +++ b/libraries/Stepper/examples/stepper_speedControl/stepper_speedControl.ino @@ -0,0 +1,48 @@ + +/*  + Stepper Motor Control - speed control +  + This program drives a unipolar or bipolar stepper motor.  + The motor is attached to digital pins 8 - 11 of the Arduino. + A potentiometer is connected to analog input 0. +  + The motor will rotate in a clockwise direction. The higher the potentiometer value, + the faster the motor speed. Because setSpeed() sets the delay between steps,  + you may notice the motor is less responsive to changes in the sensor value at + low speeds. +  + Created 30 Nov. 2009 + Modified 28 Oct 2010 + by Tom Igoe +  + */ + +#include <Stepper.h> + +const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution +// for your motor + + +// initialize the stepper library on pins 8 through 11: +Stepper myStepper(stepsPerRevolution, 8,9,10,11);             + +int stepCount = 0;  // number of steps the motor has taken + +void setup() { +  // nothing to do inside the setup +} + +void loop() { +  // read the sensor value: +  int sensorReading = analogRead(A0); +  // map it to a range from 0 to 100: +  int motorSpeed = map(sensorReading, 0, 1023, 0, 100); +  // set the motor speed: +  if (motorSpeed > 0) { +    myStepper.setSpeed(motorSpeed); +    // step 1/100 of a revolution: +    myStepper.step(stepsPerRevolution/100); +  }  +} + + diff --git a/libraries/Stepper/keywords.txt b/libraries/Stepper/keywords.txt new file mode 100644 index 0000000..19a0fad --- /dev/null +++ b/libraries/Stepper/keywords.txt @@ -0,0 +1,28 @@ +####################################### +# Syntax Coloring Map For Test +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Stepper	KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +step	KEYWORD2 +setSpeed	KEYWORD2 +version	KEYWORD2 + +###################################### +# Instances (KEYWORD2) +####################################### +direction	KEYWORD2 +speed	KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### | 
