|
@@ -7,15 +7,15 @@
|
|
|
Atm_AccelStepper& Atm_AccelStepper::begin(int step_pin, int dir_pin) {
|
|
|
|
|
|
const static state_t state_table[] PROGMEM = {
|
|
|
-
|
|
|
- ENT_DISABLED, -1, -1, -1, ENABLED, -1, RUNNING, -1, -1, -1, -1, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
- ENT_ENABLED, -1, -1, DISABLE, -1, DISABLE, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
- ENT_RUNNING, LP_RUNNING, -1, DISABLE, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, ENABLED, -1, -1, -1,
|
|
|
- ENT_STOP, LP_STOP, -1, DISABLE, -1, -1, RUNNING, -1, -1, -1, -1, ENABLED, -1, -1, -1,
|
|
|
- ENT_HOMING_LOW, LP_HOMING_LOW, EXT_HOMING_LOW, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
- ENT_HOMING_HIGH, LP_HOMING_HIGH, EXT_HOMING_HIGH, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
- ENT_LIMIT_LOW, -1, -1, -1, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, -1, -1, -1, -1, -1,
|
|
|
- ENT_LIMIT_HIGH, -1, -1, -1, -1, -1, RUNNING, STOP, STOP, -1, LIMIT_HIGH, -1, -1, -1, -1
|
|
|
+
|
|
|
+ ENT_DISABLED, -1, -1, -1, ENABLED, -1, RUNNING, -1, -1, -1, -1, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
+ ENT_ENABLED, -1, -1, DISABLE, -1, DISABLE, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
+ ENT_RUNNING, LP_RUNNING, -1, DISABLE, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, ENABLED, -1, -1, -1,
|
|
|
+ ENT_STOP, LP_STOP, -1, DISABLE, -1, -1, RUNNING, -1, -1, -1, -1, ENABLED, -1, -1, -1,
|
|
|
+ ENT_HOMING_LOW, LP_HOMING_LOW, EXT_HOMING_LOW, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
+ ENT_HOMING_HIGH, LP_HOMING_HIGH, EXT_HOMING_HIGH, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
+ ENT_LIMIT_LOW, LP_LIMIT_LOW, -1, -1, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, -1, -1, -1, -1, -1,
|
|
|
+ ENT_LIMIT_HIGH, LP_LIMIT_HIGH, -1, -1, -1, -1, RUNNING, STOP, STOP, -1, LIMIT_HIGH, -1, -1, -1, -1
|
|
|
};
|
|
|
|
|
|
Machine::begin( state_table, ELSE );
|
|
@@ -48,6 +48,7 @@ int Atm_AccelStepper::event( int id ) {
|
|
|
case EVT_EMERGENCY_STOP:
|
|
|
return 0;
|
|
|
case EVT_ON_LIMIT_LOW:
|
|
|
+ previous_state = limitLow_State;
|
|
|
switch(_limitLow_Mode) {
|
|
|
case 0:
|
|
|
return 0;
|
|
@@ -55,31 +56,31 @@ int Atm_AccelStepper::event( int id ) {
|
|
|
|
|
|
limitLow_State = digitalRead(_limitLow_Pin);
|
|
|
limitLow_State = _limitLow_Reversed ? !limitLow_State : limitLow_State;
|
|
|
- return limitLow_State;
|
|
|
+ return limitLow_State != previous_state;
|
|
|
case 2:
|
|
|
-
|
|
|
int analogTemp = analogRead(_limitLow_Pin);
|
|
|
limitLow_State = (_limitLow_Thresholds[0] < analogTemp) && (analogTemp < _limitLow_Thresholds[1]);
|
|
|
limitLow_State = _limitLow_Reversed ? !limitLow_State : limitLow_State;
|
|
|
if(limitLow_State){analogTemp = analogRead(_limitLow_Pin);
|
|
|
limitLow_State = (_limitLow_Thresholds[0] < analogTemp) && (analogTemp < _limitLow_Thresholds[1]);
|
|
|
limitLow_State = _limitLow_Reversed ? !limitLow_State : limitLow_State;}
|
|
|
- return limitLow_State;
|
|
|
+ return limitLow_State != previous_state;
|
|
|
}
|
|
|
case EVT_ON_LIMIT_HIGH:
|
|
|
+ previous_state = limitHigh_State;
|
|
|
switch(_limitHigh_Mode) {
|
|
|
case 0:
|
|
|
return 0;
|
|
|
case 1:
|
|
|
limitHigh_State = digitalRead(_limitHigh_Pin);
|
|
|
limitHigh_State = _limitHigh_Reversed ? !limitHigh_State : limitHigh_State;
|
|
|
- return limitHigh_State;
|
|
|
+ return limitHigh_State != previous_state;
|
|
|
case 2:
|
|
|
|
|
|
int analogTemp = analogRead(_limitHigh_Pin);
|
|
|
limitHigh_State = (_limitHigh_Thresholds[0] < analogTemp) && (analogTemp < _limitHigh_Thresholds[1]);
|
|
|
limitHigh_State = _limitHigh_Reversed ? !limitHigh_State : limitHigh_State;
|
|
|
- return limitHigh_State;
|
|
|
+ return limitHigh_State != previous_state;
|
|
|
}
|
|
|
case EVT_ON_TARGET:
|
|
|
return runMode ? 0 : _currentStep == _targetStep;
|
|
@@ -122,7 +123,13 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
case ENT_RUNNING:
|
|
|
push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
_isHoming = 0;
|
|
|
+
|
|
|
+ limitLow_State = 0;
|
|
|
+ limitHigh_State = 0;
|
|
|
+ Serial.print("target ");
|
|
|
+ Serial.println(_targetStep);
|
|
|
stepper->moveTo(_targetStep);
|
|
|
+
|
|
|
|
|
|
position_timer.setFromNow(this, POSITION_SEND_TIMER);
|
|
|
return;
|
|
@@ -193,40 +200,42 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
_targetStep = _currentStep;
|
|
|
return;
|
|
|
case ENT_LIMIT_LOW:
|
|
|
- push( connectors, ON_ONLIMITLOW, 0, 0, 0 );
|
|
|
+
|
|
|
+ if state is 0, we may leave this state for running
|
|
|
+ if state is 1 we stay in limit state loop, where moves are allowed only in
|
|
|
+ the free direction, until a trigger comes with state 0
|
|
|
+ */
|
|
|
+ push( connectors, ON_ONLIMITLOW, 0, limitLow_State, 0 );
|
|
|
+ if (!limitLow_State){trigger(EVT_MOVE);}
|
|
|
+ return;
|
|
|
+
|
|
|
+ case LP_LIMIT_LOW:
|
|
|
|
|
|
- if(_limitLow_Hard && (stepper->speed()<=0) ) {trigger(EVT_EMERGENCY_STOP);}
|
|
|
- else{ stepper_update();trigger(EVT_MOVE);}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ stepper_update();
|
|
|
+ if(_limitLow_Hard && (_targetStep < _currentStep)) {
|
|
|
+
|
|
|
+ _currentStep = stepper->currentPosition();
|
|
|
+
|
|
|
+
|
|
|
+ stepper->setSpeed(0);
|
|
|
+ }
|
|
|
+
|
|
|
return;
|
|
|
case ENT_LIMIT_HIGH:
|
|
|
- push( connectors, ON_ONLIMITHIGH, 0, 1, 0 );
|
|
|
- if(_limitHigh_Hard && (stepper->speed()>=0)) {trigger(EVT_EMERGENCY_STOP);}
|
|
|
- else{ stepper_update(); trigger(EVT_MOVE);}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ push( connectors, ON_ONLIMITHIGH, 0, limitHigh_State, 0 );
|
|
|
+ if (!limitHigh_State){trigger(EVT_MOVE);};
|
|
|
+ return;
|
|
|
+ case LP_LIMIT_HIGH:
|
|
|
+
|
|
|
+ stepper_update();
|
|
|
+ if(_limitHigh_Hard && (_targetStep > _currentStep)) {
|
|
|
+
|
|
|
+ _currentStep = stepper->currentPosition();
|
|
|
+
|
|
|
+
|
|
|
+ stepper->setSpeed(0);
|
|
|
+ }
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -256,8 +265,9 @@ int Atm_AccelStepper::state( void ) {
|
|
|
*/
|
|
|
|
|
|
void Atm_AccelStepper::stepper_update(void) {
|
|
|
+
|
|
|
+
|
|
|
switch (runMode) {
|
|
|
- Serial.println(stepper->currentPosition());
|
|
|
case 0:
|
|
|
stepper->run();
|
|
|
break;
|
|
@@ -265,12 +275,14 @@ void Atm_AccelStepper::stepper_update(void) {
|
|
|
stepper->runSpeed();
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
long int tempStep = stepper->currentPosition();
|
|
|
if (tempStep != _currentStep){
|
|
|
_currentStep = tempStep;
|
|
|
+
|
|
|
if (position_timer.expired(this)){
|
|
|
push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
-
|
|
|
position_timer.setFromNow(this, POSITION_SEND_TIMER);
|
|
|
}
|
|
|
}
|