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);
}
}