Stepper Motor, ciclo while (1) e fine corsa

Ciao a tutti, dopo essermi impratichito con gli sketch base ho deciso di provare qualcosa di un pò più articolato, e stò cercando di realizzare un giochino per mio figlio. Questo è composto da 5 sensori e uno stepper motor comandato da driver A4988. Premetto che quello che è stato scritto finora, è stato fatto senza librerie grazie ad un mio amico ed ai tutorial dal web, ma sono arrivato ad un punto da cui non riesco a saltarne fuori. Il motore all'avvio parte fermo, e se vengono premuti i tre sensori "pinBuca_1,2,3" in modalità pullup fanno avanzare il motore di tre diverse lunghezze, richiamate dalla void avanti e se poi viene premuto il sensore "pinFC_Reset", il motore continua a girare in senso opposto. E fin qui ci siamo. I problemi sono sorti quando ho cercato di inserire due fine corsa che mi blocchino la void "avanti" e la "reset_Posizione", e qui sono emersi i miei limiti. Ho creato una nuova void ed ho cercato di richiamarla all'inderno del ciclo while (come per i pinBuca) sempre in modalità pullup, ma non blocca il motore. Ho letto che il while si blocca tramite l'istruzione break, ma non so se sia la maniera più corretta da applicare in questo progetto. E' la strada giusta o c'è qualche altra soluzione più performante? Grazie a tutti

//Definizione dei PIN Uscita Motore
const int pinDir = 22;
const int pinStep = 24;
const int pinEn = 26;
const int pinSlp = 28;

//Definizione dei PIN Ingresso
const int pinBuca1_1 = 48;
const int pinBuca1_2 = 50;
const int pinBuca1_3 = 52;
const int pinFC_Reset = 53;
const int fineC_arrivo = 9;
const int fineC_partenza = 10;

//Definizione costanti numeriche x avanzamento motore
const int buca_tre = 15;
const int buca_due = 10;
const int buca_uno = 7;

const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 1000; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP

void setup() {
  
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pinEn, OUTPUT); 
  pinMode(pinEn, OUTPUT);

// definizione ingressi
  pinMode(pinBuca1_1, INPUT_PULLUP);
  pinMode(pinBuca1_2, INPUT_PULLUP);
  pinMode(pinBuca1_3, INPUT_PULLUP);
  pinMode(pinFC_Reset, INPUT_PULLUP);
  pinMode(fineC_arrivo, INPUT_PULLUP);
  pinMode(fineC_partenza, INPUT_PULLUP);

  digitalWrite(pinEn, LOW);
  digitalWrite(pinSlp, HIGH);
}

  while (1)
  {
    if (digitalRead(pinBuca1_1) == 0)  // in buca 1 motore avanza di 7
      avanti(buca_uno);
    else if (digitalRead(pinBuca1_2) == 0) // in buca 2 motore avanza di 10
      avanti(buca_due);
    else if (digitalRead(pinBuca1_3) == 0) // in buca 3 motore avanza di 15
      avanti(buca_tre);
    reset_posizione();     // pin che fa ruotare il motore indietro in direzione opposta
   }
  

void avanti (int buca)
{
  int y = 0;
  y = (buca*numStepMotore);

  //definiamo la direzione del motore
  digitalWrite(pinDir, LOW);
  //esegue un giro completo in un senso
  for (int x = 0; x < y; x++)
  {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  }
}


void reset_posizione()
{
 if (digitalRead(pinFC_Reset) == 0)
  {
  //definiamo la direzione del motore
    digitalWrite(pinDir, LOW);
    //esegue un giro completo in un senso
    //for (int x = 0; x < y; x++)
    {
      digitalWrite(pinStep, LOW);
      delayMicroseconds(velocita);
      digitalWrite(pinStep, LOW);
      delayMicroseconds(velocita);
    }
  }

Perdona, ma ... per evitare incomprensioni di linguaggio ti prego di osservare che quella che tu hai creato è una funzione che, non resistuendo un valore, è di tipo void.

La parolina void specifica infatti che la funzione non ritorna un valore al chiamante. Se la funzione avesse ritornato un valore, al posto di void avresti dovuto mettere il tipo di valore tornato (byte, int, long, ecc.).

Quindi quelle che scrivi sono funzioni e se non ritornano nulla sono di tipo void, altrimenti si deve specificare il tipo del valore che ritornano. :slight_smile:

Guglielmo

Ti ringrazio.. come vedi c'è molta confusione, e tanto da imparare :confounded:.

Il problema è abbastanza un classico:

L'uso di funzioni bloccanti

Dove per bloccante intendo che fanno i fatti loro per un tempo sensibile (che in italiano significa solo: che si sente, ci si accorge)

Come idea di soluzione cerca e prova a studiare una discussione:
Blink without delay

vedo subito a cercare , grazie .

Intanto buono che il codice sia indentato e spaziato correttamente con commenti chiari e significativi. Tutti i nomi simbolici sono definiti in modo coerente con const (anche se per correttezza stilistica andrebbero in maiuscolo ma nulla di grave).

Meno buono quel ciclo while fuori da ogni funzione (come mi aspettavo non compila neppure).

Comunque il problema non è bloccare il while (che fa solo la scansione degli ingressi per capire cosa fare quando uno diventa attivo), ma sono i cicli for all'interno delle funzioni 'avanti' e 'reset_posizione'.

Per risolvere questo specifico caso, ma non come strumento generale applicabile a tutti casi, è in questi cicli che si dovrebbero leggere i finecorsa (anche i cicli for possono essere interrotti con break).

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.