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.