Ragazzi è con sommo piacere che vi presento il risultato di 3 giorni intensivi di lavoro!
L' intervallometro\trigger luminoso portatile!
L'oggettino permette di controllare gli scatti di qualsiasi (teoricamente) macchina fotografica che presenta un ingresso per telecomando a filo.
Le modalità di funzionamento sono 2: intervallometro e scatto su rilevazione luminosa.
L'intervallometro permette di far scattare foto ogni tot di secondi, questo permette la creazione di video cosiddetti timelapse.
Il rilevatore luminoso permette, con un po' di fantasia, svariati utilizzi: è possibile scattare foto con una torcetta, cercare di catturare fulmini ed infine fare foto ad alta velocità con l'ausilio si un laser che viene interrotto dall'oggetto che si vuole scattare.
Il cuore, per ovvi motivi di spazio non è arduino ma un attiny45, ovviamente però è stato programmato con arduino in modalità ISP.
La modalità viene selezionata tramite un potenziometro, alla quale ho associato una scala di valori (vorrei farmi quindi un'etichetta che indica le diverse impostazioni). le prime 3 posizioni servono per indicare la sensibilità della fotoresistenza, mentre le successive aumentano l'intervallo in modalità intervallometro.
Il led rosso è collegato al focus, serve per capire quando viene triggherata la fotocamera.
Il led giallo rimane fisso se si è in modalità fotoresistenza, mentre lampeggia se è in modalità intervallometro.
La batteria è una tonda da 3.3v con piedini presaldati ed è removibile.
queste le foto:
pronto ad essere inscatolato (si lo so, sono artistico nel fare i circuiti):
Inscatolato:
Vista fotoresistenza:
Questo è il codice:
/* Portable photo trigger
created 2011
by Lorenzo Boasso
*/
// pin digitali
int wakePin = 0;
int shotPin = 1;
int ledActivePin = 2;
// pin analogici
int lightPin = 3;
int configPin = 2;
// valori opzionali - più valori si mettono è più sensibile sarà la precisione della selezione
#define LENARRAY 12 // attenzione, questo valore deve corrispondere al numero di elementi dell'array
int confArray[LENARRAY] = {4,30,80,5, 8,15,30,60,180,600,1800,3600};
int ledBlinkWait = 1000;
int ledState = LOW;
int lightSet = 0;
long prevBlinkMillis = 0;
long prevShotMillis = 0;
int prevLight = 0;
int selection = 0;
int wakeInteval = 500; // quanti millisecondi prima dello scatto viene premuti il wake
unsigned long currentMillis = 0;
void setup() {
// CONFIGURAZIONE PIN
// scatto
pinMode(wakePin, OUTPUT);
pinMode(shotPin, OUTPUT);
// led
pinMode(ledActivePin, OUTPUT);
// spengo tutto
digitalWrite(wakePin, LOW);
digitalWrite(shotPin, LOW);
// trigger attivo
digitalWrite(ledActivePin, HIGH);
currentMillis = millis();
prevShotMillis = millis();
prevBlinkMillis = millis();
}
void loop()
{
selection = analogRead(configPin);
selection = map(selection,0, 1023, 1, LENARRAY) ;
currentMillis = millis();
if (selection <5){ // i primi 4 valori si riferiscono al trigger lumninoso
// modalita fotoresistenza
digitalWrite(ledActivePin, HIGH);
int lightVal = analogRead(lightPin);
if ((prevLight - lightVal > confArray[selection]) ||(lightVal - prevLight > confArray[selection]) ){
wakeUp();
delay(100);
shot();
delay(200);
}
prevLight = analogRead(lightPin);
}else{
// modalità intervallometro
blinkLed();
if((currentMillis - prevShotMillis) > ((confArray[selection]*1000)-wakeInteval)) {
wakeUp();
}
if((currentMillis - prevShotMillis) > (confArray[selection]*1000)) {
shot();
}
}
}
void wakeUp(){
digitalWrite(wakePin, HIGH); //turn wakeup/focus on
}
void shot(){
// save the last time you blinked the LED
prevShotMillis = currentMillis;
digitalWrite(shotPin, HIGH); //turn wakeup/focus on
delay(100); //faccio durare qualche istante la pressione del tasto
// rilascrio tutto
digitalWrite(shotPin, LOW); //turn wakeup/focus on
digitalWrite(wakePin, LOW); //turn wakeup/focus on
}
void blinkLed(){
// if the LED is off turn it on and vice-versa:
unsigned long currentMillis = millis();
if(currentMillis - prevBlinkMillis > ledBlinkWait) {
prevBlinkMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(ledActivePin, ledState);
}
}
Ovviamente il codice non è perfetto. Purtroppo non riuscivo più a programmare l'attiny45, quindi mi sono tenuto quello che c'era.
Mi piacerebbe pensare come migliorare ogni aspetto del progetto per farne una versione 2.0 !! Accetto suggerimenti e consigli.