diff --git a/sw/extras/chdk/pictuav.lua b/sw/extras/chdk/pictuav.lua new file mode 100644 index 0000000000..07c56de78f --- /dev/null +++ b/sw/extras/chdk/pictuav.lua @@ -0,0 +1,168 @@ +--[[ +@title PictUAV +@param d Display off frame 0=never +@default d 0 +--]] + +-- Developed on IXUS 230 HS. Other cameras should work as well, but some errors or crashes are possible +-- also considering that some firmwares still have CHDK bugs. +-- +-- Other settings in the camera that you should try to manipulate to reduce the time between taking pictures: +-- CHDK menu +-- Extra Photo overrides +-- Disable overrides : Off +-- Do not override shutter speed ( I allow the camera to determine exposure time, but feel free to experiment) +-- ND filter state: Out (removes ND filter to allow more light to fall on the sensor ) +-- Override subj. dist. value: 65535. (good to keep it there) +-- Do not save RAW images, they take longer +-- +-- Camera menu +-- Use P mode, certainly not automatic +-- If you can hardset the focus, do this towards infinity +-- Play around with aperture. Smaller apertures are better for more sharpness, but not every camera allows you to. +-- (Some cameras have really bad behaviour on larger apertures that allow more light through, especially at edges). +-- Disable IS (plane vibrations mess up its function and increases the chance of blur) +-- Take Large images with Fine resolution. +-- Turn "Review" mode off. +-- Consider hard-setting ISO, but consider local weather. If set too high, shutter time goes up, which causes blur. +-- Blur can then also occur in areas where there is little light reflection from the earth. +-- +-- How to use the script: +-- Load this on the card under "CHDK/SCRIPTS" +-- Enter the CHDK menu through your "ALT" button +-- Under scripts, select the script and specify "Autostart: on" +-- +-- As the camera starts up, this also loads. with the shutter button pressed, you can interrupt the script +-- Then press the "ALT" button to disable the scripting actuator. +-- Press the shutter button to extend the lens +-- Press "ALT" again to bring up the scripting actuator. +-- Press the shutter button to reinitiate the script. +-- If you have a IXUS 230HS like me, the focus can't be set automatically. Point the camera at a distant object while the script +-- is starting. It should say "Focused", after which it's ready for use. +-- +-- Example paparazzi airframe configuration: +-- +--
+-- +-- +-- +-- +--
+-- +-- +-- +-- +-- +-- +-- +-- + +print( "PictUAV Started " ) + +function print_status (frame) + local free = get_jpg_count() + print("#" .. frame ) +end + +-- switch to autofocus mode, pre-focus, then go to manual focus mode (locking focus there). +-- this helps to reduce the delay between the signal and taking the picture. +function pre_focus() + local focused = false + local try = 1 + while not focused and try <= 5 do + print("Pre-focus attempt " .. try) + press("shoot_half") + sleep(2000) + if get_prop(18) > 0 then + print("Focused") + focused = true + set_aflock(1) + end + release("shoot_half") + sleep(500) + try = try + 1 + end + return focused +end + +-- set aperture/shooting mode to landscape +set_prop(6,3) + +ap = get_prop(6) +print ("AF(3=inf,4=MF) "..ap) + +-- Turn IS off +set_prop(145, 3) + +-- set P mode +set_capture_mode(2) +sleep(1000) + +-- Get focusing mode +p = get_prop(6) +if (p==3) then + print "Inf set." +else + -- on ixus230hs, no explicit MF. + -- so set to infinity (3) + while (p ~= 3) do + press "left" + release "left" + p = get_prop (6) + end + print "Focus set to infinity" +end + +-- on ixus230hs set focus doesn't fail, but doesn't do anything. +set_focus(100) +print "set_focus 100" +sleep(2000) +f = get_focus + +-- on ixus230hs set focus doesn't fail, but doesn't do anything. +set_focus( 65535 ) +print "set_focus 65535" +sleep( 2000) +g = get_focus + +if (f==g) then + print "set_focus inop" + -- if focusing until here didn't work, pre-focus using a different method. + pre_focus() +else + -- set_aflock(1) fails when the camera isn't knowingly focused. + print( "Setting aflock 1" ) + sleep(1000) + set_aflock( 1 ) +end + +-- measuring the pulse on CHDK isn't necessarily that accurate, they can easily vary by 40ms. +-- Since I'm using a 100ms wait here, the variance for a shoot is around 140ms. +-- If the pulse is 250ms, then I should allow for anything down to 110. +-- For Paparazzi, taking a single picture using the button may not work because the timing may be very off +-- considering the 4Hz loop (this requires a change in the cam module for paparazzi). + +print( "PictUAV loop " ) +a = -1 +repeat + a = get_usb_power(0) + -- a pulse is detected longer than ~610ms. + if (a>61) then + print( "shutting down " ) + shut_down() + sleep(1500) + break + end + -- a pulse longer than ~100ms is detected. + if (a>10) then + + frame = 1 + shoot() + + frame = frame + 1 + + end + sleep(100) +until ( false ) +print( "PictUAV ended " ) +