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 (NumeroFotoScattata<NumeroFotoDaScattare)
      {
        if (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<NumeroPassi;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);
}

Calcoliamo lo spazio per ogni step

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Donate

Support TLTools, Make A Donation

Please make a donation if you enjoy using our software and believe in the importance of what the ciemmesoft is working to accomplish.

PayPal Donate Button

Fai una donazione!

Sostieni il progetto, fai una donazione TLTools è un progetto gratuito. Fai una donazione se ti piace utilizzare il nostro software e se credi nell'importanza di ciò a cui il progetto lavora.

PayPal Donate Button