1
0
mirror of https://github.com/arduino/Arduino.git synced 2025-02-22 16:54:20 +01:00

Stepper Library supports 5 phase, 5 wire motors.

This commit is contained in:
Ryan Orendorff 2012-02-07 05:33:14 +00:00 committed by Cristian Maglie
parent caf000b005
commit 50ca5d8f75
2 changed files with 338 additions and 189 deletions

View File

@ -1,65 +1,79 @@
/* /*
Stepper.cpp - - Stepper library for Wiring/Arduino - Version 0.5 * Stepper.cpp - Stepper library for Wiring/Arduino - Version 0.6
*
Original library (0.1) by Tom Igoe. * Original library (0.1) by Tom Igoe.
Two-wire modifications (0.2) by Sebastian Gassner * Two-wire modifications (0.2) by Sebastian Gassner
Combination version (0.3) by Tom Igoe and David Mellis * 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 * Bug fix for four-wire (0.4) by Tom Igoe, bug fix from Noah Shibley
High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko * High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko
* Five phase five wire (0.6) by Ryan Orendorff
Drives a unipolar or bipolar stepper motor using 2 wires or 4 wires *
* This library is free software; you can redistribute it and/or
When wiring multiple stepper motors to a microcontroller, * modify it under the terms of the GNU Lesser General Public
you quickly run out of output pins, with each motor requiring 4 connections. * License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
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 * This library is distributed in the hope that it will be useful,
control connections can be reduced from 4 to 2. * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
A slightly modified circuit around a Darlington transistor array or an L293 H-bridge * Lesser General Public License for more details.
connects to only 2 microcontroler pins, inverts the signals received, *
and delivers the 4 (2 plus 2 inverted ones) output signals required * You should have received a copy of the GNU Lesser General Public
for driving a stepper motor. Similarly the Arduino motor shields 2 direction pins * License along with this library; if not, write to the Free Software
may be used. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
The sequence of control signals for 4 control wires is as follows: *
* Drives a unipolar, bipolar, or five phase stepper motor.
Step C0 C1 C2 C3 *
1 1 0 1 0 * When wiring multiple stepper motors to a microcontroller, you quickly run
2 0 1 1 0 * out of output pins, with each motor requiring 4 connections.
3 0 1 0 1 *
4 1 0 0 1 * 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
The sequence of controls signals for 2 control wires is as follows * reduced from 4 to 2 for the unipolar and bipolar motors.
(columns C1 and C2 from above): *
* A slightly modified circuit around a Darlington transistor array or an
Step C0 C1 * L293 H-bridge connects to only 2 microcontroler pins, inverts the signals
1 0 1 * received, and delivers the 4 (2 plus 2 inverted ones) output signals
2 1 1 * required for driving a stepper motor. Similarly the Arduino motor shields
3 1 0 * 2 direction pins may be used.
4 0 0 *
* The sequence of control signals for 5 phase, 5 control wires is as follows:
The circuits can be found at *
* Step C0 C1 C2 C3 C4
http://www.arduino.cc/en/Tutorial/Stepper * 1 0 1 1 0 1
* 2 0 1 0 0 1
This library is free software; you can redistribute it and/or * 3 0 1 0 1 1
modify it under the terms of the GNU Lesser General Public * 4 0 1 0 1 0
License as published by the Free Software Foundation; either * 5 1 1 0 1 0
version 2.1 of the License, or (at your option) any later version. * 6 1 0 0 1 0
* 7 1 0 1 1 0
This library is distributed in the hope that it will be useful, * 8 1 0 1 0 0
but WITHOUT ANY WARRANTY; without even the implied warranty of * 9 1 0 1 0 1
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 10 0 0 1 0 1
Lesser General Public License for more details. *
* The sequence of control signals for 4 control wires is as follows:
You should have received a copy of the GNU Lesser General Public *
License along with this library; if not, write to the Free Software * Step C0 C1 C2 C3
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 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 "Arduino.h"
#include "Stepper.h" #include "Stepper.h"
@ -83,9 +97,10 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)
pinMode(this->motor_pin_1, OUTPUT); pinMode(this->motor_pin_1, OUTPUT);
pinMode(this->motor_pin_2, OUTPUT); pinMode(this->motor_pin_2, OUTPUT);
// When there are only 2 pins, set the other two to 0: // When there are only 2 pins, set the others to 0:
this->motor_pin_3 = 0; this->motor_pin_3 = 0;
this->motor_pin_4 = 0; this->motor_pin_4 = 0;
this->motor_pin_5 = 0;
// pin_count is used by the stepMotor() method: // pin_count is used by the stepMotor() method:
this->pin_count = 2; this->pin_count = 2;
@ -96,8 +111,8 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)
* constructor for four-pin version * constructor for four-pin version
* Sets which wires should control the motor. * Sets which wires should control the motor.
*/ */
Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2,
Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4) int motor_pin_3, int motor_pin_4)
{ {
this->step_number = 0; // which step the motor is on this->step_number = 0; // which step the motor is on
this->speed = 0; // the motor speed, in revolutions per minute this->speed = 0; // the motor speed, in revolutions per minute
@ -117,13 +132,47 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int moto
pinMode(this->motor_pin_3, OUTPUT); pinMode(this->motor_pin_3, OUTPUT);
pinMode(this->motor_pin_4, OUTPUT); pinMode(this->motor_pin_4, OUTPUT);
// When there are 4 pins, set the others to 0:
this->motor_pin_5 = 0;
// pin_count is used by the stepMotor() method: // pin_count is used by the stepMotor() method:
this->pin_count = 4; this->pin_count = 4;
} }
/* /*
Sets the speed in revs per minute * constructor for five phase motor with five wires
* 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,
int motor_pin_5)
{
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 us 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;
this->motor_pin_5 = motor_pin_5;
// 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);
pinMode(this->motor_pin_5, OUTPUT);
// pin_count is used by the stepMotor() method:
this->pin_count = 5;
}
/*
* Sets the speed in revs per minute
*/ */
void Stepper::setSpeed(long whatSpeed) void Stepper::setSpeed(long whatSpeed)
{ {
@ -131,8 +180,8 @@ void Stepper::setSpeed(long whatSpeed)
} }
/* /*
Moves the motor steps_to_move steps. If the number is negative, * Moves the motor steps_to_move steps. If the number is negative,
the motor moves in the reverse direction. * the motor moves in the reverse direction.
*/ */
void Stepper::step(int steps_to_move) void Stepper::step(int steps_to_move)
{ {
@ -165,7 +214,10 @@ void Stepper::step(int steps_to_move)
} }
// decrement the steps left: // decrement the steps left:
steps_left--; steps_left--;
// step the motor to step number 0, 1, 2, or 3: // step the motor to step number 0, 1, ..., {3 or 10}
if (this->pin_count == 5)
stepMotor(this->step_number % 10);
else
stepMotor(this->step_number % 4); stepMotor(this->step_number % 4);
} }
} }
@ -178,19 +230,19 @@ void Stepper::stepMotor(int thisStep)
{ {
if (this->pin_count == 2) { if (this->pin_count == 2) {
switch (thisStep) { switch (thisStep) {
case 0: /* 01 */ case 0: // 01
digitalWrite(motor_pin_1, LOW); digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH); digitalWrite(motor_pin_2, HIGH);
break; break;
case 1: /* 11 */ case 1: // 11
digitalWrite(motor_pin_1, HIGH); digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH); digitalWrite(motor_pin_2, HIGH);
break; break;
case 2: /* 10 */ case 2: // 10
digitalWrite(motor_pin_1, HIGH); digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW); digitalWrite(motor_pin_2, LOW);
break; break;
case 3: /* 00 */ case 3: // 00
digitalWrite(motor_pin_1, LOW); digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW); digitalWrite(motor_pin_2, LOW);
break; break;
@ -224,6 +276,81 @@ void Stepper::stepMotor(int thisStep)
break; break;
} }
} }
if (this->pin_count == 5) {
switch (thisStep) {
case 0: // 01101
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
digitalWrite(motor_pin_5, HIGH);
break;
case 1: // 01001
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
digitalWrite(motor_pin_5, HIGH);
break;
case 2: // 01011
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
digitalWrite(motor_pin_5, HIGH);
break;
case 3: // 01010
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
digitalWrite(motor_pin_5, LOW);
break;
case 4: // 11010
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
digitalWrite(motor_pin_5, LOW);
break;
case 5: // 10010
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
digitalWrite(motor_pin_5, LOW);
break;
case 6: // 10110
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
digitalWrite(motor_pin_5, LOW);
break;
case 7: // 10100
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
digitalWrite(motor_pin_5, LOW);
break;
case 8: // 10101
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
digitalWrite(motor_pin_5, HIGH);
break;
case 9: // 00101
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
digitalWrite(motor_pin_5, HIGH);
break;
}
}
} }
/* /*

View File

@ -1,60 +1,77 @@
/* /*
Stepper.h - - Stepper library for Wiring/Arduino - Version 0.5 * Stepper.h - Stepper library for Wiring/Arduino - Version 0.6
*
Original library (0.1) by Tom Igoe. * Original library (0.1) by Tom Igoe.
Two-wire modifications (0.2) by Sebastian Gassner * Two-wire modifications (0.2) by Sebastian Gassner
Combination version (0.3) by Tom Igoe and David Mellis * 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 * Bug fix for four-wire (0.4) by Tom Igoe, bug fix from Noah Shibley
High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko * High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko
* Five phase five wire (0.6) by Ryan Orendorff
Drives a unipolar or bipolar stepper motor using 2 wires or 4 wires *
* This library is free software; you can redistribute it and/or
When wiring multiple stepper motors to a microcontroller, * modify it under the terms of the GNU Lesser General Public
you quickly run out of output pins, with each motor requiring 4 connections. * License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
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 * This library is distributed in the hope that it will be useful,
control connections can be reduced from 4 to 2. * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
A slightly modified circuit around a Darlington transistor array or an L293 H-bridge * Lesser General Public License for more details.
connects to only 2 microcontroler pins, inverts the signals received, *
and delivers the 4 (2 plus 2 inverted ones) output signals required * You should have received a copy of the GNU Lesser General Public
for driving a stepper motor. Similarly the Arduino motor shields 2 direction pins * License along with this library; if not, write to the Free Software
may be used. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
The sequence of control signals for 4 control wires is as follows: *
* Drives a unipolar, bipolar, or five phase stepper motor.
Step C0 C1 C2 C3 *
1 1 0 1 0 * When wiring multiple stepper motors to a microcontroller, you quickly run
2 0 1 1 0 * out of output pins, with each motor requiring 4 connections.
3 0 1 0 1 *
4 1 0 0 1 * 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
The sequence of controls signals for 2 control wires is as follows * reduced from 4 to 2 for the unipolar and bipolar motors.
(columns C1 and C2 from above): *
* A slightly modified circuit around a Darlington transistor array or an
Step C0 C1 * L293 H-bridge connects to only 2 microcontroler pins, inverts the signals
1 0 1 * received, and delivers the 4 (2 plus 2 inverted ones) output signals
2 1 1 * required for driving a stepper motor. Similarly the Arduino motor shields
3 1 0 * 2 direction pins may be used.
4 0 0 *
* The sequence of control signals for 5 phase, 5 control wires is as follows:
The circuits can be found at *
http://www.arduino.cc/en/Tutorial/Stepper * Step C0 C1 C2 C3 C4
* 1 0 1 1 0 1
This library is free software; you can redistribute it and/or * 2 0 1 0 0 1
modify it under the terms of the GNU Lesser General Public * 3 0 1 0 1 1
License as published by the Free Software Foundation; either * 4 0 1 0 1 0
version 2.1 of the License, or (at your option) any later version. * 5 1 1 0 1 0
* 6 1 0 0 1 0
This library is distributed in the hope that it will be useful, * 7 1 0 1 1 0
but WITHOUT ANY WARRANTY; without even the implied warranty of * 8 1 0 1 0 0
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 9 1 0 1 0 1
Lesser General Public License for more details. * 10 0 0 1 0 1
*
You should have received a copy of the GNU Lesser General Public * The sequence of control signals for 4 control wires is as follows:
License along with this library; if not, write to the Free Software *
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 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 // ensure this library description is only included once
@ -66,7 +83,11 @@ class Stepper {
public: public:
// constructors: // 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);
Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4); Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2,
int motor_pin_3, int motor_pin_4);
Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2,
int motor_pin_3, int motor_pin_4,
int motor_pin_5);
// speed setter method: // speed setter method:
void setSpeed(long whatSpeed); void setSpeed(long whatSpeed);
@ -81,9 +102,9 @@ class Stepper {
int direction; // Direction of rotation int direction; // Direction of rotation
int speed; // Speed in RPMs int speed; // Speed in RPMs
unsigned long step_delay; // delay between steps, in us, based on speed 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 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 pin_count; // how many pins are in use.
int step_number; // which step the motor is on int step_number; // which step the motor is on
// motor pin numbers: // motor pin numbers:
@ -91,6 +112,7 @@ class Stepper {
int motor_pin_2; int motor_pin_2;
int motor_pin_3; int motor_pin_3;
int motor_pin_4; int motor_pin_4;
int motor_pin_5; // Only 5 phase motor
unsigned long last_step_time; // time stamp in us of when the last step was taken unsigned long last_step_time; // time stamp in us of when the last step was taken
}; };