DIY – Slitta Macro Motorizzata con Arduino


Bentornati ragazzi in un nuovo tutorial firmato sempre S.V. Design!

Ciò che vi presento oggi è una semplice slitta macro, motorizzata grazie ad arduino e comandata a distanza con un telecomando ad infrarossi.

WP_20150725_010

Il progetto è un tantino complicato e lungo (parliamo di 1 ora di filmato spiegato nei minimi dettagli), ma la soddisfazione nei risultati ottenuti con la tecnica del focus stacking è grandissima!

A cosa serve?

Una slitta macro di per sé serve ad effettuare degli scatti consecutivi da sommare al pc tramite appositi softwares per eseguire appunto la tecnica del focus stacking.

La nostra versione permette di motorizzare una comune slitta manuale, e di fornire la comodità di impartire ordini tramite un telecomando ad infrarossi (compreso lo scatto della reflex).

 

Cos’è il Focus Stacking?

Il focus stacking è una tecnica che consiste nel fare numerosi scatti ad un oggetto, utilizzando il sweet spot del nostro obiettivo macro (il diaframma che garantisce maggior nitidezza), e spostando la messa a fuoco uno scatto per volta.

Gli scatti macro a diaframmi aperti non godono di una profondità di campo molto elevata, e man mano che il rapporto di ingrandimento aumenta, la profondità di campo scende.

Unendo poi tramite appositi softwares dedicati (o anche photoshop) gli scatti effettuati con messa a fuoco spostata, otterremo l’oggetto completamente a fuoco.

 

Esempio finale del progetto:

20150808125849__DSC0276

Scatto Singolo

Final

Scatti uniti con focus stacking

 

 

 

 

 

 

 

 


 

Di seguito il video in cui vi mostro come realizzare il tutto!

Video

 

 

Script per arduino

#include <LiquidCrystal.h>
#include <IRremote.h>
#include <EEPROM.h>

int A = 12;
int B = 11;
int C = 10;
int D = 9;


int scatto = 8;

int inOpzioni = 0;
int opzione = 0;

// le opzioni
int sequenziale = 0;
int delayScatti = 1000;
int giri = 20;
long del = 5;

int fermaAuto = 0;

int IRpin = 13;  // pin for the IR sensor
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);
IRrecv irrecv(IRpin);
IRrecv irrecv2(IRpin);
decode_results results;
decode_results results2;
long lastButton;
long currentButton;

void setup() {
analogWrite(6, 100);
lcd.begin(16, 2);
// Visualizzo il messaggio sul display
lcd.print("Slitta Macro by");
lcd.setCursor(0,1);
lcd.print("Stefano Venneri");

sequenziale = EEPROM.read(0);
delayScatti = EEPROM.read(1) * 50;
giri = EEPROM.read(2);
del = EEPROM.read(3);

irrecv.enableIRIn(); // Start the receiver
irrecv2.enableIRIn(); // Start the receiver

pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);

pinMode(scatto, OUTPUT);
}

void loop() {

if (irrecv.decode(&results))
{
irrecv.resume();   // Receive the next value

currentButton = results.value;
if(currentButton != 4294967295)
{
lastButton = currentButton;
eseguiAzione(currentButton);
}
else
{
eseguiAzione(lastButton);
}



}
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
//lcd.setCursor(0, 1);
// stampa il numero di secondi dall'ultimo reset
//lcd.print(millis()/1000);
}

void scatta()
{
digitalWrite(scatto, HIGH);
delay(50);
digitalWrite(scatto, LOW);
}

