[extras] Add CHDK script to work with digital_cam module

closes #480
This commit is contained in:
gtoonstra
2013-07-16 21:56:38 -03:00
committed by Felix Ruess
parent a149b812d5
commit 8b9c207351
+168
View File
@@ -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:
--
-- <section name="DIGITAL_CAMERA" prefix="DC_">
-- <define name="AUTOSHOOT_QUARTERSEC_PERIOD" value="8" unit="quarter_second"/>
-- <define name="AUTOSHOOT_METER_GRID" value="60" unit="meter"/>
-- <define name="SHUTTER_DELAY" value="0" unit="quarter_second"/>
-- <define name="POWER_OFF_DELAY" value="3" unit="quarter_second"/>
-- </section>
--
-- <load name="digital_cam.xml" >
-- <define name="DC_SHUTTER_LED" value="4"/>
-- <define name="DC_POWER_OFF_LED" value="4"/>
-- <define name="DC_RELEASE" value="LED_ON" />
-- <define name="DC_PUSH" value="LED_OFF" />
-- </load>
--
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 " )