Aggiustiamo il tempo di intervallo tra uno scatto e l’altro
Se avete notato, tra un movimento e l’altro, passano più del secondo (valore 1000 messo nella variabile Attesa) impostato.
Questo perchè Arduino è un piccolo controllore che può eseguire un’istruzione alla volta (non ha il multitasking).
Per questo motivo, tutte le chiamate con l’istruzione delay corrispondono a pause di tutto il sistema.
Pertanto con lo sketch precedente, succede che la pausa tra un movimento e l’altro sia in realtà la somma di (tralasciamo i microsecondi):
Numero passi * Velocità +
AttesaDopoMovimento +
DurataScatto +
AttesaDopoScatto +
Attesa =
Cioè (in millisecondi)
200 x 5 = 1000 +
300+
400+
300+
1000=
3000 ms che equivalgono a 3 secondi
Pertanto se volessimo fare un set dove l’intervallo tra una foto e l’altra sia di 5 secondi, dovremmo modificare la variabile Attesa con il valore 3000 (perchè altri 2000 ms sono per gli altri parametri). Nel caso in cui modifichiamo la velocità, però l’intervallo cambierebbe.
Vediamo pertanto che l’intervallo tra uno scatto e l’altro dipende da molti fattori che potrebbero essere variabili come la velocità, la durata dello scatto, le attese prima e dopo lo scatto. Potrebbe andarci bene anche così, visto che comunque questo tempo è costante per tutta la durata del set. Però sarebbe bello avere la possibilità di gestire il tempo a prescindere dai parametri impostati.
Per fortuna c’è questa possibilità facendo alcune piccole modifiche al programma. Anzichè usare la funzione delay, useremo gli intervalli di tempo:
int MotoreDir=3; int MotoreStep=4; int MotoreEnable=5; int Led=13; int Scatto=2; //definiamo le variabili che useremo int NumeroPassi=200;//Il motore dovrebbe fare un giro 200×1,8°=360° int Attesa=5000;//5 secondi tra un giro e l’altro int Velocita=5;//Tempo di attesa tra uno step e l’altro. Più è basso questo valore più è veloce il motore boolean Direzione = false;//variabile per gestire la direzione del motore int NumeroFotoDaScattare = 300;//variabile per gestire il numero di foto da scattare int NumeroFotoScattata = 0; int AttesaDopoMovimento = 300;//per evitare vibrazioni, possiamo mettere una piccola pausa subito dopo il movimento int DurataScatto=400;//Variabile per indicare quanto tempo (in millisecondi) deve essere simulata la pressione dello scatto int AttesaDopoScatto = 300;//per evitare vibrazioni, possiamo mettere una piccola pausa prima di ricominciare a muovere unsigned long TempoInizioPasso;//variabile per morizzare il tempo di inizio di un nuovo passo void setup() { pinMode(MotoreDir, OUTPUT); // imposto il pin indicato come uscita pinMode(MotoreStep, OUTPUT); // imposto il pin indicato come uscita pinMode(MotoreEnable, OUTPUT); // imposto il pin indicato come uscita pinMode(Scatto, OUTPUT); // imposto il pin indicato come uscita pinMode(Led, OUTPUT); // imposto il pin indicato come uscita TempoInizioPasso=millis(); } void loop(){ if (NumeroFotoScattataif (millis() - TempoInizioPasso > Attesa) { TempoInizioPasso = millis(); AccendiLed(); Motore(); SpegniLed(); Scatta(); // delay(Attesa);//attendiamo per il prossimo ciclo NumeroFotoScattata++;//Incrementiamo il numero di foto scattate. //Scritta in questo modo, questa riga equivale a //NumeroFotoScattata = NumeroFotoScattata + 1 } } } void AccendiLed(void){ digitalWrite(Led, HIGH);//accendiamo il led } void SpegniLed(void){ digitalWrite(Led, LOW);//spegnamo il led } void Motore(void){ if (Direzione==true) digitalWrite(MotoreDir, HIGH);//Abilitiamo un senso di rotazione if (Direzione==false) digitalWrite(MotoreDir, LOW);//Abilitiamo il senso opposto digitalWrite(MotoreEnable, LOW);//Abilitiamo la scheda passo passo abbassando il livello logico dell’uscita for (int ciclo=0;ciclo //diamo un impulso al motore digitalWrite(MotoreStep, LOW); delayMicroseconds(2); digitalWrite(MotoreStep, HIGH); delayMicroseconds(2); delay(Velocita);//attesa per il prossimo impulso } digitalWrite(MotoreEnable, HIGH);//Disabilitiamo la scheda passo passo alzando il livello logico dell’uscita } void Scatta(void){ delay(AttesaDopoMovimento); digitalWrite(Scatto, HIGH);//Iniziamo a simulare la pressione dello scatto delay(DurataScatto); digitalWrite(Scatto, LOW);//terminiamo lo scatto delay(AttesaDopoScatto); }
Lascia un commento