Balloon Photography Camera Setup


You are here: Andrew Ho > Balloon Photography > Camera

One of the most expensive parts of an aerial photography system is often the camera. The typical camera rigs is either a high end digital SLR or recent point and shoot model, with a remote actuator (sometimes a homemade solenoid monstrosity, sometimes built-in). A nice simple option is to get a camera with a built-in intervalometer (time-lapse) feature (you can search for cameras with time-lapse at dpreview.com).

In my case, I was lucky enough to inherit a lost and found Canon PowerShot SD1000, which Ari Gesher found at Burning Man. Many later-model Canon PowerShot compact cameras can be hacked to run a custom firmware, thanks to the CHDK project. This page contains information on using CHDK with the Canon PowerShot SD1000.

Checking Canon PowerShot Firmware Version

There is a simple procedure for checking the firmware version on a Canon PowerShot. Here are the steps, and their results, for my particular model:

  • Create an empty file named ver.req on an otherwise empty SD card.
  • Put the SD card in the camera while it is off, flip to playback mode, and turn it on.
  • Hold down the FUNC. SET button, and press the DISP. button.
  • While still holding down FUNC. SET, press DISP. again to see a second screen of information.

The first firmware information screen from my camera:

Canon IXY DIGITAL 10
P-ID:314F  NT V

Firmware Ver GM1.00C
E18
Jan 24 2007   12:38:14

And, the second firmware information screen:

Canon IXY DIGITAL 10
P-ID:314F  NT V
 
Adj Ver.006.000
ZoomLensError
2008.07.19 02:19:12

A note on naming: what we call the PowerShot line in the U.S. and Canada is "IXY Digital" in Japan, or "Digital IXUS" in the rest of the world. For my camera, I needed CHDK firmware file ixus70_sd1000-100c-0.9.9-872-full.zip from the CHDK Autobuild download server.

Installing CHDK on the Camera

The CHDK installation instructions are found on a readme.txt file that are in the downloaded ZIP file. Essentially, the instructions are as follows:

  • Unzip the files onto the root of an empty SD card.
  • Put the SD card in the camera while it is off, flip to playback mode, and turn it on.
  • Press the MENU button, and navigate to the last menu item, Firm Update....
  • Press the FUNC. SET button to select that option, and select and click OK on the confirmation prompt.

CHDK should load and show a small red splash screen. When you place the camera back into photo taking mode, you should notice a new, dynamically updating battery meter on the top center of the LCD display. To activate the CHDK menu system, press the "direct print" button (that's the button with a dot to the upper left of the navigation keypad), and you should see a blue <ALT> symbol on the lower edge of the screen. Press the MENU button for the CHDK main menu.

By default, CHDK needs to be reloaded every time you turn the camera on. I followed the directions for making CHDK load automatically at startup, to save an extra step each time the camera turns on. Note that I am using a 4GB SD card, so I had to follow the extra step of reformatting the SD card with FAT16.

Intervalometer Script

There are a ton of CHDK intervalometer scripts out there, but, I went ahead and wrote my own anyway. It also takes the additional step of always disabling the flash. This was tricky, for some reason, get_prop(16) always returns 0 for me, and I had to use the (supposedly equivalent) get_flash_mode() instead. Here's the script (you can also download interval.lua):

--[[
@title Intervalometer
@param a Interval (min)
@default a 0
@param b Interval (sec)
@default b 30
--]]

-- Convert interval to ms
interval = 1000 * ((60 * a) + b)

-- Turn off flash
flash_mode = get_flash_mode()
if(flash_mode ~= 2) then
    print('Disabling flash...')
    while(flash_mode ~= 2) do
        press('right')
        release('right')
        flash_mode = get_flash_mode()
    end
    print('Flash disabled.')
    sleep(500)
else
    print('Flash is off.')
end

-- Take pictures at regular intervals
print('Shooting every', ((60 * a) + b), 'sec...')
sleep(500)
i = 1
while(1) do
    start_tick = get_tick_count()
    shoot()
    print('Photo', i)
    i = i + 1
    sleep(interval - (get_tick_count() - start_tick))
end


Andrew Ho (andrew@zeuscat.com)