/// Mcopy Projector Class #include "McopyProjector.h" McopyProjector::McopyProjector (AccelStepper takeup, AccelStepper feed, uint8_t takeupSettingA, uint8_t takeupSettingB, uint8_t feedSettingA, uint8_t feedSettingB) { _takeup = takeup; _feed = feed; _takeupSettingA = takeupSettingA; _takeupSettingB = takeupSettingB; _feedSettingA = feedSettingA; _feedSettingB = feedSettingB; } void McopyProjector::begin () { _takeup.setMaxSpeed(_speed); _takeup.setSpeed(_speed); _takeup.setAcceleration(1000.0); _feed.setMaxSpeed(_speed); _feed.setSpeed(_speed); _feed.setAcceleration(1000.0); pinMode(_takeupSettingA, OUTPUT); pinMode(_takeupSettingB, OUTPUT); pinMode(_feedSettingA, OUTPUT); pinMode(_feedSettingB, OUTPUT); setStepperMode(1); } void McopyProjector::setDirection (bool dir) { _dir = dir; } void McopyProjector::frame (bool dir) { if (dir != _dir) { setDirection(dir); } int64_t takeupGoal = _takeup.currentPosition(); int64_t feedGoal = _feed.currentPosition(); takeupGoal += _dir ? _stepsPerFrame : -_stepsPerFrame; feedGoal += _dir ? _stepsPerFrame : -_stepsPerFrame; _takeup.moveTo(takeupGoal); _feed.moveTo(feedGoal); _running = true; } void McopyProjector::adjust(uint8_t motor, int64_t steps) { uint64_t s = abs(steps); //moveTo if (motor == 0) { _posTakeup += steps; } else if (motor == 1) { _posFeed += steps; } } void McopyProjector::adjustBoth (int64_t steps) { uint64_t s = abs(steps); //steppers.stepBoth(s); _posTakeup += steps; _posFeed += steps; } void McopyProjector::loop () { if (_running) { if (_takeup.distanceToGo() == 0 && _feed.distanceToGo() == 0) { //frame done _running = false; _posTakeup += _dir ? _stepsPerFrame : -_stepsPerFrame; _posFeed += _dir ? _stepsPerFrame : -_stepsPerFrame; } else { _takeup.run(); _feed.run(); } } else if (_adjusting) { if (_takeup.distanceToGo() == 0 && _feed.distanceToGo() == 0) { //adjustment done _adjusting = false; } else { _takeup.run(); _feed.run(); } } } //https://wiki.iteadstudio.com/Arduino_Dual_Step_Motor_Driver_Shield void McopyProjector::setStepperMode (uint8_t mode) { switch (mode) { case 1 : digitalWrite(_takeupSettingA, LOW); digitalWrite(_takeupSettingB, LOW); digitalWrite(_feedSettingA, LOW); digitalWrite(_feedSettingB, LOW); break; case 2 : digitalWrite(_takeupSettingA, HIGH); digitalWrite(_takeupSettingB, LOW); digitalWrite(_feedSettingA, HIGH); digitalWrite(_feedSettingB, LOW); break; case 4 : digitalWrite(_takeupSettingA, LOW); digitalWrite(_takeupSettingB, HIGH); digitalWrite(_feedSettingA, LOW); digitalWrite(_feedSettingB, HIGH); break; case 8 : digitalWrite(_takeupSettingA, HIGH); digitalWrite(_takeupSettingB, HIGH); digitalWrite(_feedSettingA, HIGH); digitalWrite(_feedSettingB, HIGH); break; } }