Kamerasteuerung mit CHDK

Für viele Kameras von Canon gibt es eine OpenSource-Firmwareerweiterung: CHDK. Mit dieser kann die Kamera nicht nur um zahlreiche Funktionen erweitert werden (z.B. Bewegungserkennung, Serienaufnamen, extreme Belichtungszeiten, …), sondern auch Scripte (uBASIC oder LUA) können auf der Kamera ausgeführt werden und diese steuern.

Unter anderem können Impulse am USB-Port ausgewertet werden, um zum Beispiel eine Aufnahme zu machen, oder das Zoom zu betätigen. Um diese Pulse aus dem Signal des Fernsteuerungsempfängers zu erzeugen kann RC-CHDK V2  von Peter Engels verwendet werden. Mit einem Arduino lassen sich aber auch mit wenigen Zeilen Programm-Code diese Signale erzeugen.

Lange Zeit habe ich auf meinen Kameras ein selbst geschriebenes Script verwendet, das um im weitere Funktionen ergänzt wurde. Inzwischen habe ich aber ein tolles Script gefunden, das alles kann, was ich brauche: KAP & UAV Exposure Control Script.

Ich verwende jetzt nur noch dieses Script, da es aktiv gepflegt wird, alle Funktionen bietet, die ich beim KAP benötige, und von Hause aus alle Kameras unterstützt, auf denen CHDK läuft.

Das einzige, was mir gefehlt hat, war die Möglichkeit feiner zu zoomen. Deswegen habe ich das Script ein wenig angepasst.

Zuerst wurde ein weiterer Parameter o definiert. Dieser bestimmt die Schrittweite, 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ächstes muss noch das Zoom initialisiert werden. Im Gegensatz zum unveränderten Script, wird nun das Zoom immer beim Scriptstart in eine vorgegebene Stellung gefahren.

    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 letztes habe ich den Scriptteil zur Steuerung per USB neu geschrieben, so dass nun schrittweise ein- und ausgezoomt werden 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 Fehler zu suchen, oder einfach zu sehen, was für Werte die Kamera vom USB-Port erhält, hat sich folgendes kurzes Script bewehrt. Es gibt einfach alles von Null abweichenden Werte aus, die am USB-Port gefunden werden.

-[[
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

Haftungsausschluss

Die beschriebene Scriptanpassung ist nur ein sehr einfacher Hack. Vieles könnte noch besser gemacht werden, falls das Script noch flexibler genutzt werden soll.

Selbstverständlich übernehme ich keine Garantie. Eventuell kann die Kamera beschädigt werden, falls das Script ungültige Parameter übergibt.

Hoch