Focus Stacking
Macro rail for Focus Stacking with my Stackduino-G1
Da sempre interessato alla macrofotografia e dopo aver scoperto di recente le notevoli potenzialità offerte dai sistemi di focheggiamento automatizzati, ho indagato sulla possibilità di realizzare una slitta motorizzata DIY per il Focus Stacking. Un progetto open source, ormai abbastanza datato ma pur sempre valido, chiamato Stackduino ha attirato la mia attenzione. E' un sistema completo per l'automazione di sequenze fotografiche macro (e micro) con l'uso di slitte micrometriche motorizzate, comandato dall'immancabile Arduino. L'autore di Stackduino ha reso disponibile disegni e files utili alla realizzazione della PCB, che però è del tipo a doppia faccia, non proprio facile a farsi 'in casa', nonchè il software di controllo per l'Arduino. Ho notato inoltre che il codice fornito, dopo averlo testato su breadboard, aveva bisogno di qualche piccola correzione. Non sono un programmatore esperto ma visto che il codice è relativamente semplice e molto ben documentato, mi sono cimentato nell'implementazione di alcune funzioni addizionali, che mi sembravano utili per rendere il sistema un pò più completo e versatile.
The Focus Rail and carriage
La slitta motorizzata è stata realizzata interamente con materiali di facile reperibilità, sia da brico center (basamento in Medium Density, profilati di alluminio e bulloneria varia, pannelli in lexan di recupero) che da ebay (ruote in nylon con cuscinetti, motore stepper e giunto flessibile, piastra e quick release clamp). L'idea di base è stata quella di utilizzare quattro piccole ruote in nylon (dotate di cuscinetti a sfera) che scorrono, vincolate su di un carrellino in lexan (ma può essere realizzato anche in legno o alluminio), lungo una slitta a bordi arrotondati, ottenuta accoppiando due semplici profilati di alluminio, cosiddetti 'ad unghia', e fissati su di un'altrettanto semplice profilato rettangolare 30x15. Nelle foto qui sotto, una versione preliminare fatta per verificarne la fattibilità, modificata poi per renderla più stabile
e per alloggiare il blocchetto contenente la coppia di bulloni con molla di compressione (semplice modalità di realizzazione di un accoppiamento 'backlash' per il recupero dei giochi, qui a destra nella foto).
Alle estremità della guida lineare ho fissato due piastre in lexan (strette al profilato di base mediante due barrette filettate M4 inserite all'interno del profilato stesso) che supportano altrettante piastrine in medium density, regolabili in posizione per un corretto centraggio della barra filettata principale (lead screw, M8x1.25). La lead screw ruota liberamente su cuscinetti a sfera, alloggiati incastonati nelle piastre di MD.
La motorizzazione della slitta è ottenuta grazie ad uno stepper (motore passo-passo) tipo bipolar NEMA14, piccolo, economico ma più che sufficiente per questo scopo.
La slitta è dotata di due micro-switches alle estremità che fungono da interruttori di sicurezza ed entrano in funzione interrompendo il movimento nel caso il carrello raggiunga i limiti fisici di traslazione della slitta. I segnali elettrici necessari al funzionamento della slitta (4 per lo stepper e 2 per i limit-switches) convergono in un unico connettore RJ11, come si vede nella foto qui a destra.
Rail partlist (main components):
- Aluminium profiles (rectangular 30x15mm and rounded 18x1mm)
- Medium Density plates for base (15mm) and bearing holders (10mm)
- Lexan plates (4 and 5mm for lead screw supports and carriage main structure)
- Bearings for lead screw MD plates (22mm ext. diameter)
- Lead screw (steel, M8x1.25)
- Groove Nylon ball bearings wheels (8*30*10mm)
- Clamp for quick release plate
- Flexible shaft coupler (5/8mm)
- Stepper bipolar NEMA14 (5mm shaft diameter)
The Electronics
La parte elettronica ovviamente è basata sul progetto originale dello Stackduino ma realizzato con sostanziali differenze.
La sezione Arduino (in origine integrata direttamente nella scheda) ho preferito mantenerla separata, utilizzando un Arduino Nano. Ho separato la componentistica su due 'stacked boards' per contenere al massimo le dimensioni finali della scatola di controllo. Ho infine aggiunto un paio di LEDs, un push-button addizionale (vedremo le funzioni di questi più avanti), ho sostituito al connettore DB9 un RJ11 6P/6C ed ho aggiunto un secondo resistore variabile (trimmer) per la regolazione della retroilluminazione del display. Un primo trimmer era già previsto per la regolazione del contrasto. Nella versione originale era prevista la possibilità di muovere manualmente il carrello (pulsanti FWD e BWD), io ho voluto aggiungere una opzione FAST che permette di muovere manualmente con due velocità selezionabili con il push-button addizionale. I LEDs segnalano, uno la condizione di stacking attiva, l'altro segnala lo scatto della macchina fotografica (utile soprattutto in fase di test e calibratura del sistema, in quanto si può evitare di collegare la reflex e verificare comunque l'avvenuto scatto).Nella prima board, quella inferiore, sono alloggiati l'Arduino Nano, il driver EasyDriver 4.4 con un micro-switch dedicato all'eventuale selezione dei microsteps, il Power jack, il connettore RJ11 per collegare la slitta e l'interruttore di accensione principale. Nella seconda board, i trimmer per la regolazione di contrasto e luminosità del display (entrambi da 5K), i LEDs, i pulsanti e l'encoder di controllo, gli optocoupler e la presa jack da 3.5 per la connessione della reflex.
Ho predisposto un modulo step-down da 5V (saldato in SMD sul lato rame della scheda superiore) per alimentare il display, poichè ho notato che quest'ultimo presentava problemi di 'flickering'
(variazione del contrasto) in concomitanza con il funzionamento del motore. Separando le due alimentazioni (motore e display) il fastidioso tremolio è sparito.
Le due schede sono impilate ed i collegamenti reciproci sono assicurati da due strips di pins 'lunghi' (15mm nella parte inferiore, rivolta alla PCB inferiore). Per contenere la dimensione verticale dell'insieme ho provveduto ad 'accorciare' i piedini di Arduino ed EasyDriver così da poter utilizzare zoccoli di supporto di tipo 'low profile' (NB: questi ultimi non sono riuscito a trovarli sul web mentre si possono acquistare, purtroppo un po carucci ... nei nostri negozi di elettronica). Come si può vedere nelle immagini qui sotto, gli zoccoli low-profile hanno altezza 5mm (meno della metà di quelli tradizionali), inoltre sfilando i distanziali in plastica nera dai pin dell'EasyDriver ho potuto montare anche un dissipatore in alluminio sul chip Allegro del driver. Nella galleria di immagini al fondo potete trovare le stesse immagini a maggior risoluzione.
Il pannello superiore della scatola è in lexan 4mm, opportunamente forato in modo da accedere ai pulsanti (tramite semplici ribattini di alluminio), all'encoder ed ai trimmer del display.
La scheda può essere alimentata a 7-12V, come da specifica Arduino e dipende dalla tensione di esercizio dello stepper. Nel mio caso 7.5V vanno benissimo per il NEMA14 che ho in dotazione.
L'encoder serve per la navigazione del menù, di cui più sotto sono elencate le varie voci. Ruotando il perno in senso orario si passa da una voce di menù a quella successiva mentre in senso antiorario si torna alla precedente, in modo ciclico. Una volta individuata la funzione che ci interessa possiamo variarne il valore premendo e rilasciando centralmente la rotella dell'encoder (questo attua lo switch interno dell'encoder). A questo punto siamo nella condizione di poter variare il valore della variabile corrente, sempre ruotando la rotella dell'encoder. Una volta selezionato il valore ricercato, possiamo di nuovo premere lo switch dell'encoder per uscire dalla modalità di editing. Nel caso di settaggio della Step distance è possibile incrementare il valore corrente di un fattore 10, tenendo premuto il pulsante Fast.
I pulsanti Fwd e Bwd permettono di muovere manualmente il carrello nelle due direzioni, per un veloce posizionamento della reflex rispetto al soggetto. Tenendo premuto il pulsante Fast contemporaneamente ad uno di questi due, possiamo aumentare la velocità di traslazione del carrello, in accordo con i valori che avremo definito nel menù alle voci Speed (manual) e Speed (fast manual).
Il pulsante Start/Stop avvia la sequenza automatica di stacking, oppure la interrompe manualmente nel caso di ripensamenti o emergenze. Per una spiegazione completa di tutte le funzioni disponibili sul controller, vi rimando alla tabella più sotto.
Arduino Nano pins assignment for StackDuino-G1
D1 (TX) LCD DB5
D0 (RX) LCD DB6
D2* StartStop PushButton
D3* Encoder PushButton
D4 LCD DB4
D5 LED Stck (stacking)
D6 LCD E
D7 LCD RS
D8 LCD DB7
D9 Fwd PushButton
D10 Bwd PushButton
D11 CAM Fcs (Focus)
D12 FastS PushButton
A5 Limit switches
A4 EasyDriver Enable
A3 EasyDriver Step
A2 EasyDriver Dir
A1 Encoder B
A0 Encoder A
D13 CAM Sht (Shutter)
*Reserved pins for attachInterrupt() function on Uno-Nano boards
Nella tabella qui a sinistra, l'assegnazione dei pins Arduino come definita nel firmware, differente rispetto all'originale, vuoi per l'aggiunta di alcuni componenti, vuoi per facilitare il design e layout delle tracce sulle schede PCB.
Controller boards partlist (main components):
- Trimmer-potentiometer
- 3.5mm Stereo Jack Socket
- Rotary knob 6mm
- EasyDriver
- Power jack connector 5.5x2.1mm
- UBEC Step-down 5V (SMD module)
- Adjustable Step-down (through-hole alternative to previous Step-down module)
- Arduino Nano
- 4N35 optocouplers
- Micro switch
- 20 pulse rotary encoder with switch
- DIP switch 2 positions
- RJ11 6P6C
The Stackduino-G1 firmware
Prima di passare alla spiegazione delle principali funzioni del programma di controllo, un breve appunto sul significato di Step cycle.
Ogni step di ripresa dello stacking (chiamato Step cycle) è definito dall'insieme delle fasi, una consecutiva all'altra, mostrato qui a sinistra. La sequenza di ripresa inizia con il primo Step cycle, in cui, allo scatto del primo fotogramma (Exp time) segue l'Exp post delay (pausa che permette la memorizzazione dell'immagine sulla scheda SD della reflex e l'eventuale ricarica dei flash), la fase di movimentazione del carrello tramite il motore stepper (Stage movement) ed infine una pausa per permettere al carrello di eliminare ogni eventuale vibrazione dovuta all'arresto del motore al termine del suo movimento (Motor post delay). Lo Step cycle quindi verrà ripetuto eguale per il numero richiesto di riprese (Steps).
Ora vediamo le funzionalità del programma che controlla il nostro sistema di Focus Stacking. Qui sotto una tabella che mostra tutte le voci di menù disponibili nel firmware, navigabili ed editabili tramite encoder. All'avvio del controller, dopo un paio di messaggi relativi alla lettura dei valori salvati in EEPROM e/o di default, verrà visualizzata la schermata di base (Start screen, n.1 in tabella). Da qui è possibile definire la distanza che il carrello della nostra slitta percorrerà ad ogni ciclo di stacking, ruotando l'encoder cambieremo il valore con incrementi/decrementi unitari, a meno di effettuare questa operazione tenendo premuto il pulsante 'Fast' del controller. Così facendo l'incremento/decremento sarà di 10 unità. L'unità di misura di default è il micron (um). Questo parametro è modificabile alla voce di menù n.12, potendo scegliere tra micron, millimetri o centimetri (um, mm, cm). La seconda voce di menù stabilisce il numero di immagini (Step cycle) da riprendere nell'intera sequenza di stacking. La terza opzione stabilisce se, a fine sequenza, il carrello debba o meno tornare alla posizione di partenza. L'opzione successiva definisce il tempo in cui il segnale di comando fotocamera (composto da focus e otturatore, necessari entrambi per il corretto funzionamento dello scatto reflex) viene mantenuto 'alto', normalmente 100-200 millisecondi a seconda del tipo e marca di reflex. L''Exposure post delay' è il tempo che concediamo alla fotocamera per completare il salvataggio dell'immagine appena ripresa ed eventualmente il tempo per la ricarica del flash. Il 'Motor post delay', analogamente, consente al sistema meccanico della slitta di smorzare eventuali vibrazioni dovute all'arresto del movimento del motore stepper (che per comodità e semplicità progettuale non prevede fasi di accelerazione/decelerazione). I tre campi successivi sono dedicati alle tre possibili velocità assegnate al motore durante le rispettive fasi di Stacking, Manuale e Manuale 'veloce'. Questi valori sono il tempo in microsecondi di intervallo tra un micropasso e quello successivo del motore, quindi maggiore questo valore minore sarà la velocità risultante dello stepper. Per le fasi di Stacking è bene mantenere velocità basse per evitare al minimo vibrazioni meccaniche tra uno scatto e l'altro. In manuale possiamo utilizzare velocità decisamente superiori, facendo attenzione di non superare i limiti 'fisici' del motore stepper, che potrebbe 'saltare' alcuni steps o addirittura 'stallare', fermandosi. 'Mirror lockup' permette di utilizzare la funzionalità di blocco dello specchio reflex in apertura, per quelle macchine ovviamente che lo permettono. Così anche per il 'Bracketing'. 'Save settings' permette di salvare tutti i parametri correnti nella memoria EEPROM del controller, che saranno così conservati (e caricati al successivo riavvio) anche a sistema spento. 'Load defaults' carica tutti i valori di default (che trovate indicati nella terza colonna della tabella qui sotto (tutti i valori correnti verranno sostituiti e non memorizzati). 'Load last saved' caricherà i valori ultimamente salvati in EEPROM. 'Camera test shot' farà scattare un fotogramma per verificare il corretto funzionamento del collegamento alla reflex e come inquadratura di prova. L'ultima schermata è solo informativa, fornisce il valore di microsteps che il driver invierà allo stepper ad ogni ciclo (Step cycle).
LCD screenshot
Description
1) (Start screen) This menu screen changes the distance to move each stacking step if rotary encoder button is toggled within a menu, enabled editing of menu variable with encoder.
2) This menu screen changes the number of pictures to take in the stack.
3) Toggles whether camera/subject is returned the starting position at the end of the stack.
4) Delay needed for camera to process focus and shutter signals (milliseconds).
5) This menu screen changes the number of milliseconds to wait for the camera to take a picture before moving again, you may want longer if using flashes for adequate recharge time or shorter with continuous lighting to reduce overall time taken to complete the stack (the display shows the value in seconds and 2 decimals).
6) Delay to allow vibrations from stage movement to settle (milliseconds).
7) Adjusts the stepper motor speed (delay in microseconds) between stacking steps, setting this too low (ie a faster motor speed) may cause the motor to begin stalling or failing to move at all.
8) Adjusts the stepper motor speed (delay in microseconds) in manual mode at ‘slow’ speed.
9) Adjusts the stepper motor speed (delay in microseconds) in manual mode at ‘fast’ speed.
10) This menu screen toggles mirror lockup mode - if enabled two delay-separated shutter signals are sent per image.
11) This menu screen changes the number of images to take per focus slice (ie supports bracketing).
12) Set the unit of measure to use for stacking steps: Microns, Millimimeters or Centimeteres.
13) Select and press ‘confirm!’ to save current settings in EEPROM.
14) Select and press ‘confirm!’ to load defaults settings.
15) Select and press ‘confirm!’ to load last saved settings from EEPROM.
16) Select and press ‘confirm!’ to shoot a camera’s test shot.
17) Info window. It shows the current number of microsteps used for each step slice (stepper motor phase)
Value range, increment and default value
[1-1000, 1] 20
(The increment is 10 while pressing the 'Fast' button on the controller board)
[5-500, 5] 5
[Enabled/Disabled] Enabled
[25-500, 25] 200
[0.25-10.00, 0.25] 2.00
[25-2000, 25] 500
[500-9000, 500] 2500
[500-5000, 25] 1500
[150-2000, 25] 250
[Enabled/Disabled] Enabled
[1-10, 1] 1
[um-mm-cm, 1] um
*LCD screenshots made with ‘LCD Screenshot Generator’ (http://avtanski.net/projects/lcd/)
Da notare che per le opzioni 'Save setings', 'Load defaults', 'Load last saved' e 'Camera test shot', la loro attivazione avviene premendo il pulsante-encoder, ruotando il pomello dell'encoder fino alla comparsa della scritta 'Confirm' ed infine premendo nuovamente il pulsante-encoder, come conferma, appunto.
Una nota riguardo l'interruzione della sequenza. Dopo aver avviato la sequenza di Stacking con il pulsante Start, è sempre possibile interromperla premendo nuovamente lo stesso pulsante. L'interruzione del movimento carrello tuttavia non è immediato ma potrebbe richiedere 1-2 secondi per il completamento del singolo ciclo. La conferma dell'avvenuta interruzione avverrà contemporaneamente ad un avviso sul display.
Altra nota, importante. Prima di caricare il firmware nell'Arduino Nano, occorre modifica il valore della variabile 'gear' nel file Stackduino-G1.ino, alla riga 74.
Il valore ‘gear’ va calcolato rispetto a:
- numero di passi a giro del motore
- traslazione lineare del carrello ad ogni giro del motore (in micron)
- microstepping del driver
Nel mio caso rispettivamente 200 , 1250 e 8, che si riferiscono allo stepper da 200 passi a giro, la lead screw M8x1.25 e all'EasyDriver impostato su 8 microsteps: (200/1250)*8=1.28
Calcolate e riportate questo valore in modo da riflettere le caratteristiche del vostro hardware.
Etching the boards
Nello zip che trovate a fondo pagina trovate i file SVG di grafica vettoriale per l'etching casalingo delle due schede, insieme ad altro materiale di supporto.