CHDK

My camera was point-and-shoot Canon A1100is. I epoxied cardboard tube over the camera lens so that it could stick out through the walls of the box.

Canon A1100is

Canon A1100is

The camera was configured to take a picture every 5 seconds. If you’re a Canon user, you know that it’s not a standard functionality that comes with the camera. I used Canon Hack Development Tookit (CHDK) to program the camera. It took a bit of experimentation to come up with the following camera “upgrade” process:

Step 1. Used “STICK” utility to format the SD card and install CHDK onto it.

Step 2. My SD card was 16GB, so STICK created two partitions: one for CHDK and one for photos. I used “WASP” utility to swap the two partitions and make the right one visible to Windows.

Step 3. Copied this script to SD card, into “scripts” directory

--[[ High Altitude Balloon Camera script for Canon A1100is
@title Balloon Camera
@param    i Shot Interval
 @default i 5
 @range   i 1 60
@param    d Display
 @default d 0
 @values  d 0 1
--]]


props = require("propcase")
set_console_layout(1 ,1, 60, 15 )
print_screen(-1)
print("HAB Camera")
print(os.date())
sleep(1000)

local is_record, is_video, mode_number
is_record, is_video, mode_number = get_mode()
mode_number = bitand(mode_number, 0xFF)
if (mode_number ~= 2) then
    print("!!! WRONG MODE "..mode_number.." !!!")
    print("!!! WRONG MODE "..mode_number.." !!!")
    print("!!! WRONG MODE "..mode_number.." !!!")
    print("Set P mode and restart camera")
    sleep(10000)
    post_levent_to_ui('PressPowerButton')
end


-- conf.subj_dist_override_koef = SD_OVERRIDE_INFINITY
if (get_config_value(108) ~= 2) then
    print("Enabling distance override")
    set_config_value(108, 2)
    sleep(500)
end


if (is_record == false) then
    print("Switching to photo capture")
    set_record(1)
    while (get_mode() == false) do sleep(100) end
    sleep(1000)
end


print("Setting AF-Lock")
set_aflock(1)
set_prop(props.AF_LOCK, 1)
sleep(1000)


print("Setting focus to infinity")
set_focus(60000)
sleep(3000)


local image_count = 0
print("---")

while(true)
do
    if ((image_count == 3) and (d == 0)) then
        print("Turning off display...")
        sleep(3000)
        set_lcd_display(0)
        sleep(1000)
    end

    image_count = image_count + 1
    local battery_voltage = get_vbatt()
    local temperature = get_temperature(0)
    local disk_kb = get_free_disk_space()
    local disk_mb = disk_kb / 1024

    print("Time: "..os.date())
    print("Battery: "..battery_voltage.." mV")
    print("Temp: "..temperature.." C")
    print("Space: "..disk_mb.." MB")

    if (disk_mb < 10) then
        print("Out of disk space!")
        break
    end

    print("Image: "..image_count)
    press("shoot_half")
    repeat sleep(50) until get_shooting() == true

    local av = get_av96()
    local sv = get_sv96()
    local tv = get_tv96()
    local bv = get_bv96()
    local fc = get_focus()
    print("Exposure: AV="..av.." SV="..sv.." TV="..tv.." BV="..bv)
    print("Focus: "..fc)

    press("shoot_full")
    sleep(500)
    release("shoot_full")

    repeat sleep(50) until get_shooting() == false
    release("shoot_half")

    print("File: "..get_exp_count());
    print("---")

    sleep(i * 1000)
end

print("Power down")
post_levent_to_ui('PressPowerButton')

Step 4. Swapped partitions again, made SD card write-protected, and put it into the camera.

Step 5. Configured camera:

  1. Reset all settings
  2. Went to settings and set:
    • AF Frame = center
    • AF Assist beam = off
    • IS mode = off
    • Mute = on
    • Power saving = off
    • Review = off
  3. Switched camera to…
    • Mode dial = P
    • Face select = off
    • Exposure = evaluative
    • Focusing zone = infinity

Step 6. Configured CHDK:

  • Override subject distance = Inf
  • Disable overrides on startup = off
  • Enable custom ISO = on
  • Minimum shutter speed = 1/500
  • Load script from file = HAB_Cam.lua
  • Autostart = on
  • Restart on Lua error = on

Step 7. Tested it. Once the camera is switched on, it automatically loaded the script, extended the lens, and started shooting every 5 seconds. After 3 shots, it turned off LCD screen to save power. It continued shooting until it ran out of batteries or disk space on SD card.