[ Risolto] Problema arresto motore stepper

Buongiorno a tutti e anzitutto buone feste. Come da titolo ho un problema nel far fermare un motore stepper. Mi spiego meglio. Ho un motore stepper da 200 passi, pilotato da un arduino UNO e da un driver TB6600, la mia necessità è quella di far compiere al mio motore una rotazione di 2 volte 360° (400 passi). Ho scritto uno sketch, e il motore ruota correttamente, l’unico problema è che ruota all’infinito. Non si ferma una volta che ha compiuto 400 passi. Io invece ho necessità che una volta arrivato a 400 passi si arresti.
Probabilmente mi sto perdendo in un bicchier d’acqua, ma non riesco a venirne a capo, potete dare un occhiata?

Vi allego lo sketch, e ringrazio fin da subito coloro che mi daranno una mano. :slight_smile:

const int pulPin = 3; 
const int dirPin = 8; 
const int enPin = 4;

void setup() {
  
  pinMode(pulPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);
 
  digitalWrite(enPin,LOW);       // imposto su uno stato logico basso pin ENA+
  
}
void loop() {
  
  digitalWrite(dirPin,HIGH);     // imposto stato alto per definire direzione

  for(int x = 0; x < 400 ; x++) {  // imposto 400 passi per far compiere al motore 2 rotazioni da 360° ciascuna
    digitalWrite(pulPin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(pulPin,LOW); 
    delayMicroseconds(500); 
  }
  
}

Ciao! Tu muovi il motore tramite un ciclo for() all'interno della funzione loop(). La funzione loop() viene eseguita di continuo "finisce e poi ricomincia", per cui tu fai 400 passi, poi la funzione loop() rincomincia e ne fai altri 400, e cosi all'infinito. Come risolvere

1)Se tu vuoi fare 400 passi un unica volta, una soluzione è mettere il ciclo for() nella funzione setup() perché setup() viene eseguita un unica volta.

2)Altra possibilità è usare un pulsante all'interno della funzione loop() se premuto esegue il for() e quindi i passi.

3)Altra possibilità, nella funzione loop() usare un if() e una variabile stato globale "esterna alla funzione loop", se stato==1 esegue il for(), finito il for() sempre dentro all'if() stato diventa stato=0, per cui tutto il codice racchiuso nell'if viene eseguito un unica volta.

Ciao torn24, ti ringrazio per i tuoi preziosi consigli, ho seguito la terza possibilità, ossia ho aggiunto un pulsante. Funziona perfettamente, allego lo sketch. Grazie :wink:

const int pulPin = 3; 
const int dirPin = 8; 
const int enPin = 4;


#define PULSANTE 13
int stato_pulsante = 0;

void setup() {

  pinMode(PULSANTE, INPUT);
  
  pinMode(pulPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);       

}

void loop() {

 stato_pulsante = digitalRead ( PULSANTE ); 
   
if ( stato_pulsante == HIGH ) {      // se premo il pulsante esegue il ciclo FOR
   digitalWrite(enPin,LOW);          // imposto su uno stato logico basso pin ENA+
   digitalWrite(dirPin,HIGH);        // imposto stato alto per definire direzione
  for(int x = 0; x < 400 ; x++) {    // imposto 400 passi per far compiere al motore 2 rotazioni da 360° ciascuna
    digitalWrite(pulPin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(pulPin,LOW); 
    delayMicroseconds(500); 
  }
}
}