ciao
ho risolto in parte il problema del posizionamento dello stepper, eliminando, per il momento, l'encoder e contando i passi del motore, pero' adesso si presenta uno strano comportamento, che provo a descrivere:
quando il motore si arresta a grazie a un sensore collegato al pin 3 e monitorato dall'interrupt in modalità FALLING, talvolta succede che dopo l'arresto il motore e trascorso l'intervallo stabilito ruoti di qualche passo per arrestarsi e riprendere a muoversi regolarmente dopo il medesimo tempo, in pratica succede questo
STOP-MOTO-STOP-MOTO fino al prossimo stop
mentre dovrebbe fare questo
STOP-MOTO fino al prossimo stop
Credo che il comportamento sia anche corretto, perchè dipende da dove l'interrupt riprende il programma, ho quindi provato a mettere un goto dentro l'interrupt per rimandare il programma all'inizio, ma il compilatore non lo accetta
/*
by Nick Gammon per debounce
*/
const byte switchPin = 11;
byte oldSwitchState = HIGH; // assume switch open because of pull-up resistor
const unsigned long debounceTime = 5; // milliseconds
unsigned long switchPressTime; // when the switch last changed state
byte switchState;
#define led_pin 13
#define sensor_stop_pin 3
#define motorPin 12// digital pin per il driver dello stepper
int ritardo, ritardo_1;
volatile byte k;
byte pin;
void setup()
{
pinMode (led_pin, OUTPUT);
pinMode (switchPin, INPUT_PULLUP);
pinMode(sensor_stop_pin, INPUT_PULLUP);
attachInterrupt(1, sensor_stop, FALLING); //sensore induttivo collegato al pin 2
pinMode(motorPin,OUTPUT);// set the digital pin as output
ritardo = 3500;// pauses for microseconds us
ritardo_1 = 5000;// pauses for milliseconds ms
Serial.begin(9600);
}
void loop()
{
// see if switch is open or closed
switchState = digitalRead (switchPin);
// has it changed since last time?
if (switchState != oldSwitchState)
{
// debounce
if (millis () - switchPressTime >= debounceTime)
{
switchPressTime = millis (); // when we closed the switch
oldSwitchState = switchState; // remember for next time
if (switchState == LOW)
{
Serial.println ("Switch closed.");
digitalWrite(led_pin, HIGH);
} // end if switchState is LOW
else
{
Serial.println ("Switch opened.");
digitalWrite(led_pin, LOW);
} // end if switchState is HIGH
} // end if debounce time up
} // end of state change
if(k == 0)
{
k = 1;
delay(ritardo_1);
}
motore();
}//fine loop
void sensor_stop()
{
k = 0;
}
void motore()
{
if(k == 1 && switchState == LOW)
{
digitalWrite(motorPin, LOW); // sets the pin on
delayMicroseconds(ritardo);// pauses for microseconds
digitalWrite(motorPin, HIGH); // sets the pin off
delayMicroseconds(ritardo);// pauses for microseconds
}
}