pulsante per controllare stepper

Ciao, ho un pulsante con cui voglio controllare uno stepper. praticamente quello che deve accedere è che quando premo il pulsante lo stepper ruota di 360°. Se lo premo di nuovo, ritorna indietro (-360°)..e così via..

solo che il mio codice non sembra funzionare molto bene, credo sia un problema di logica..inoltre mi interessa che mentre lo stepper stia ruotando il pulsante sia inibito, in modo che tenendolo premuto lo stepper non continui a ruotare avanti e indietro..non voglio metterci dealy perchè altrimenti tutto il resto del sistema si sblocca..

suggerimenti?

  if(buttState == LOW){ //bottone premuto
    if(lock){ //bool
      rotateDeg(360,1); //ruota stepper +
      lock = false;
    }else{
      rotateDeg(-360,1); //ruota stepper -
      lock = true;
    }

grazie!

L.

Ciao

sarebbe utile vedere come è fatta la rotateDeg

ciao, ecco

void rotateDeg(float deg, float speed){ 
  //rotate a specific number of degrees (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (deg > 0)? HIGH:LOW;
  digitalWrite(DIR_PIN,dir); 

  int steps = abs(deg)*(1/0.225);
  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){ 
    digitalWrite(STEP_PIN, HIGH); 
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW); 
    delayMicroseconds(usDelay); 
  } 
}

l’originale completo è qui

grazie :slight_smile:

Per come è scritta, la rotateDeg è già bloccante. Intendo dire che quando la chiami, per esempio rotateDeg(360,1), questa ritorna solo dopo aver effettuato l'intera rotazione.

Pertanto durante l'intera rotazione lo stato del pulsante non verrà mai ricontrollato, proprio come tu richiedi.

Il problema tuttavia può essere che durante l'intera rotazione, Arduino è impegnato soltanto a muovere lo stepper e non può fare altro.

Se hai bisogno di fare altro durante la rotazione, dovresti riscrivere il codice in modo che, mentre un flag è alto, viene invocata la rotateDeg(1, 1).

Un esempio per la rotazione in una sola direzione:

int rDeg = 0;

void loop()
{
	if (buttonState == LOW && rDeg == 0)
	{
		rDeg = 360;
	}
	
	if (rDeg > 0)
	{
		rotateDeg(1, 1);
		rDeg--;
	}
}

In pratica ad ogni ciclo del loop controlli lo stato del pulsante solo quando rDeg = 0 ossia a motore fermo. Se il pulsante viene premuto a motore fermo, metti rDeg = 360 predisponendo il programma a far girare il motore per 360 gradi.

Se rDeg > 0, fai girare il motore di un solo grado e decrementi rDeg. Quando questo arriverà a zero ricomincia tutto da capo.

Se la rotazione di un grado ancora ti rallenta troppo l'esecuzione di altri compiti da effettuare contemporaneamente, puoi ragionare in termini di step invece che di gradi. Per fare questo, ovviamente, devi modificare la rotateDeg.

Ciao.
Vittorio.

ok ho risolto tutto egregiamente…ho visto che durante la rotazione non mi interessa che il resto sia bloccato dal delay quindi ho scartato quell’aspetto…avevo un problema con il pulsante di attivazione dello stepper che mi creava parecchia confusione, una volta risolto quello il resto è stato semplice

if(scr_state == HIGH){ 
        if(step_lock){
            if(dir){
                rotateDeg(1500,1); //ruota stepper +
                dir = false;
            }else{
                rotateDeg(-1500,1); //ruota stepper -  
                dir = true;
            }
            step_lock = false;
        }
    }else
        step_lock = true;