void eseguiAzione(long codice)
{
//lcd.clear();
//lcd.print(codice);

// CH-  = -484956645, 16753245, -378317452, 718180748
// CH   = 5316027, 16736925
// CH+  = 16769565, -293048961, 1981317878
// PREV = 1386468383, 16720605,
// NEXT = 16712445, -672642277,
// PLAY = 16761405, 553536955
// -    = 16769055, -260652741
// +    = 16754775, -1547112997, 958999734
// EQ   = 16748655, -439370369, -1189597540, 1028347518, 87006896, -684479918
// 0    = 16738455, -1056840325
// 100+ = -1756873733, 16750695
// 200+ = 16756815, -255584701
// 1    = 16724175, -1760117185
// 2    = 16718055, 1033561079
// 3    = 16743045, 1635910171
// 4    = 16716015, -1943902853
// 5    = 16726215, 1217346747
// 6    = 16734885, 71952287
// 7    = 851901943, 16728765
// 8    = 16730805, 465573243
// 9    = 16732845, 1053031451

if(codice == 1386468383 || codice == 16720605)
{
// PREV
if(inOpzioni == 0)
{



for (int i=0; i<=giri; i++)
{
lcd.clear();
lcd.print("<< Indietro");
indietro();
}



lcd.clear();
lcd.print("Slitta Macro by");
lcd.setCursor(0,1);
lcd.print("Stefano Venneri");
}
}
else if(codice == 16712445 || codice == -672642277 || codice == -102056138)
{
// NEXT
if(inOpzioni == 0)
{


for (int i=0; i<=giri; i++)
{
lcd.clear();
lcd.print("Avanti >>");
avanti();
}


lcd.clear();
lcd.print("Slitta Macro by");
lcd.setCursor(0,1);
lcd.print("Stefano Venneri");
}
}
else if(codice == 16748655 || codice == -439370369 || codice == -1189597540 || codice == 1028347518 || codice == 87006896 || codice == -684479918)
{
// EQ (OPZIONI)
inOpzioni = 1;

opzione += 1;

if(opzione > 4)
{
opzione = 1;
}

mostraOpzioni(opzione);
}
else if(codice == 16761405 || codice == 553536955)
{
// PLAY (salva impostazioni/ferma autoscatto)
if(inOpzioni == 1)
{
// salva impostazioni
inOpzioni = 0;
opzione = 0;

// salvo i dati
EEPROM.write(0, sequenziale);
EEPROM.write(1, (delayScatti / 50));
EEPROM.write(2, giri);
EEPROM.write(3, del);


lcd.clear();
lcd.print("Dati Salvati!");
lcd.setCursor(0,1);
lcd.print(".............");

delay(1000);

lcd.clear();
lcd.print("Slitta Macro by");
lcd.setCursor(0,1);
lcd.print("Stefano Venneri");
}
else
{
// ferma autoscatto

fermaAuto = 1;

}
}
else if(codice == 16754775 || codice == -1547112997 || codice == 958999734)
{
// +
if(inOpzioni == 1)
{
if(opzione == 1)
{
if(sequenziale == 0)
{
sequenziale = 1;
}
else
{
sequenziale = 0;
}
}
else if(opzione == 2)
{
delayScatti += 100;
}
else if(opzione == 3)
{
giri += 1;
}
else if(opzione == 4)
{
del += 1;
}

mostraOpzioni(opzione);
}
}
else if(codice == 16769055 || codice == -260652741)
{
// -
if(inOpzioni == 1)
{
if(opzione == 1)
{
if(sequenziale == 0)
{
sequenziale = 1;
}
else
{
sequenziale = 0;
}
}
else if(opzione == 2)
{
if(delayScatti > 100)
{
delayScatti -= 100;
}
}
else if(opzione == 3)
{
if(giri > 1)
{
giri -= 1;
}
}
else if(opzione == 4)
{
if(del > 4)
{
del -= 1;
}
}

mostraOpzioni(opzione);
}
}
else if(codice == 5316027 || codice == 16736925)
{
lcd.clear();
lcd.print("Scatto!");
scatta();
}
else if(codice == 16769565 || codice == -293048961 || codice == 1981317878 || codice == 176854242)
{
// CH+



scatta();

delay(delayScatti);
for (int i=0; i<=giri; i++)
{
lcd.clear();
lcd.print("Autoscatto >>");
avanti();
}

if (irrecv2.decode(&results2))
{
irrecv2.resume();
eseguiAzione(results2.value);
}

if(sequenziale == 1 && fermaAuto == 0)
{
delay(500);

eseguiAzione(16769565);
}
else
{
fermaAuto = 0;


lcd.clear();
lcd.print("Slitta Macro by");
lcd.setCursor(0,1);
lcd.print("Stefano Venneri");

}

}
else if(codice == -484956645 || codice == 16753245 || codice == -378317452 || codice == 718180748)
{
// CH-



scatta();

delay(delayScatti);
for (int i=0; i<=giri; i++)
{
lcd.clear();
lcd.print("<< Autoscatto");
indietro();
}

if (irrecv2.decode(&results2))
{
irrecv2.resume();
eseguiAzione(results2.value);
}

if(sequenziale == 1 && fermaAuto == 0)
{
delay(500);

eseguiAzione(16753245);
}
else
{
fermaAuto = 0;


lcd.clear();
lcd.print("Slitta Macro by");
lcd.setCursor(0,1);
lcd.print("Stefano Venneri");

}
}
}

void mostraOpzioni(int opz)
{
if(opz == 1)
{
lcd.clear();
lcd.print("Autoscatto?");
lcd.setCursor(0,1);
if(sequenziale == 0)
{
lcd.print("NO");
}
else
{
lcd.print("SI");
}
}
else if(opz == 2)
{
lcd.clear();
lcd.print("Delay scatti");
lcd.setCursor(0,1);
lcd.print(delayScatti);
}
else if(opz == 3)
{
lcd.clear();
lcd.print("Giri motore:");
lcd.setCursor(0,1);
lcd.print(giri);
}
else if(opz == 4)
{
lcd.clear();
lcd.print("Velocita motore:");
lcd.setCursor(0,1);
lcd.print(del);
}
}

void avanti()
{
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
delay(del);

digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
delay(del);

digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
delay(del);

digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
delay(del);


}

void indietro()
{
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
delay(del);

digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
delay(del);

digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
delay(del);

digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
delay(del);



}



Lascia un commento

%d blogger hanno fatto clic su Mi Piace per questo: