chdk

Shutter Speed Stack

Written for: Canon S2 IS (will likely work for other camera)

This script sets and stacks shutter speeds including override shutter speeds if available. It also estimates and displays the shutter speed in seconds (eg: 2.3s) or fraction seconds (eg: 1/4000s). Can be used for single shots, multiple shots with changing shutter speed and multiple shots with static shutter speed.

Documentation


There are 7 parameters that can be set:

When starting the script, the start and end shutter speeds will be calculated and presented on-screen (only start if 1 shot), the user then hits set to accept or any other key to cancel. The script will then take the shots required. For each shot, the shutter speed will be displayed, as well as the shutter value.
EG:

a =  3
b = -11
c =  2
d =  2
e = -1

2 shots to be taken, step size = -1/3EV (e/a)
start EV = -11 2/3
end EV = -12
Tv Start ~1/3243 s
Tv End ~1/4096 s


Script Code (save as "ShutterSpeed.bas" in your /CHDK/SCRIPTS folder)

rem Author: barberofcivil
rem Tested on S2/A570

@title Shutter Speed
@param a EV fraction (1/x EV)
@default a 3
@param b Start Tv (1EV)
@default b -11
@param c Start Tv (1/xEV)
@default c 0
@param d No.Shots
@default d 1
@param e Step Size (y/x EV)
@default e 1
@param f Start Delay (s)
@default f 0
@param g Delay between shots (s)
@default g 0

cls
if f<0 then f=0
if g<0 then g=0
if d<1 then d=1
if a<1 then a=1
if c>=a then c=a-1
if c<0 then c=0
if b<0 then c=-c

if d=1 then print "One shot to be taken" else print d,"shots to be taken"
if d=1 or e=0 then gosub "Single" else gosub "Multiple"

print "Click <set> to proceed"
print "Any button to cancel"

wait_click
is_key z "set"
if z=1 then print "Proceeding..." else gosub "Cancel"

while f>0
  print "Starting in",f,"s..."
  sleep 1000
  f=f-1
wend

print "Starting shots now..."

for i=1 to d
  cls
  print "Shot",i,"of",d
  gosub "ShutterCalc"
  if k>=(2*a) then print "Shutter ~1/"o,"s" else print "Shutter ~"r"."st,"s"
  print "Shutter value:",p
  set_tv96_direct p
  shoot
  sleep 1000*g
next i

end

:ShutterCalc
  k=(1-i)*e-b*a-c
  l=(k/a/4)*4*a
  if k<0 then l=l-4*a
  m=1
  for j = 1 to (l/a/4+3)
    m=m*16
  next j
  m=m/16
  h=(k-l)
  j=(((((((((30*h*h*h)/(4*a))*h)/(4*a))*h)/(4*a))*243)/(4*a))*7)
  j=j-(((((((30*h*h*h)/(4*a))*h)/(4*a))*254)/(4*a))*4)
  j=j+(((((30*h*h*h)/(4*a))*227)/(4*a))*9)
  j=j+(((30*h*h*307)/(4*a))*3)
  j=j+(30*h*850)
  o=(((((((j/(18000)+1)/2)+a)*m)/(128*a)+1))/2)
  p=(k*96)/a
  q=(((51200*a)/(((((j/18000)+1)/2)+a)*m)+1)/2)
  r=q/100
  s=(q-r*100)/10
  t=q-r*100-s*10
return

:Cancel
  print "Shots cancelled"
  end

:Single
  if e=0 and d>1 then print "Tv locked (step=0)"
  i=1
    gosub "ShutterCalc"
    if k>=(2*a) then print "Tv: ~1/"o,"s" else print "Tv: ~"r"."st,"s"
return

:Multiple
  i=1
    gosub "ShutterCalc"
    if k>=(2*a) then print "Tv Start: ~1/"o,"s" else print "Tv Start: ~"r"."st,"s"
  i=d
    gosub "ShutterCalc"
    if k>=(2*a) then print "Tv End:   ~1/"o,"s" else print "Tv End:   ~"r"."st,"s"
return

--Barberofcivil