timer-driven stepper driver

This commit is contained in:
2019-05-09 13:44:43 +03:00
parent d2d0ed0c3c
commit 59cb3071fc
7 changed files with 178 additions and 119 deletions

View File

@@ -5,4 +5,5 @@
.vscode/c_cpp_properties.json
.vscode/launch.json
.history
.vscode
.vscode
.directory

View File

@@ -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

View File

@@ -0,0 +1,11 @@
#include <Ticker.h>
#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

View File

@@ -12,3 +12,4 @@
platform = espressif8266
board = d1_mini
framework = arduino
monitor_speed = 115200

View File

@@ -2,107 +2,120 @@
#include <Arduino.h>
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);
}

View File

@@ -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();
}
}

View File

@@ -1,16 +1,21 @@
#include <Arduino.h>
#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);
}