From 847816739fbb311fd63c8463c5dba611f5fb2457 Mon Sep 17 00:00:00 2001 From: ekozlenko Date: Tue, 26 Nov 2013 09:08:40 -0500 Subject: [PATCH 1/6] Update stepper library: High-speed stepping mod and timer rollover fix When using the stepper library with a 1.8 degrees per step motor, and at high angular speeds, the current Stepper library leads to really loud and jittery rotation. This is due to the fact that the timing is calculated in milliseconds, and the delay length between steps is only 2.5 milliseconds when trying to spin at 120 rpm. Since only integer math is performed, you end up actually bouncing between different step delays, and thus speeds, from step to step instead of giving the motor a constant input. Which causes the motor to freak out. Changing the library to calculate the step delays in micros() solves that problem for any speed you can reasonably demand from your stepper motor. The down side is that the micros() counter rolls over every hour or so, and any move you perform after that point will hang your code. Easy fix for that is to add an || micros() - this->last_step_time < 0 to the while loop if statement in Stepper.cpp. --- libraries/Stepper/src/Stepper.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libraries/Stepper/src/Stepper.cpp b/libraries/Stepper/src/Stepper.cpp index b1cbee6d17c..ad8dc8ee94d 100644 --- a/libraries/Stepper/src/Stepper.cpp +++ b/libraries/Stepper/src/Stepper.cpp @@ -5,6 +5,7 @@ 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 + High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko Drives a unipolar or bipolar stepper motor using 2 wires or 4 wires @@ -18,7 +19,8 @@ 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. + for driving a stepper motor. Similarly the Arduino motor shields 2 direction pins + may be used. The sequence of control signals for 4 control wires is as follows: @@ -70,7 +72,7 @@ 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->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: @@ -100,7 +102,7 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int moto 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->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: @@ -125,7 +127,7 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int moto */ void Stepper::setSpeed(long whatSpeed) { - this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed; + this->step_delay = 60L * 1000L * 1000L / this->number_of_steps / whatSpeed; } /* @@ -144,9 +146,9 @@ void Stepper::step(int steps_to_move) // 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) { + if (micros() - this->last_step_time >= this->step_delay || micros() - this->last_step_time < 0) { // get the timeStamp of when you stepped: - this->last_step_time = millis(); + this->last_step_time = micros(); // increment or decrement the step number, // depending on direction: if (this->direction == 1) { @@ -229,5 +231,5 @@ void Stepper::stepMotor(int thisStep) */ int Stepper::version(void) { - return 4; + return 5; } From caf000b005091a8c484c92e74b0dff43ac88eba2 Mon Sep 17 00:00:00 2001 From: ekozlenko Date: Mon, 2 Dec 2013 13:18:06 -0500 Subject: [PATCH 2/6] Fixed unsigned var and version note --- libraries/Stepper/src/Stepper.cpp | 4 ++-- libraries/Stepper/src/Stepper.h | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/libraries/Stepper/src/Stepper.cpp b/libraries/Stepper/src/Stepper.cpp index ad8dc8ee94d..42babd28703 100644 --- a/libraries/Stepper/src/Stepper.cpp +++ b/libraries/Stepper/src/Stepper.cpp @@ -1,5 +1,5 @@ /* - Stepper.cpp - - Stepper library for Wiring/Arduino - Version 0.4 + Stepper.cpp - - Stepper library for Wiring/Arduino - Version 0.5 Original library (0.1) by Tom Igoe. Two-wire modifications (0.2) by Sebastian Gassner @@ -146,7 +146,7 @@ void Stepper::step(int steps_to_move) // decrement the number of steps, moving one step each time: while(steps_left > 0) { // move only if the appropriate delay has passed: - if (micros() - this->last_step_time >= this->step_delay || micros() - this->last_step_time < 0) { + if (micros() - this->last_step_time >= this->step_delay || micros() < this->last_step_time) { // get the timeStamp of when you stepped: this->last_step_time = micros(); // increment or decrement the step number, diff --git a/libraries/Stepper/src/Stepper.h b/libraries/Stepper/src/Stepper.h index e0441ffe738..810f89c8aed 100644 --- a/libraries/Stepper/src/Stepper.h +++ b/libraries/Stepper/src/Stepper.h @@ -1,10 +1,11 @@ /* - Stepper.h - - Stepper library for Wiring/Arduino - Version 0.4 + Stepper.h - - Stepper library for Wiring/Arduino - Version 0.5 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 + High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko Drives a unipolar or bipolar stepper motor using 2 wires or 4 wires @@ -18,7 +19,8 @@ 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. + for driving a stepper motor. Similarly the Arduino motor shields 2 direction pins + may be used. The sequence of control signals for 4 control wires is as follows: @@ -79,7 +81,7 @@ class Stepper { int direction; // Direction of rotation int speed; // Speed in RPMs - unsigned long step_delay; // delay between steps, in ms, based on speed + unsigned long step_delay; // delay between steps, in us, 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 @@ -90,7 +92,7 @@ class Stepper { int motor_pin_3; int motor_pin_4; - long last_step_time; // time stamp in ms of when the last step was taken + unsigned long last_step_time; // time stamp in us of when the last step was taken }; #endif From 50ca5d8f75460fa1faf5946b0e8c1448266b2663 Mon Sep 17 00:00:00 2001 From: Ryan Orendorff Date: Tue, 7 Feb 2012 05:33:14 +0000 Subject: [PATCH 3/6] Stepper Library supports 5 phase, 5 wire motors. --- libraries/Stepper/src/Stepper.cpp | 371 ++++++++++++++++++++---------- libraries/Stepper/src/Stepper.h | 156 +++++++------ 2 files changed, 338 insertions(+), 189 deletions(-) diff --git a/libraries/Stepper/src/Stepper.cpp b/libraries/Stepper/src/Stepper.cpp index 42babd28703..0c089c36ca2 100644 --- a/libraries/Stepper/src/Stepper.cpp +++ b/libraries/Stepper/src/Stepper.cpp @@ -1,65 +1,79 @@ /* - Stepper.cpp - - Stepper library for Wiring/Arduino - Version 0.5 - - 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 - High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko - - 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. Similarly the Arduino motor shields 2 direction pins - may be used. - - 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 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - + * Stepper.cpp - Stepper library for Wiring/Arduino - Version 0.6 + * + * 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 + * High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko + * Five phase five wire (0.6) by Ryan Orendorff + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + * Drives a unipolar, bipolar, or five phase stepper motor. + * + * 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 for the unipolar and bipolar motors. + * + * 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. Similarly the Arduino motor shields + * 2 direction pins may be used. + * + * The sequence of control signals for 5 phase, 5 control wires is as follows: + * + * Step C0 C1 C2 C3 C4 + * 1 0 1 1 0 1 + * 2 0 1 0 0 1 + * 3 0 1 0 1 1 + * 4 0 1 0 1 0 + * 5 1 1 0 1 0 + * 6 1 0 0 1 0 + * 7 1 0 1 1 0 + * 8 1 0 1 0 0 + * 9 1 0 1 0 1 + * 10 0 0 1 0 1 + * + * 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" @@ -69,12 +83,12 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ 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->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 - + 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; @@ -82,11 +96,12 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int 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: + + // When there are only 2 pins, set the others to 0: this->motor_pin_3 = 0; this->motor_pin_4 = 0; - + this->motor_pin_5 = 0; + // pin_count is used by the stepMotor() method: this->pin_count = 2; } @@ -96,15 +111,15 @@ Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_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) +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->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 - + 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; @@ -117,32 +132,66 @@ 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_4, OUTPUT); - // pin_count is used by the stepMotor() method: - this->pin_count = 4; + // When there are 4 pins, set the others to 0: + this->motor_pin_5 = 0; + + // pin_count is used by the stepMotor() method: + 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) { this->step_delay = 60L * 1000L * 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. + * 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: @@ -156,8 +205,8 @@ void Stepper::step(int steps_to_move) if (this->step_number == this->number_of_steps) { this->step_number = 0; } - } - else { + } + else { if (this->step_number == 0) { this->step_number = this->number_of_steps; } @@ -165,8 +214,11 @@ void Stepper::step(int steps_to_move) } // decrement the steps left: steps_left--; - // step the motor to step number 0, 1, 2, or 3: - stepMotor(this->step_number % 4); + // 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); } } } @@ -178,51 +230,126 @@ 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + case 3: //1001 + digitalWrite(motor_pin_1, HIGH); + digitalWrite(motor_pin_2, LOW); + digitalWrite(motor_pin_3, LOW); + digitalWrite(motor_pin_4, HIGH); 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; + } } } diff --git a/libraries/Stepper/src/Stepper.h b/libraries/Stepper/src/Stepper.h index 810f89c8aed..7664969be46 100644 --- a/libraries/Stepper/src/Stepper.h +++ b/libraries/Stepper/src/Stepper.h @@ -1,61 +1,78 @@ /* - Stepper.h - - Stepper library for Wiring/Arduino - Version 0.5 - - 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 - High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko - - 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. Similarly the Arduino motor shields 2 direction pins - may be used. - - 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 - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * Stepper.h - Stepper library for Wiring/Arduino - Version 0.6 + * + * 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 + * High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko + * Five phase five wire (0.6) by Ryan Orendorff + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * + * Drives a unipolar, bipolar, or five phase stepper motor. + * + * 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 for the unipolar and bipolar motors. + * + * 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. Similarly the Arduino motor shields + * 2 direction pins may be used. + * + * The sequence of control signals for 5 phase, 5 control wires is as follows: + * + * Step C0 C1 C2 C3 C4 + * 1 0 1 1 0 1 + * 2 0 1 0 0 1 + * 3 0 1 0 1 1 + * 4 0 1 0 1 0 + * 5 1 1 0 1 0 + * 6 1 0 0 1 0 + * 7 1 0 1 1 0 + * 8 1 0 1 0 0 + * 9 1 0 1 0 1 + * 10 0 0 1 0 1 + * + * 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 @@ -66,7 +83,11 @@ 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); + 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: void setSpeed(long whatSpeed); @@ -78,21 +99,22 @@ class Stepper { private: void stepMotor(int this_step); - - int direction; // Direction of rotation - int speed; // Speed in RPMs - unsigned long step_delay; // delay between steps, in us, based on speed + + 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 - + int pin_count; // how many pins are in use. + 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; - - unsigned long last_step_time; // time stamp in us of when the last step was taken + int motor_pin_5; // Only 5 phase motor + + unsigned long last_step_time; // time stamp in us of when the last step was taken }; #endif From 0546bf04e0cd48b067051a622840b559b30cb0b3 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 27 May 2015 17:15:32 +0200 Subject: [PATCH 4/6] Stepper library: updated version --- libraries/Stepper/library.properties | 2 +- libraries/Stepper/src/Stepper.cpp | 15 ++++++++------- libraries/Stepper/src/Stepper.h | 17 +++++++++-------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/libraries/Stepper/library.properties b/libraries/Stepper/library.properties index f1347c91810..ea47a87f6f4 100644 --- a/libraries/Stepper/library.properties +++ b/libraries/Stepper/library.properties @@ -1,5 +1,5 @@ name=Stepper -version=1.0.2 +version=1.1.0 author=Arduino maintainer=Arduino sentence=Allows Arduino boards to control a variety of stepper motors. For all Arduino boards. diff --git a/libraries/Stepper/src/Stepper.cpp b/libraries/Stepper/src/Stepper.cpp index 0c089c36ca2..57a7fefabaf 100644 --- a/libraries/Stepper/src/Stepper.cpp +++ b/libraries/Stepper/src/Stepper.cpp @@ -1,12 +1,13 @@ /* - * Stepper.cpp - Stepper library for Wiring/Arduino - Version 0.6 + * Stepper.cpp - Stepper library for Wiring/Arduino - Version 1.1.0 * - * 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 - * High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko - * Five phase five wire (0.6) by Ryan Orendorff + * 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 + * High-speed stepping mod by Eugene Kozlenko + * Timer rollover fix by Eugene Kozlenko + * Five phase five wire (1.1.0) by Ryan Orendorff * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/libraries/Stepper/src/Stepper.h b/libraries/Stepper/src/Stepper.h index 7664969be46..6c875883a88 100644 --- a/libraries/Stepper/src/Stepper.h +++ b/libraries/Stepper/src/Stepper.h @@ -1,12 +1,13 @@ /* - * Stepper.h - Stepper library for Wiring/Arduino - Version 0.6 - * - * 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 - * High-speed stepping mod and timer rollover fix (0.5) by Eugene Kozlenko - * Five phase five wire (0.6) by Ryan Orendorff + * Stepper.h - Stepper library for Wiring/Arduino - Version 1.1.0 + * + * 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 + * High-speed stepping mod by Eugene Kozlenko + * Timer rollover fix by Eugene Kozlenko + * Five phase five wire (1.1.0) by Ryan Orendorff * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public From 1064554b87274f4136460312286ff89b3b94f034 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 28 May 2015 10:28:27 +0200 Subject: [PATCH 5/6] Stepper: optimization on timing calculations micros() is now called only once per cycle (instead of 3). The rollover check is superflous because the "last_step_time" field is unsigned. --- libraries/Stepper/src/Stepper.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/Stepper/src/Stepper.cpp b/libraries/Stepper/src/Stepper.cpp index 57a7fefabaf..814149915b0 100644 --- a/libraries/Stepper/src/Stepper.cpp +++ b/libraries/Stepper/src/Stepper.cpp @@ -195,10 +195,11 @@ void Stepper::step(int steps_to_move) // decrement the number of steps, moving one step each time: while(steps_left > 0) { + unsigned long now = micros(); // move only if the appropriate delay has passed: - if (micros() - this->last_step_time >= this->step_delay || micros() < this->last_step_time) { + if (now - this->last_step_time >= this->step_delay) { // get the timeStamp of when you stepped: - this->last_step_time = micros(); + this->last_step_time = now; // increment or decrement the step number, // depending on direction: if (this->direction == 1) { From f2a8f517f0b999c903ba88f30e17ee101729e47b Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 28 May 2015 10:53:56 +0200 Subject: [PATCH 6/6] Stepper: fixed indentation --- libraries/Stepper/src/Stepper.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/libraries/Stepper/src/Stepper.cpp b/libraries/Stepper/src/Stepper.cpp index 814149915b0..03d635fadb9 100644 --- a/libraries/Stepper/src/Stepper.cpp +++ b/libraries/Stepper/src/Stepper.cpp @@ -189,26 +189,30 @@ 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;} + 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) { - unsigned long now = micros(); - // move only if the appropriate delay has passed: - if (now - this->last_step_time >= this->step_delay) { + while (steps_left > 0) + { + unsigned long now = micros(); + // move only if the appropriate delay has passed: + if (now - this->last_step_time >= this->step_delay) + { // get the timeStamp of when you stepped: this->last_step_time = now; // increment or decrement the step number, // depending on direction: - if (this->direction == 1) { + if (this->direction == 1) + { this->step_number++; if (this->step_number == this->number_of_steps) { this->step_number = 0; } } - else { + else + { if (this->step_number == 0) { this->step_number = this->number_of_steps; }