Last active
January 13, 2017 18:38
-
-
Save bashkirtsevich/29c69727ec5b99f5fff908ad68c8a551 to your computer and use it in GitHub Desktop.
Arduino 4-phase step motor
This file contains hidden or 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
| #include "step_motor.h" | |
| #define STEP_INTERVAL 2000 | |
| #define STEP_DELAY 0 | |
| #define STEPS 48*1 | |
| int inSize = 0; // Переменная которая будет содержать размер буфера | |
| char str[128]; // Так как типа string тут нет, будем использовать массив символов | |
| bool active; | |
| StepMotor stepmotor(2, 3, 4, 5); | |
| void setup(){ | |
| Serial.begin(9600); // Открываем порт с скоростью передачи в 9600 бод(бит/с) | |
| } | |
| void loop(){ | |
| inSize=0; // Сбрасываем переменную | |
| memset(str, '\0', 128); // Очищаем массив | |
| if(Serial.available() > 0){ | |
| delay(200); // Ждем, для того, чтобы пришли все данные | |
| inSize = Serial.available(); // Получаем длину строки и записываем ее в переменную | |
| for (int i = 0; i < inSize; i++) | |
| str[i] = Serial.read(); // Читаем каждый символ, и пишем его в массив | |
| if (strcmp(str, "spin") == 0){ | |
| Serial.println("Start spinning"); | |
| active = true; | |
| } else { | |
| Serial.println("Stop spinning"); | |
| active = false; | |
| } | |
| } | |
| if (active) { | |
| stepmotor.make_steps(STEPS, STEP_INTERVAL, STEP_DELAY); | |
| delay(1000); | |
| stepmotor.make_steps(STEPS * -1, STEP_INTERVAL, STEP_DELAY); | |
| delay(1000); | |
| } | |
| } |
This file contains hidden or 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
| #include "Arduino.h" | |
| #include "step_motor.h" | |
| StepMotor::StepMotor(int motor_pin_1, int motor_pin_2, | |
| int motor_pin_3, int motor_pin_4) | |
| { | |
| 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; | |
| pinMode(this->motor_pin_1, OUTPUT); | |
| pinMode(this->motor_pin_2, OUTPUT); | |
| pinMode(this->motor_pin_3, OUTPUT); | |
| pinMode(this->motor_pin_4, OUTPUT); | |
| this->reset_pins(); | |
| } | |
| void StepMotor::make_steps(int number_of_steps, unsigned long delay_mcs, | |
| unsigned long delay_between_steps_mcs) | |
| { | |
| int steps_left = abs(number_of_steps); | |
| int direction = number_of_steps > 0 ? 1 : -1; | |
| int curr_step = number_of_steps > 0 ? 0 : steps_left; | |
| while (steps_left > 0) { | |
| curr_step += direction; | |
| steps_left -= 1; | |
| this->next_step(curr_step % 4); | |
| if (delay_between_steps_mcs > 0) { | |
| this->loop_delay_mcs(delay_between_steps_mcs); | |
| this->reset_pins(); | |
| } | |
| this->loop_delay_mcs(delay_mcs - delay_between_steps_mcs); | |
| } | |
| this->reset_pins(); | |
| } | |
| void StepMotor::next_step(int thisStep) | |
| { | |
| switch (thisStep) { | |
| case 0: // 1010 | |
| digitalWrite(this->motor_pin_1, HIGH); | |
| digitalWrite(this->motor_pin_2, LOW); | |
| digitalWrite(this->motor_pin_3, HIGH); | |
| digitalWrite(this->motor_pin_4, LOW); | |
| break; | |
| case 1: // 0110 | |
| digitalWrite(this->motor_pin_1, LOW); | |
| digitalWrite(this->motor_pin_2, HIGH); | |
| digitalWrite(this->motor_pin_3, HIGH); | |
| digitalWrite(this->motor_pin_4, LOW); | |
| break; | |
| case 2: //0101 | |
| digitalWrite(this->motor_pin_1, LOW); | |
| digitalWrite(this->motor_pin_2, HIGH); | |
| digitalWrite(this->motor_pin_3, LOW); | |
| digitalWrite(this->motor_pin_4, HIGH); | |
| break; | |
| case 3: //1001 | |
| digitalWrite(this->motor_pin_1, HIGH); | |
| digitalWrite(this->motor_pin_2, LOW); | |
| digitalWrite(this->motor_pin_3, LOW); | |
| digitalWrite(this->motor_pin_4, HIGH); | |
| break; | |
| } | |
| } | |
| void StepMotor::reset_pins() | |
| { | |
| digitalWrite(this->motor_pin_1, LOW); | |
| digitalWrite(this->motor_pin_2, LOW); | |
| digitalWrite(this->motor_pin_3, LOW); | |
| digitalWrite(this->motor_pin_4, LOW); | |
| } | |
| void StepMotor::loop_delay_mcs(unsigned long mcs) | |
| { | |
| unsigned long then = micros(); | |
| unsigned long delta = 0; | |
| do { | |
| delta = micros() - then; | |
| } while (delta < mcs); | |
| } |
This file contains hidden or 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
| #ifndef step_motor_h | |
| #define step_motor_h | |
| class StepMotor { | |
| public: | |
| StepMotor(int motor_pin_1, int motor_pin_2, | |
| int motor_pin_3, int motor_pin_4); | |
| void make_steps(int number_of_steps, unsigned long delay_msc, | |
| unsigned long delay_between_steps_mcs); | |
| private: | |
| void next_step(int this_step); | |
| void reset_pins(); | |
| void loop_delay_mcs(unsigned long mcs); | |
| int motor_pin_1; | |
| int motor_pin_2; | |
| int motor_pin_3; | |
| int motor_pin_4; | |
| }; | |
| #endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment