00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "WProgram.h"
00049 #include "Stepper.h"
00050
00051
00052
00053
00054
00055 Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)
00056 {
00057 this->step_number = 0;
00058 this->speed = 0;
00059 this->direction = 0;
00060 this->last_step_time = 0;
00061 this->number_of_steps = number_of_steps;
00062
00063
00064 this->motor_pin_1 = motor_pin_1;
00065 this->motor_pin_2 = motor_pin_2;
00066
00067
00068 pinMode(this->motor_pin_1, OUTPUT);
00069 pinMode(this->motor_pin_2, OUTPUT);
00070
00071
00072 this->motor_pin_3 = 0;
00073 this->motor_pin_4 = 0;
00074
00075
00076 this->pin_count = 2;
00077 }
00078
00079
00080
00081
00082
00083
00084
00085 Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4)
00086 {
00087 this->step_number = 0;
00088 this->speed = 0;
00089 this->direction = 0;
00090 this->last_step_time = 0;
00091 this->number_of_steps = number_of_steps;
00092
00093
00094 this->motor_pin_1 = motor_pin_1;
00095 this->motor_pin_2 = motor_pin_2;
00096 this->motor_pin_3 = motor_pin_3;
00097 this->motor_pin_4 = motor_pin_4;
00098
00099
00100 pinMode(this->motor_pin_1, OUTPUT);
00101 pinMode(this->motor_pin_2, OUTPUT);
00102 pinMode(this->motor_pin_3, OUTPUT);
00103 pinMode(this->motor_pin_4, OUTPUT);
00104
00105
00106 this->pin_count = 4;
00107 }
00108
00109
00110
00111
00112
00113 void Stepper::setSpeed(long whatSpeed)
00114 {
00115 this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
00116 }
00117
00118
00119
00120
00121
00122 void Stepper::step(int steps_to_move)
00123 {
00124 int steps_left = abs(steps_to_move);
00125
00126
00127 if (steps_to_move > 0) {this->direction = 1;}
00128 if (steps_to_move < 0) {this->direction = 0;}
00129
00130
00131
00132 while(steps_left > 0) {
00133
00134 if (millis() - this->last_step_time >= this->step_delay) {
00135
00136 this->last_step_time = millis();
00137
00138
00139 if (this->direction == 1) {
00140 this->step_number++;
00141 if (this->step_number == this->number_of_steps) {
00142 this->step_number = 0;
00143 }
00144 }
00145 else {
00146 if (this->step_number == 0) {
00147 this->step_number = this->number_of_steps;
00148 }
00149 this->step_number--;
00150 }
00151
00152 steps_left--;
00153
00154 stepMotor(this->step_number % 4);
00155 }
00156 }
00157 }
00158
00159
00160
00161
00162 void Stepper::stepMotor(int thisStep)
00163 {
00164 if (this->pin_count == 2) {
00165 switch (thisStep) {
00166 case 0:
00167 digitalWrite(motor_pin_1, LOW);
00168 digitalWrite(motor_pin_2, HIGH);
00169 break;
00170 case 1:
00171 digitalWrite(motor_pin_1, HIGH);
00172 digitalWrite(motor_pin_2, HIGH);
00173 break;
00174 case 2:
00175 digitalWrite(motor_pin_1, HIGH);
00176 digitalWrite(motor_pin_2, LOW);
00177 break;
00178 case 3:
00179 digitalWrite(motor_pin_1, LOW);
00180 digitalWrite(motor_pin_2, LOW);
00181 break;
00182 }
00183 }
00184 if (this->pin_count == 4) {
00185 switch (thisStep) {
00186 case 0:
00187 digitalWrite(motor_pin_1, HIGH);
00188 digitalWrite(motor_pin_2, LOW);
00189 digitalWrite(motor_pin_3, HIGH);
00190 digitalWrite(motor_pin_4, LOW);
00191 break;
00192 case 1:
00193 digitalWrite(motor_pin_1, LOW);
00194 digitalWrite(motor_pin_2, HIGH);
00195 digitalWrite(motor_pin_3, HIGH);
00196 digitalWrite(motor_pin_4, LOW);
00197 break;
00198 case 2:
00199 digitalWrite(motor_pin_1, LOW);
00200 digitalWrite(motor_pin_2, HIGH);
00201 digitalWrite(motor_pin_3, LOW);
00202 digitalWrite(motor_pin_4, HIGH);
00203 break;
00204 case 3:
00205 digitalWrite(motor_pin_1, HIGH);
00206 digitalWrite(motor_pin_2, LOW);
00207 digitalWrite(motor_pin_3, LOW);
00208 digitalWrite(motor_pin_4, HIGH);
00209 break;
00210 }
00211 }
00212 }
00213
00214
00215
00216
00217 int Stepper::version(void)
00218 {
00219 return 4;
00220 }