Last active
May 5, 2017 22:47
-
-
Save technobly/8341919 to your computer and use it in GitHub Desktop.
Spark Core Stepper Library
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//-----------------------------------------------// | |
// STEPPER LIBRARY FOR SPARK CORE // | |
//===============================================// | |
// Copy this into a new application at: // | |
// https://www.spark.io/build and go nuts! // | |
//-----------------------------------------------// | |
// Technobly / BDub - Jan 2014 // | |
//===============================================// | |
/* | |
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 | |
/* | |
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" | |
// https://community.sparkdevices.com/t/fix-for-include-arduino-h/953 | |
#define ARDUINO_H | |
#include <stdint.h> | |
#include <stddef.h> | |
#include <stdlib.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; | |
} | |
/* | |
* 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, D0, D1, D2, D3); | |
// 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(A0); | |
// 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment