From 59cb3071fc15d25edc839ad139e95763351753ae Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Thu, 9 May 2019 13:44:43 +0300 Subject: [PATCH] timer-driven stepper driver --- Firmware/EggbotWireless/.gitignore | 3 +- Firmware/EggbotWireless/include/Stepper.h | 12 +- .../EggbotWireless/include/StepperTimer.h | 11 + Firmware/EggbotWireless/platformio.ini | 1 + Firmware/EggbotWireless/src/Stepper.cpp | 233 ++++++++++-------- Firmware/EggbotWireless/src/StepperTimer.cpp | 22 ++ Firmware/EggbotWireless/src/main.cpp | 15 +- 7 files changed, 178 insertions(+), 119 deletions(-) create mode 100644 Firmware/EggbotWireless/include/StepperTimer.h create mode 100644 Firmware/EggbotWireless/src/StepperTimer.cpp diff --git a/Firmware/EggbotWireless/.gitignore b/Firmware/EggbotWireless/.gitignore index 9b13d3f..a4976f5 100644 --- a/Firmware/EggbotWireless/.gitignore +++ b/Firmware/EggbotWireless/.gitignore @@ -5,4 +5,5 @@ .vscode/c_cpp_properties.json .vscode/launch.json .history -.vscode \ No newline at end of file +.vscode +.directory \ No newline at end of file diff --git a/Firmware/EggbotWireless/include/Stepper.h b/Firmware/EggbotWireless/include/Stepper.h index 94537c6..c1c5962 100644 --- a/Firmware/EggbotWireless/include/Stepper.h +++ b/Firmware/EggbotWireless/include/Stepper.h @@ -3,20 +3,22 @@ class Stepper { private: - unsigned int stepsPerRevolution; + int stepsPerRevolution; int pin1; int pin2; int pin3; int pin4; - int speedDelay; + int curStep = 1; + int remainingSteps; + bool direction; void clockwise(); void counterClockwise(); public: - Stepper(int pin1, int pin2, int pin3, int pin4, int stepsPerRevolution, int rpm); - ~Stepper(); + Stepper(int pin1, int pin2, int pin3, int pin4, int stepsPerRevolution); void step(int steps); - void move(float degrees); + void rotate(float degrees); + void doStep(); }; #endif \ No newline at end of file diff --git a/Firmware/EggbotWireless/include/StepperTimer.h b/Firmware/EggbotWireless/include/StepperTimer.h new file mode 100644 index 0000000..ee8e10d --- /dev/null +++ b/Firmware/EggbotWireless/include/StepperTimer.h @@ -0,0 +1,11 @@ +#include +#include "Stepper.h" + +#ifndef STEPPER_TIMER_H +#define STEPPER_TIMER_H + +void stepperTimerInit(int rpm, int stepsPerRevolution); +void stepperTimerSetStepper(int num, Stepper *stepper); +void stepperTimerTick(); + +#endif diff --git a/Firmware/EggbotWireless/platformio.ini b/Firmware/EggbotWireless/platformio.ini index 4fa4a6d..c85ff83 100644 --- a/Firmware/EggbotWireless/platformio.ini +++ b/Firmware/EggbotWireless/platformio.ini @@ -12,3 +12,4 @@ platform = espressif8266 board = d1_mini framework = arduino +monitor_speed = 115200 \ No newline at end of file diff --git a/Firmware/EggbotWireless/src/Stepper.cpp b/Firmware/EggbotWireless/src/Stepper.cpp index b2d74f1..eea3178 100644 --- a/Firmware/EggbotWireless/src/Stepper.cpp +++ b/Firmware/EggbotWireless/src/Stepper.cpp @@ -2,107 +2,120 @@ #include void Stepper::clockwise() { - digitalWrite(pin4, HIGH); - digitalWrite(pin3, LOW); - digitalWrite(pin2, LOW); - digitalWrite(pin1, LOW); - delay(speedDelay); - - digitalWrite(pin4, HIGH); - digitalWrite(pin3, HIGH); - digitalWrite(pin2, LOW); - digitalWrite(pin1, LOW); - delay(speedDelay); - - digitalWrite(pin4, LOW); - digitalWrite(pin3, HIGH); - digitalWrite(pin2, LOW); - digitalWrite(pin1, LOW); - delay(speedDelay); - - digitalWrite(pin4, LOW); - digitalWrite(pin3, HIGH); - digitalWrite(pin2, HIGH); - digitalWrite(pin1, LOW); - delay(speedDelay); - - digitalWrite(pin4, LOW); - digitalWrite(pin3, LOW); - digitalWrite(pin2, HIGH); - digitalWrite(pin1, LOW); - delay(speedDelay); - - digitalWrite(pin4, LOW); - digitalWrite(pin3, LOW); - digitalWrite(pin2, HIGH); - digitalWrite(pin1, HIGH); - delay(speedDelay); - - digitalWrite(pin4, LOW); - digitalWrite(pin3, LOW); - digitalWrite(pin2, LOW); - digitalWrite(pin1, HIGH); - delay(speedDelay); - - digitalWrite(pin4, HIGH); - digitalWrite(pin3, LOW); - digitalWrite(pin2, LOW); - digitalWrite(pin1, HIGH); - delay(speedDelay); + switch (curStep) { + case 1: + digitalWrite(pin4, HIGH); + digitalWrite(pin3, LOW); + digitalWrite(pin2, LOW); + digitalWrite(pin1, LOW); + break; + case 2: + digitalWrite(pin4, HIGH); + digitalWrite(pin3, HIGH); + digitalWrite(pin2, LOW); + digitalWrite(pin1, LOW); + break; + case 3: + digitalWrite(pin4, LOW); + digitalWrite(pin3, HIGH); + digitalWrite(pin2, LOW); + digitalWrite(pin1, LOW); + break; + case 4: + digitalWrite(pin4, LOW); + digitalWrite(pin3, HIGH); + digitalWrite(pin2, HIGH); + digitalWrite(pin1, LOW); + break; + case 5: + digitalWrite(pin4, LOW); + digitalWrite(pin3, LOW); + digitalWrite(pin2, HIGH); + digitalWrite(pin1, LOW); + break; + case 6: + digitalWrite(pin4, LOW); + digitalWrite(pin3, LOW); + digitalWrite(pin2, HIGH); + digitalWrite(pin1, HIGH); + break; + case 7: + digitalWrite(pin4, LOW); + digitalWrite(pin3, LOW); + digitalWrite(pin2, LOW); + digitalWrite(pin1, HIGH); + break; + case 8: + digitalWrite(pin4, HIGH); + digitalWrite(pin3, LOW); + digitalWrite(pin2, LOW); + digitalWrite(pin1, HIGH); + } + if (curStep == 8) { + curStep = 1; + } else { + curStep++; + } } void Stepper::counterClockwise() { - digitalWrite(pin1, HIGH); - digitalWrite(pin2, LOW); - digitalWrite(pin3, LOW); - digitalWrite(pin4, LOW); - delay(speedDelay); - - digitalWrite(pin1, HIGH); - digitalWrite(pin2, HIGH); - digitalWrite(pin3, LOW); - digitalWrite(pin4, LOW); - delay(speedDelay); - - digitalWrite(pin1, LOW); - digitalWrite(pin2, HIGH); - digitalWrite(pin3, LOW); - digitalWrite(pin4, LOW); - delay(speedDelay); - - digitalWrite(pin1, LOW); - digitalWrite(pin2, HIGH); - digitalWrite(pin3, HIGH); - digitalWrite(pin4, LOW); - delay(speedDelay); - - digitalWrite(pin1, LOW); - digitalWrite(pin2, LOW); - digitalWrite(pin3, HIGH); - digitalWrite(pin4, LOW); - delay(speedDelay); - - digitalWrite(pin1, LOW); - digitalWrite(pin2, LOW); - digitalWrite(pin3, HIGH); - digitalWrite(pin4, HIGH); - delay(speedDelay); - - digitalWrite(pin1, LOW); - digitalWrite(pin2, LOW); - digitalWrite(pin3, LOW); - digitalWrite(pin4, HIGH); - delay(speedDelay); - - digitalWrite(pin1, HIGH); - digitalWrite(pin2, LOW); - digitalWrite(pin3, LOW); - digitalWrite(pin4, HIGH); - delay(speedDelay); + switch (curStep) { + case 1: + digitalWrite(pin1, HIGH); + digitalWrite(pin2, LOW); + digitalWrite(pin3, LOW); + digitalWrite(pin4, LOW); + break; + case 2: + digitalWrite(pin1, HIGH); + digitalWrite(pin2, HIGH); + digitalWrite(pin3, LOW); + digitalWrite(pin4, LOW); + break; + case 3: + digitalWrite(pin1, LOW); + digitalWrite(pin2, HIGH); + digitalWrite(pin3, LOW); + digitalWrite(pin4, LOW); + break; + case 4: + digitalWrite(pin1, LOW); + digitalWrite(pin2, HIGH); + digitalWrite(pin3, HIGH); + digitalWrite(pin4, LOW); + break; + case 5: + digitalWrite(pin1, LOW); + digitalWrite(pin2, LOW); + digitalWrite(pin3, HIGH); + digitalWrite(pin4, LOW); + break; + case 6: + digitalWrite(pin1, LOW); + digitalWrite(pin2, LOW); + digitalWrite(pin3, HIGH); + digitalWrite(pin4, HIGH); + break; + case 7: + digitalWrite(pin1, LOW); + digitalWrite(pin2, LOW); + digitalWrite(pin3, LOW); + digitalWrite(pin4, HIGH); + break; + case 8: + digitalWrite(pin1, HIGH); + digitalWrite(pin2, LOW); + digitalWrite(pin3, LOW); + digitalWrite(pin4, HIGH); + } + if (curStep == 8) { + curStep = 1; + } else { + curStep++; + } } -Stepper::Stepper(int pin1, int pin2, int pin3, int pin4, int stepsPerRevolution, - int rpm) +Stepper::Stepper(int pin1, int pin2, int pin3, int pin4, int stepsPerRevolution) : pin1(pin1), pin2(pin2), pin3(pin3), @@ -112,26 +125,30 @@ Stepper::Stepper(int pin1, int pin2, int pin3, int pin4, int stepsPerRevolution, pinMode(pin2, OUTPUT); pinMode(pin3, OUTPUT); pinMode(pin4, OUTPUT); - - speedDelay = 60 * 1000 / (rpm * stepsPerRevolution); } -Stepper::~Stepper() {} -void Stepper::step(int steps) { - int halfsteps = steps / 8; - if (halfsteps > 0) { - for (int i = 0; i < halfsteps; i++) { +void Stepper::doStep() { + if(remainingSteps > 0) { + if(direction){ clockwise(); - } - } else if (halfsteps < 0) { - halfsteps = abs(halfsteps); - for (int i = 0; i < halfsteps; i++) { + } else { counterClockwise(); } + remainingSteps--; } } -void Stepper::move(float degrees) { +void Stepper::step(int steps) { + if (steps > 0) { + direction = true; + remainingSteps = steps; + } else { + direction = false; + remainingSteps = abs(steps); + } +} + +void Stepper::rotate(float degrees) { int steps = (degrees * stepsPerRevolution) / 360; step(steps); } \ No newline at end of file diff --git a/Firmware/EggbotWireless/src/StepperTimer.cpp b/Firmware/EggbotWireless/src/StepperTimer.cpp new file mode 100644 index 0000000..0c59e81 --- /dev/null +++ b/Firmware/EggbotWireless/src/StepperTimer.cpp @@ -0,0 +1,22 @@ +#include "StepperTimer.h" +#include "Stepper.h" + +int speedDelay; +Ticker stepperTicker; +Stepper *steppers[2]; + +void stepperTimerInit(int rpm, int stepsPerRevolution) +{ + speedDelay = 60 * 1000 / (rpm * stepsPerRevolution); + stepperTicker.attach_ms(speedDelay, stepperTimerTick); +} + +void stepperTimerSetStepper(int num, Stepper *stepper) { + steppers[num] = stepper; +} + +void stepperTimerTick() { + for (int i = 0; i < 2; i++) { + steppers[i]->doStep(); + } +} \ No newline at end of file diff --git a/Firmware/EggbotWireless/src/main.cpp b/Firmware/EggbotWireless/src/main.cpp index 53a9efd..606cf4d 100644 --- a/Firmware/EggbotWireless/src/main.cpp +++ b/Firmware/EggbotWireless/src/main.cpp @@ -1,16 +1,21 @@ #include -#include "Stepper.h" #include "Pen.h" +#include "Stepper.h" +#include "StepperTimer.h" + +#define STEPS_PER_REVOLUTION 4076 + +Stepper eggStepper(D1, D2, D3, D4, STEPS_PER_REVOLUTION); +Stepper servoStepper(D5, D6, D7, D8, STEPS_PER_REVOLUTION); -Stepper eggStepper(D1, D2, D3, D4, 4076, 6); -Stepper servoStepper(D5, D6, D7, D8, 4076, 6); Pen pen(D0, 180, 80); void setup() { Serial.begin(115200); + stepperTimerSetStepper(0, &eggStepper); + stepperTimerSetStepper(1, &servoStepper); + stepperTimerInit(6, STEPS_PER_REVOLUTION); } void loop() { - Serial.print("Hello!\n"); - delay(1000); } \ No newline at end of file