Skip to content

Instantly share code, notes, and snippets.

@bashkirtsevich
Last active January 13, 2017 18:38
Show Gist options
  • Select an option

  • Save bashkirtsevich/29c69727ec5b99f5fff908ad68c8a551 to your computer and use it in GitHub Desktop.

Select an option

Save bashkirtsevich/29c69727ec5b99f5fff908ad68c8a551 to your computer and use it in GitHub Desktop.
Arduino 4-phase step motor
#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);
}
}
#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);
}
#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