2023-03-27 14:17:27 +00:00
|
|
|
|
|
|
|
#include "IteadDualStepperShield.h"
|
|
|
|
|
|
|
|
IteadDualStepperShield::IteadDualStepperShield () {}
|
|
|
|
|
|
|
|
void IteadDualStepperShield::setup () {
|
|
|
|
pinMode(_directionA, OUTPUT);
|
|
|
|
pinMode(_directionB, OUTPUT);
|
|
|
|
pinMode(_stepA, OUTPUT);
|
|
|
|
pinMode(_stepB, OUTPUT);
|
|
|
|
setDir(0, 1);
|
|
|
|
setDir(1, 1);
|
2023-08-30 05:15:38 +00:00
|
|
|
pinMode(_settingsA1, OUTPUT);
|
|
|
|
pinMode(_settingsA2, OUTPUT);
|
|
|
|
pinMode(_settingsB1, OUTPUT);
|
|
|
|
pinMode(_settingsB2, OUTPUT);
|
|
|
|
setStepperMode(0, 1);
|
|
|
|
setStepperMode(1, 1);
|
2023-03-27 14:17:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void IteadDualStepperShield::setDir (uint8_t motor, uint8_t dir) {
|
|
|
|
if (motor == 0) {
|
|
|
|
directionA = dir;
|
|
|
|
digitalWrite(_directionA, directionA > 0 ? HIGH : LOW);
|
|
|
|
} else if (motor == 1) {
|
|
|
|
directionB = dir;
|
|
|
|
digitalWrite(_directionB, directionB > 0 ? HIGH : LOW);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void IteadDualStepperShield::setSpeed (uint8_t motor, uint16_t rpm) {
|
|
|
|
uint32_t usPerStep = 60000000 / ((uint32_t) revsteps * (uint32_t) rpm);
|
|
|
|
if (motor == 0) {
|
|
|
|
_usStepA = usPerStep;
|
|
|
|
} else if (motor == 1) {
|
|
|
|
_usStepB = usPerStep;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void IteadDualStepperShield::_micro (uint8_t motor) {
|
|
|
|
uint8_t stepPin = motor == 0 ? _stepA : _stepB;
|
|
|
|
uint32_t usStep = motor == 0 ? _usStepA : _usStepB;
|
|
|
|
digitalWrite(stepPin, HIGH);
|
|
|
|
delayMicroseconds(usStep);
|
|
|
|
digitalWrite(stepPin, LOW);
|
|
|
|
delayMicroseconds(usStep);
|
|
|
|
}
|
|
|
|
|
|
|
|
//full
|
|
|
|
void IteadDualStepperShield::_single (uint8_t motor) {
|
|
|
|
uint8_t stepPin = motor == 0 ? _stepA : _stepB;
|
|
|
|
uint32_t usStep = motor == 0 ? _usStepA : _usStepB;
|
2023-08-30 14:52:23 +00:00
|
|
|
uint8_t mode = motor == 0 ? _modeA : _modeB;
|
|
|
|
for (uint8_t i = 0; i < mode; i++) {
|
2023-03-27 14:17:27 +00:00
|
|
|
digitalWrite(stepPin, HIGH);
|
|
|
|
delayMicroseconds(usStep);
|
|
|
|
digitalWrite(stepPin, LOW);
|
|
|
|
delayMicroseconds(usStep);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void IteadDualStepperShield::_both () {
|
|
|
|
for (uint8_t i = 0; i < _microsteps; i++) {
|
|
|
|
digitalWrite(_stepA, HIGH);
|
|
|
|
digitalWrite(_stepB, HIGH);
|
|
|
|
delayMicroseconds(_usStepA);
|
|
|
|
digitalWrite(_stepA, LOW);
|
|
|
|
digitalWrite(_stepB, LOW);
|
|
|
|
delayMicroseconds(_usStepA);
|
|
|
|
}
|
|
|
|
}
|
2023-08-25 16:34:21 +00:00
|
|
|
void IteadDualStepperShield::step (uint8_t motor, uint64_t steps, uint8_t dir) {
|
2023-03-27 14:17:27 +00:00
|
|
|
uint8_t stepPin = motor == 0 ? _stepA : _stepB;
|
|
|
|
setDir(motor, dir);
|
|
|
|
for (int i = 0; i < steps; i++) {
|
|
|
|
_single(stepPin);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void IteadDualStepperShield::onestep (uint8_t motor, uint8_t dir) {
|
|
|
|
uint8_t stepPin = motor == 0 ? _stepA : _stepB;
|
|
|
|
setDir(motor, dir);
|
|
|
|
_single(stepPin);
|
|
|
|
}
|
|
|
|
|
2023-08-25 16:34:21 +00:00
|
|
|
void IteadDualStepperShield::stepBoth (uint64_t steps) {
|
2023-03-27 14:17:27 +00:00
|
|
|
for (int i = 0; i < steps; i++) {
|
|
|
|
_both();
|
|
|
|
}
|
2023-08-30 05:15:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void IteadDualStepperShield::setStepperMode (uint8_t motor, uint8_t mode) {
|
|
|
|
uint8_t pin1 = motor == 0 ? _settingsA1 : _settingsB1;
|
|
|
|
uint8_t pin2 = motor == 0 ? _settingsA2 : _settingsB2;
|
|
|
|
switch (mode) {
|
|
|
|
case 1 :
|
|
|
|
digitalWrite(pin1, LOW);
|
|
|
|
digitalWrite(pin2, LOW);
|
|
|
|
break;
|
|
|
|
case 2 :
|
|
|
|
digitalWrite(pin1, HIGH);
|
|
|
|
digitalWrite(pin2, LOW);
|
|
|
|
break;
|
|
|
|
case 4 :
|
|
|
|
digitalWrite(pin1, LOW);
|
|
|
|
digitalWrite(pin2, HIGH);
|
|
|
|
break;
|
|
|
|
case 8 :
|
|
|
|
digitalWrite(pin1, HIGH);
|
|
|
|
digitalWrite(pin2, HIGH);
|
|
|
|
break;
|
|
|
|
}
|
2023-03-27 14:17:27 +00:00
|
|
|
}
|