|
@@ -8,7 +8,7 @@ Atm_TeensyStep& Atm_TeensyStep::begin(Stepper & motorRef, StepControl & stepCont
|
|
|
// clang-format off
|
|
|
const static state_t state_table[] PROGMEM = {
|
|
|
/* ON_ENTER ON_LOOP ON_EXIT EVT_IDLE_TIMER EVT_ON_TARGET EVT_GOTO ELSE */
|
|
|
- /* IDLE */ ENT_IDLE, -1, -1, -1, -1, RUNNING, -1,
|
|
|
+ /* IDLE */ ENT_IDLE, -1, EXT_IDLE, -1, -1, RUNNING, -1,
|
|
|
/* READY */ ENT_READY, -1, -1, IDLE, -1, RUNNING, -1,
|
|
|
/* RUNNING */ ENT_RUNNING, LP_RUNNING, -1, -1, STOPPING, RUNNING, -1,
|
|
|
/* STOPPING */ ENT_STOPPING, -1, EXT_STOPPING, -1, READY, -1, -1,
|
|
@@ -54,25 +54,30 @@ int Atm_TeensyStep::event( int id ) {
|
|
|
void Atm_TeensyStep::action( int id ) {
|
|
|
switch ( id ) {
|
|
|
case ENT_IDLE:
|
|
|
- digitalWrite(0, LOW);
|
|
|
+ enable(0);
|
|
|
+ return;
|
|
|
+ case EXT_IDLE:
|
|
|
+ enable(1);
|
|
|
return;
|
|
|
case ENT_READY:
|
|
|
- digitalWrite(0, HIGH);
|
|
|
+
|
|
|
return;
|
|
|
case ENT_RUNNING:
|
|
|
- digitalWrite(0, HIGH);
|
|
|
|
|
|
// _controller.moveAsync(*_motor);
|
|
|
return;
|
|
|
case LP_RUNNING:
|
|
|
// _motor.run();
|
|
|
_currentStep = motor->getPosition();
|
|
|
-
|
|
|
+ updateLimitSwitch();
|
|
|
+ if(limitState[0] || limitState[1]) {emergencyStop();}
|
|
|
// Serial.println(_motor.currentPosition());
|
|
|
return;
|
|
|
case ENT_STOPPING:
|
|
|
return;
|
|
|
case EXT_STOPPING:
|
|
|
+ if(_isHoming && limitState[0]){motor->setPosition(0);_isHoming=0;}
|
|
|
+ if(_isHoming && limitState[1]){maxStep = motor->getPosition();_isHoming=0;}
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -94,6 +99,29 @@ int Atm_TeensyStep::state( void ) {
|
|
|
return Machine::state();
|
|
|
}
|
|
|
|
|
|
+void Atm_TeensyStep::updateLimitSwitch(){
|
|
|
+ switch (_limitType) { // limitType!=0 means there is limit to check
|
|
|
+ case NONE:
|
|
|
+ return ;
|
|
|
+ case DIGITAL_1:
|
|
|
+ limitState[0] = digitalRead(_limitPin[0]);
|
|
|
+ limitState[0] = _limitReversed ? !limitState[0] : limitState[0];
|
|
|
+ return;
|
|
|
+ case DIGITAL_2:
|
|
|
+ limitState[0] = digitalRead(_limitPin[0]);
|
|
|
+ limitState[1] = digitalRead(_limitPin[1]);
|
|
|
+ limitState[0] = _limitReversed ? !limitState[0] : limitState[0];
|
|
|
+ limitState[1] = _limitReversed ? !limitState[1] : limitState[1];
|
|
|
+ return;
|
|
|
+ case ANALOG_1:
|
|
|
+ int read = analogRead(_limitPin[0]) ;
|
|
|
+ limitState[0] = _limitThresholds[0] < read && read < _limitThresholds[1] ;
|
|
|
+ limitState[1] = _limitThresholds[2] < read && read < _limitThresholds[3] ;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
/* Nothing customizable below this line
|
|
|
************************************************************************************************
|
|
|
*/
|
|
@@ -101,6 +129,62 @@ int Atm_TeensyStep::state( void ) {
|
|
|
/* Public event methods
|
|
|
*
|
|
|
*/
|
|
|
+ Atm_TeensyStep& Atm_TeensyStep::setLimitPins( int limitPinLow){
|
|
|
+ _limitPin[0] = limitPinLow;
|
|
|
+ pinMode(_limitPin[0], INPUT);
|
|
|
+ return *this;
|
|
|
+ }
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::setLimitPins( int limitPinLow, int limitPinHigh){
|
|
|
+ _limitPin[0] = limitPinLow;
|
|
|
+ _limitPin[1] = limitPinHigh;
|
|
|
+ pinMode(_limitPin[0], INPUT);
|
|
|
+ pinMode(_limitPin[1], INPUT);
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::setLimitType( int limitType){
|
|
|
+ _limitType = limitType;
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::limitReversed( bool reversed){
|
|
|
+ _limitReversed = reversed;
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::limitThresholds( int limitThreshold0,
|
|
|
+ int limitThreshold1, int limitThreshold2, int limitThreshold3){
|
|
|
+ _limitThresholds[0] = limitThreshold0;
|
|
|
+ _limitThresholds[1] = limitThreshold1;
|
|
|
+ _limitThresholds[2] = limitThreshold2;
|
|
|
+ _limitThresholds[3] = limitThreshold3;
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::enable( bool enable ){
|
|
|
+ enabled = enable ;
|
|
|
+ enabled = _enableReversed ? !enabled : enabled ;
|
|
|
+ digitalWrite(_enablePin, enabled);
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::setEnablePin( int enablePin ){
|
|
|
+ _enablePin = enablePin ;
|
|
|
+ pinMode(_enablePin, OUTPUT);
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::enableReversed( bool reverse ){
|
|
|
+ _enableReversed = reverse ;
|
|
|
+ return *this;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::home( bool limit ){
|
|
|
+ _isHoming = 1 ;
|
|
|
+ limit ? move(-2147483647) : move(2147483647) ; // move to very far away until hit
|
|
|
+ return *this;
|
|
|
+}
|
|
|
|
|
|
Atm_TeensyStep& Atm_TeensyStep::move(long int stepRel ) {
|
|
|
_targetStep += stepRel;
|
|
@@ -120,17 +204,16 @@ Atm_TeensyStep& Atm_TeensyStep::moveTo(long int stepAbs ) {
|
|
|
_targetStep = stepAbs;
|
|
|
motor->setTargetAbs(_targetStep);
|
|
|
controller->moveAsync(*motor);
|
|
|
-
|
|
|
- // _motor.move(targetStep);
|
|
|
- // _motor.run();
|
|
|
- // Serial.println(_motor.distanceToGo());
|
|
|
- // _motor.setMaxSpeed(5000);
|
|
|
- // _motor.setAcceleration(6000);
|
|
|
trigger( EVT_GOTO );
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
Atm_TeensyStep& Atm_TeensyStep::stop(){
|
|
|
+ controller->stopAsync();
|
|
|
+ //trigger( EVT_STOPPING );
|
|
|
+}
|
|
|
+
|
|
|
+Atm_TeensyStep& Atm_TeensyStep::emergencyStop(){
|
|
|
controller->emergencyStop();
|
|
|
//trigger( EVT_STOPPING );
|
|
|
}
|