|
@@ -7,15 +7,15 @@
|
|
|
Atm_AccelStepper& Atm_AccelStepper::begin(int step_pin, int dir_pin) {
|
|
|
// clang-format off
|
|
|
const static state_t state_table[] PROGMEM = {
|
|
|
- /* ON_ENTER ON_LOOP ON_EXIT EVT_DISABLE EVT_ENABLE EVT_ENABLED_TIMEOUT EVT_MOVE EVT_STOP EVT_EMERGENCY_STOP EVT_ON_LIMIT_LOW EVT_ON_LIMIT_HIGH EVT_ON_TARGET EVT_HOMING_LOW EVT_HOMING_HIGH ELSE */
|
|
|
- /* DISABLE */ ENT_DISABLED, -1, -1, -1, ENABLED, -1, RUNNING, -1, -1, -1, -1, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
- /* ENABLED */ ENT_ENABLED, -1, -1, DISABLE, -1, DISABLE, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
- /* RUNNING */ ENT_RUNNING, LP_RUNNING, -1, DISABLE, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, ENABLED, -1, -1, -1,
|
|
|
- /* STOP */ ENT_STOP, LP_STOP, -1, DISABLE, -1, -1, RUNNING, -1, -1, -1, -1, ENABLED, -1, -1, -1,
|
|
|
- /* HOMING_LOW */ ENT_HOMING_LOW, LP_HOMING_LOW, EXT_HOMING_LOW, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
- /* HOMING_HIGH */ ENT_HOMING_HIGH, LP_HOMING_HIGH, EXT_HOMING_HIGH, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
- /* LIMIT_LOW */ ENT_LIMIT_LOW, -1, -1, -1, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, -1, -1, -1, -1, -1,
|
|
|
- /* LIMIT_HIGH */ ENT_LIMIT_HIGH, -1, -1, -1, -1, -1, RUNNING, STOP, STOP, -1, LIMIT_HIGH, -1, -1, -1, -1
|
|
|
+ /* ON_ENTER ON_LOOP ON_EXIT EVT_DISABLE EVT_ENABLE EVT_ENABLED_TIMEOUT EVT_MOVE EVT_STOP EVT_EMERGENCY_STOP EVT_ON_LIMIT_LOW EVT_ON_LIMIT_HIGH EVT_ON_TARGET EVT_HOMING_LOW EVT_HOMING_HIGH ELSE */
|
|
|
+ /* DISABLE */ ENT_DISABLED, -1, -1, -1, ENABLED, -1, RUNNING, -1, -1, -1, -1, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
+ /* ENABLED */ ENT_ENABLED, -1, -1, DISABLE, -1, DISABLE, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, HOMING_LOW, HOMING_HIGH, -1,
|
|
|
+ /* RUNNING */ ENT_RUNNING, LP_RUNNING, -1, DISABLE, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, ENABLED, -1, -1, -1,
|
|
|
+ /* STOP */ ENT_STOP, LP_STOP, -1, DISABLE, -1, -1, RUNNING, -1, -1, -1, -1, ENABLED, -1, -1, -1,
|
|
|
+ /* HOMING_LOW */ ENT_HOMING_LOW, LP_HOMING_LOW, EXT_HOMING_LOW, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
+ /* HOMING_HIGH */ ENT_HOMING_HIGH, LP_HOMING_HIGH, EXT_HOMING_HIGH, DISABLE, -1, -1, -1, STOP, STOP, LIMIT_LOW, LIMIT_HIGH, -1, -1, -1, -1,
|
|
|
+ /* LIMIT_LOW */ ENT_LIMIT_LOW, LP_LIMIT_LOW, -1, -1, -1, -1, RUNNING, STOP, STOP, LIMIT_LOW, -1, -1, -1, -1, -1,
|
|
|
+ /* LIMIT_HIGH */ ENT_LIMIT_HIGH, LP_LIMIT_HIGH, -1, -1, -1, -1, RUNNING, STOP, STOP, -1, LIMIT_HIGH, -1, -1, -1, -1
|
|
|
};
|
|
|
// clang-format on
|
|
|
Machine::begin( state_table, ELSE );
|
|
@@ -24,6 +24,7 @@ Atm_AccelStepper& Atm_AccelStepper::begin(int step_pin, int dir_pin) {
|
|
|
stepper->setAcceleration(acceleration);
|
|
|
idle_timer.set(ATM_TIMER_OFF);
|
|
|
position_timer.set(POSITION_SEND_TIMER);
|
|
|
+
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
@@ -47,37 +48,39 @@ 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:
|
|
|
- //
|
|
|
- Serial.println("no limit");
|
|
|
return 0;
|
|
|
case 1: //digital INPUT
|
|
|
// Serial.println("digital");
|
|
|
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;
|
|
|
- return 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 != previous_state;
|
|
|
}
|
|
|
case EVT_ON_LIMIT_HIGH:
|
|
|
+ previous_state = limitHigh_State;
|
|
|
switch(_limitHigh_Mode) {
|
|
|
case 0:
|
|
|
return 0;
|
|
|
case 1: //digital INPUT
|
|
|
limitHigh_State = digitalRead(_limitHigh_Pin);
|
|
|
limitHigh_State = _limitHigh_Reversed ? !limitHigh_State : limitHigh_State;
|
|
|
- return limitHigh_State;
|
|
|
+ return limitHigh_State != previous_state;
|
|
|
case 2:
|
|
|
//Serial.println("analog");
|
|
|
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;
|
|
@@ -112,7 +115,6 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
_isHoming = 0 ;
|
|
|
if(last_trigger == EVT_ON_TARGET){push( connectors, ON_ONTARGET, 0, _currentStep, 0 );};
|
|
|
push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
enabled = _enableReversed ? LOW : HIGH ;
|
|
|
digitalWrite(_enablePin, enabled);
|
|
|
|
|
@@ -120,21 +122,23 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
return;
|
|
|
case ENT_RUNNING:
|
|
|
push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
_isHoming = 0;
|
|
|
- stepper->setMaxSpeed(max_speed);
|
|
|
- stepper->setAcceleration(acceleration);
|
|
|
+ //reset limit state so that they trigger again if we're stopped on it
|
|
|
+ // limitLow_State = 0;
|
|
|
+ // limitHigh_State = 0;
|
|
|
+ Serial.print("target ");
|
|
|
+ Serial.println(_targetStep);
|
|
|
+ stepper->moveTo(_targetStep);
|
|
|
+ // stepper->computeNewSpeed();
|
|
|
+ //stepper_update();
|
|
|
//push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
position_timer.setFromNow(this, POSITION_SEND_TIMER);
|
|
|
return;
|
|
|
case LP_RUNNING:
|
|
|
stepper_update();
|
|
|
- Serial.println(stepper->speed());
|
|
|
- if(stepper->speed() == 0) {trigger(EVT_ON_TARGET);}
|
|
|
return;
|
|
|
case ENT_STOP:
|
|
|
- push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
+ push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
if (last_trigger == EVT_STOP) {
|
|
|
runMode = 0 ;
|
|
|
stepper->stop();
|
|
@@ -148,16 +152,12 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
stepper->setSpeed(0);
|
|
|
push( connectors, ON_STOP, 0, 1, 0 );
|
|
|
}
|
|
|
- stepper_update();
|
|
|
return;
|
|
|
case LP_STOP:
|
|
|
stepper_update();
|
|
|
_currentStep = stepper->currentPosition();
|
|
|
-
|
|
|
- if(stepper->speed() == 0.) {Serial.println(stepper->speed());trigger(EVT_ON_TARGET);}
|
|
|
return;
|
|
|
case ENT_HOMING_LOW:
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
runMode = 1;
|
|
|
_isHoming = 1 ;
|
|
@@ -167,6 +167,9 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
stepper_update();
|
|
|
return;
|
|
|
case EXT_HOMING_LOW:
|
|
|
+ runMode = 0;
|
|
|
+ _isHoming = 0;
|
|
|
+ trigger(EVT_EMERGENCY_STOP);
|
|
|
if(last_trigger == EVT_ON_LIMIT_LOW) {
|
|
|
stepper->setCurrentPosition(0);
|
|
|
_currentStep = 0;
|
|
@@ -178,7 +181,6 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
return;
|
|
|
case ENT_HOMING_HIGH:
|
|
|
push(connectors, ON_CHANGESTATE, 0, state(), 0);
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
runMode = 1;
|
|
|
_isHoming = 2 ;
|
|
|
stepper->setSpeed(homing_speed);
|
|
@@ -187,6 +189,9 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
stepper_update();
|
|
|
return;
|
|
|
case EXT_HOMING_HIGH:
|
|
|
+ runMode = 0;
|
|
|
+ _isHoming = 0;
|
|
|
+ trigger(EVT_EMERGENCY_STOP);
|
|
|
if(last_trigger == EVT_ON_LIMIT_HIGH) {
|
|
|
_maxStep = stepper->currentPosition();
|
|
|
_currentStep = _maxStep;
|
|
@@ -196,42 +201,42 @@ void Atm_AccelStepper::action( int id ) {
|
|
|
_targetStep = _currentStep;
|
|
|
return;
|
|
|
case ENT_LIMIT_LOW:
|
|
|
- push( connectors, ON_ONLIMITLOW, 0, 0, 0 );
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
+ /*triggered by a change in limit state
|
|
|
+ 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:
|
|
|
//stop motor if going down, allow going up
|
|
|
- if(_limitLow_Hard && (stepper->speed()<0) ) {trigger(EVT_EMERGENCY_STOP);}
|
|
|
- else{ stepper_update(); _isHoming ? trigger(EVT_ENABLE):trigger(EVT_MOVE);}
|
|
|
- // switch(_isHoming) {
|
|
|
- // case 0 :
|
|
|
- // trigger(EVT_MOVE);
|
|
|
- // break;
|
|
|
- // case 1 :
|
|
|
- // trigger(EVT_HOMING_LOW);
|
|
|
- // break;
|
|
|
- // case 2 :
|
|
|
- // trigger(EVT_HOMING_HIGH);
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
+ stepper_update();
|
|
|
+ if(_limitLow_Hard && (_targetStep < _currentStep)) {
|
|
|
+ // Serial.println("youpi");
|
|
|
+ _currentStep = stepper->currentPosition();
|
|
|
+ //stepper->moveTo(_currentStep);
|
|
|
+ //_targetStep = _currentStep;
|
|
|
+ stepper->setSpeed(0);
|
|
|
+ }
|
|
|
+ //else{} // _isHoming ? trigger(EVT_STOP):
|
|
|
return;
|
|
|
case ENT_LIMIT_HIGH:
|
|
|
- push( connectors, ON_ONLIMITHIGH, 0, 1, 0 );
|
|
|
- push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
- if(_limitHigh_Hard && (stepper->speed()>0)) {trigger(EVT_EMERGENCY_STOP);}
|
|
|
- else{ stepper_update(); _isHoming ? trigger(EVT_ENABLE):trigger(EVT_MOVE);}
|
|
|
- // stepper_update();
|
|
|
- // switch(_isHoming) {
|
|
|
- // case 0 :
|
|
|
- // trigger(EVT_MOVE);
|
|
|
- // break;
|
|
|
- // case 1 :
|
|
|
- // trigger(EVT_HOMING_HIGH);
|
|
|
- // break;
|
|
|
- // case 2 :
|
|
|
- // trigger(EVT_HOMING_HIGH);
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
+ push( connectors, ON_ONLIMITHIGH, 0, limitHigh_State, 0 );
|
|
|
+ if (!limitHigh_State){trigger(EVT_MOVE);};
|
|
|
+ return;
|
|
|
+ case LP_LIMIT_HIGH:
|
|
|
+ //stop motor if going down, allow going up
|
|
|
+ stepper_update();
|
|
|
+ if(_limitHigh_Hard && (_targetStep > _currentStep)) {
|
|
|
+ // Serial.println("youpi");
|
|
|
+ _currentStep = stepper->currentPosition();
|
|
|
+ //stepper->moveTo(_currentStep);
|
|
|
+ //_targetStep = _currentStep;
|
|
|
+ stepper->setSpeed(0);
|
|
|
+ }
|
|
|
+ // else{}
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
@@ -261,6 +266,8 @@ int Atm_AccelStepper::state( void ) {
|
|
|
*/
|
|
|
|
|
|
void Atm_AccelStepper::stepper_update(void) {
|
|
|
+
|
|
|
+
|
|
|
switch (runMode) {
|
|
|
case 0: //positional modae
|
|
|
stepper->run();
|
|
@@ -269,9 +276,12 @@ void Atm_AccelStepper::stepper_update(void) {
|
|
|
stepper->runSpeed();
|
|
|
break;
|
|
|
}
|
|
|
+ // Serial.print("update ");
|
|
|
+ // Serial.println(stepper->speed());
|
|
|
long int tempStep = stepper->currentPosition();
|
|
|
if (tempStep != _currentStep){
|
|
|
_currentStep = tempStep;
|
|
|
+ //Serial.println(stepper->currentPosition());
|
|
|
if (position_timer.expired(this)){
|
|
|
push(connectors, ON_CHANGEPOSITION, 0, _currentStep, stepper->speed());
|
|
|
position_timer.setFromNow(this, POSITION_SEND_TIMER);
|
|
@@ -292,36 +302,53 @@ Atm_AccelStepper& Atm_AccelStepper::setHomingSpeed(long int homingSpeed){
|
|
|
|
|
|
Atm_AccelStepper& Atm_AccelStepper::setAcceleration(long int acc){
|
|
|
acceleration = acc ;
|
|
|
- stepper->setAcceleration(max_speed);
|
|
|
+ stepper->setAcceleration(acceleration);
|
|
|
+ return *this ;
|
|
|
+}
|
|
|
+
|
|
|
+Atm_AccelStepper& Atm_AccelStepper::setPosition(long int position){
|
|
|
+ stepper->setCurrentPosition(position);
|
|
|
+ _currentStep = position ;
|
|
|
return *this ;
|
|
|
}
|
|
|
|
|
|
+long int Atm_AccelStepper::getPosition(){
|
|
|
+ return stepper->currentPosition();;
|
|
|
+}
|
|
|
+
|
|
|
+long int Atm_AccelStepper::distanceToGo(){
|
|
|
+ return stepper->distanceToGo();;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+bool Atm_AccelStepper::isRunning(){
|
|
|
+ return stepper->isRunning();
|
|
|
+}
|
|
|
+
|
|
|
+float Atm_AccelStepper::getSpeed(){
|
|
|
+ return stepper->speed();
|
|
|
+}
|
|
|
+
|
|
|
Atm_AccelStepper& Atm_AccelStepper::position_refresh(long int refresh_ms){
|
|
|
POSITION_SEND_TIMER = refresh_ms ;
|
|
|
return *this ;
|
|
|
}
|
|
|
|
|
|
-Atm_AccelStepper& Atm_AccelStepper::move( long int stepRel, long int maxSpeed,
|
|
|
- long int acc) {
|
|
|
+Atm_AccelStepper& Atm_AccelStepper::move( long int stepRel) {
|
|
|
_targetStep = _currentStep + stepRel;
|
|
|
runMode = 0;
|
|
|
_isHoming = 0;
|
|
|
//Serial.println(_targetStep);
|
|
|
- max_speed = maxSpeed;
|
|
|
- acceleration = acc;
|
|
|
stepper->moveTo(_targetStep);
|
|
|
enable();
|
|
|
trigger( EVT_MOVE );
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
-Atm_AccelStepper& Atm_AccelStepper::moveTo( long int stepAbs, long int maxSpeed,
|
|
|
- long int acc) {
|
|
|
+Atm_AccelStepper& Atm_AccelStepper::moveTo( long int stepAbs) {
|
|
|
_targetStep = stepAbs;
|
|
|
_isHoming = 0 ;
|
|
|
runMode = 0;
|
|
|
- max_speed = maxSpeed;
|
|
|
- acceleration = acc;
|
|
|
stepper->moveTo(_targetStep);
|
|
|
enable();
|
|
|
trigger( EVT_MOVE );
|
|
@@ -337,9 +364,8 @@ Atm_AccelStepper& Atm_AccelStepper::rotate( long int speed) {
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
-Atm_AccelStepper& Atm_AccelStepper::homing( bool direction, long int speed ){
|
|
|
+Atm_AccelStepper& Atm_AccelStepper::homing( bool direction ){
|
|
|
enable();
|
|
|
- homing_speed = speed ;
|
|
|
direction == 1 ? _isHoming = 2 : _isHoming = 1;
|
|
|
direction == 1 ? this->trigger(EVT_HOMING_HIGH) : this->trigger(EVT_HOMING_LOW);
|
|
|
|