Aggiungiamo uno schermo LCD
A questo punto possiamo aggiungere uno schermo LCD per visualizzare lo stato di avanzamento della sessione di TimeLapse.
Dobbiamo modificare il circuito elettrico. Aggiungiamo i componenti necessari (in pratica il solo LCD)
Per collegare uno schermo LCD con interfaccia I2C sono sufficienti due piedini di Arduino e più precisamente A4 e A5.
Per farla funzionare, abbiamo bisogno di scaricare ed installare una libreria. Se chi vi ha venduto lo schermo vi ha fornito anche le librerie per farlo funzionare con Arduino, allora utilizzate queste librerie. Nel caso invece non siano state fornite, potete provare con una di queste due librerie:
- [download id=”78″]
(Fonte: http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/LiquidCrystal_I2C.zip) - [download id=”79″]
(Fonte: http://magnusglad.se/LiquidCrystal_I2C.rar)
A livello di software, dobbiamo fare queste modifiche:
#include <Wire.h> // Comes with Arduino IDE #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C LCD(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address 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;//1 secondo 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 //dati dello slider unsigned long LgBinarioInMm=920;//!< Lunghezza utile del binario in millimetri (utile perchè dobbiamo togliere lo spazio occupato dal carrello) float MotorStepSize = 1.8f;//!< l'angolo di step del motore , solitamente 1,8° float PassoCinghia = 5;//!< Il passo della cinghia, solitamente T5 float DentiPuleggiaMotrice = 16;//!< Il numero di denti della puleggia motrice float Riduttore = 14; // Se abbiamo interposto un riduttore tra motore e puleggia, inserire qui il valore //calcoliamo ora il numero di passi necessari per compiere float StepNecessari = LgBinarioInMm * Riduttore * (360.0f / MotorStepSize) / (PassoCinghia * DentiPuleggiaMotrice); //dividendo questo valore trovato per il numero di foto da scattare si ha il numero di passi da far eseguire per muovere ogni volta il motore. //poichè il risultato ottenuto potrebbe essere un numero decimale, arrotondiamo direttamente il valore. //in questo modo evitiamo eventuali differenze di arrotondamento che possono capitare ma soprattutto //manteniamo costante lo spazio percorso. //Con questo arrotondamento, può succedere che lo spazio percorso non sia tutto lo spazio utile, ma in teoria si dovrebbero perdere solamente alcuni //millimetri. float NumeroPassiStep= StepNecessari / (float) NumeroFotoDaScattare; 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 LCD.begin(20,4); // initialize the lcd for 20 chars 4 lines and turn on backlight pinMode(A4, OUTPUT); pinMode(A5, OUTPUT); TempoInizioPasso=millis(); NumeroPassi = NumeroPassiStep; LCD.clear();//cancelliamo lo schermo LCD.print("Intervallometro ");//un titolo LCD.print(NumeroFotoDaScattare-NumeroFotoScattata);//numero di foto mancanti LCD.setCursor(0,1);//spostiamo il punto di scrittura del testo alla colonna 0 riga 1 LCD.print("Movimento:"); LCD.setCursor(0,2);//spostiamo il punto di scrittura del testo alla colonna 0 riga 2 LCD.print("Scatto :"); LCD.setCursor(0,3);//spostiamo il punto di scrittura del testo alla colonna 0 riga 3 LCD.print("Num.Foto :"); } void loop(){ if (NumeroFotoScattataif (millis() - TempoInizioPasso > Attesa) { //cancelliamo i testi precedenti LCD.setCursor(10,1);//spostiamo il punto di scrittura del testo alla colonna 10 riga 1 LCD.print(" "); LCD.setCursor(10,2);//spostiamo il punto di scrittura del testo alla colonna 10 riga 2 LCD.print(" "); TempoInizioPasso = millis(); AccendiLed(); Motore(); SpegniLed(); LCD.setCursor(10,1);//spostiamo il punto di scrittura del testo alla colonna 10 riga 1 LCD.print("Effettuato"); Scatta(); LCD.setCursor(10,2);//spostiamo il punto di scrittura del testo alla colonna 10 riga 1 LCD.print("Effettuato"); NumeroFotoScattata++;//Incrementiamo il numero di foto scattate. //Scritta in questo modo, questa riga equivale a //NumeroFotoScattata = NumeroFotoScattata + 1 LCD.setCursor(10,3);//spostiamo il punto di scrittura del testo alla colonna 10 riga 3 LCD.print(" "); LCD.setCursor(10,3);//spostiamo il punto di scrittura del testo alla colonna 10 riga 1 LCD.print(NumeroFotoScattata); LCD.print(" di "); LCD.print(NumeroFotoDaScattare); LCD.setCursor(16,0);//spostiamo il punto di scrittura del testo alla colonna 16 riga 0 LCD.print(NumeroFotoDaScattare-NumeroFotoScattata);//numero di foto mancanti LCD.print(" ");//scriviamo questo spazio per cancellare eventuali residui } } } 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); }
Leave a Reply