Kame­ra­s­teue­rung mit CHDK

Für viele Kame­ras von Canon gibt es eine Open­Source-Firm­ware­er­wei­te­rung: CHDK. Mit die­ser kann die Kamera nicht nur um zahl­rei­che Funk­tio­nen erwei­tert wer­den (z.B. Bewe­gungs­er­ken­nung, Seri­en­auf­na­men, extreme Belich­tungs­zei­ten, …), son­dern auch Scripte (uBA­SIC oder LUA) kön­nen auf der Kamera aus­ge­führt wer­den und diese steu­ern.

Unter ande­rem kön­nen Impulse am USB-Port aus­ge­wer­tet wer­den, um zum Bei­spiel eine Auf­nahme zu machen, oder das Zoom zu betä­ti­gen. Um diese Pulse aus dem Signal des Fern­steue­rungs­emp­fän­gers zu erzeu­gen kann RC-CHDK V2  von Peter Engels ver­wen­det wer­den. Mit einem Arduino las­sen sich aber auch mit weni­gen Zei­len Pro­gramm-Code diese Signale erzeu­gen.

Lange Zeit habe ich auf mei­nen Kame­ras ein selbst geschrie­be­nes Script ver­wen­det, das um im wei­tere Funk­tio­nen ergänzt wurde. Inzwi­schen habe ich aber ein tol­les Script gefun­den, das alles kann, was ich brau­che: KAP & UAV Expo­sure Con­trol Script.

Ich ver­wende jetzt nur noch die­ses Script, da es aktiv gepflegt wird, alle Funk­tio­nen bie­tet, die ich beim KAP benö­tige, und von Hause aus alle Kame­ras unter­stützt, auf denen CHDK läuft.

Das ein­zige, was mir gefehlt hat, war die Mög­lich­keit fei­ner zu zoo­men. Des­we­gen habe ich das Script ein wenig ange­passt.

Zuerst wurde ein wei­te­rer Para­me­ter o defi­niert. Die­ser bestimmt die Schritt­weite, in der gezoomt wird.

@param     z Zoom position
  @default z 0
  @values  z Off 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
@param     o Zoom increment
  @default o 1
  @values  o 5% 10% 15% 20%
@param     c Focus @ Infinity Mode
  @default c 0
  @values  c None @Shot AFL MF

Als nächs­tes muss noch das Zoom initia­li­siert wer­den. Im Gegen­satz zum unver­än­der­ten Script, wird nun das Zoom immer beim Script­start in eine vor­ge­ge­bene Stel­lung gefah­ren.

    backlight =      b
    log_mode=        l
    focus_mode =     c
    usb_mode =       u

    -- allways initialize zoom!
    if ( z==0 ) then zoom_setpoint = 0 else zoom_setpoint = (z-1)*10 end
    -- new parameter Zoom increment
    zoom_increment = (o+1)*5

-- initial configuration values
    nd96offset=3*96

Als letz­tes habe ich den Script­teil zur Steue­rung per USB neu geschrie­ben, so dass nun schritt­weise ein- und aus­ge­zoomt wer­den kann.

-- PWM USB pulse functions

    function RCshoot()
        printf(" * usb pulse = shoot")
        shot_request = true
    end

    function RCzoomIn()
        printf(" * usb pulse = zoom in")
        if (zoom_setpoint < 100) then 
            zoom_setpoint = zoom_setpoint + zoom_increment
                if (zoom_setpoint > 100) then zoom_setpoint = 100 end
                printf(" * set zoom to "..zoom_setpoint.."%%")
                update_zoom(zoom_setpoint) 
        end
    end

    function RCzoomOut()
        printf(" * usb pulse = zoom out")
        if (zoom_setpoint > 0) then 
            zoom_setpoint = zoom_setpoint - zoom_increment
                if (zoom_setpoint < 0) then zoom_setpoint = 0 end
                printf(" * set zoom to "..zoom_setpoint.."%%")
                update_zoom(zoom_setpoint)
        end
    end

  function pwm_mode(pulse_width)
    if pulse_width > 0  then
        if    pulse_width < 20 then RCshoot()
        elseif pulse_width < 40 then RCzoomIn() 
        elseif pulse_width < 60 then RCzoomOut()
        else printf(" * usb pulse width error") end
    end
  end

Tipp

Um Feh­ler zu suchen, oder ein­fach zu sehen, was für Werte die Kamera vom USB-Port erhält, hat sich fol­gen­des kur­zes Script bewehrt. Es gibt ein­fach alles von Null abwei­chen­den Werte aus, die am USB-Port gefun­den wer­den.

-[[
rem Read USB

@title L:Read USB
@param a Wait
@default 5
]]

wait = a * 100
print("Read not null from USB")
print("Started...")

repeat
    repeat
        power = get_usb_power()
    until power > 0
    
    print("usb: "..power)
    sleep(wait)
until is_key("set") == true

Haf­tungs­aus­schluss

Die beschrie­bene Scrip­t­an­pas­sung ist nur ein sehr ein­fa­cher Hack. Vie­les könnte noch bes­ser gemacht wer­den, falls das Script noch fle­xi­bler genutzt wer­den soll.

Selbst­ver­ständ­lich über­nehme ich keine Garan­tie. Even­tu­ell kann die Kamera beschä­digt wer­den, falls das Script ungül­tige Para­me­ter über­gibt.

Hoch
renais­sance