CHDK Manual Focus capability has been greatly improved starting with version 1.3.0. The rest of this wiki page describes CHDK 1.2.0 or earlier.
forum thread -> Manual Focus Testing Thread
One of the very useful features of CHDK is its ability to focus the camera manually, either as part of a script or through the CHDK menus. While some Canon cameras have a built-in manual focus options, many do not. And for all cameras, the ability to set a focus point in a script can be important, either for "focus stacking" shots or to force the camera to focus at infinity (or the hyper-focal point) when shooting with intervalomters.
However, determining how to use CHDK to reliably manually focus a camera's lens can be difficult as many cameras need to be configured a little differently. This applies to both the "set_focus()" command in CHDK scripts, or the "Override Subject Distance" menu item in the CHDK's Enhanced Photo Operations menu. This problem is caused by there being no standard method that works for every camera that allows you to enable manual focus using CHDK.
Some cameras will immediately focus whenever a set_focus() script command is issued or SD override via menu..
Others will only focus when the camera's built-in autofocus is locked (AFL) prior to a set_focus() or SD override via menu.
And still others need the camera to be in Canon manual focus (MF) mode before you can focus via CHDK set_focus() or SD override via menu.
Listed below are some notes collected from various CHDK forum posts and wiki pages that should help you determine how to enable manual focus via CHDK for your camera. A Lua script is also give to simply determining what works for a particular camera.
Enabling CHDK Manual Focus
The following instructions will show you how to enable CHDK's ability to manually focus (either in a script or via the CHDK SD Override menu item).
1) Can CHDK manually focus with no changes to the Canon setting ? To test this .... If this works, you are done. Congratulations! Otherwise go to step 2 below.
2) Does your camera natively support manual focus using the Canon menus ? If so ..
3) Will your camera allow CHDK to manually focus only when it is Canon AFL mode?
4) Will your camera allow a CHDK script to manually focus when CHDK issues the set_aflock() command ?
CHDK Manual Focus Scripting Commands
- set_aflock(1) causes the Canon firmware to stop focusing when shooting
- does an initial focus measurement and sets focus at that value when called
- set_aflock(0) restores camera automatic focusing.
- seems to works on almost all cameras
- using set_aflock() may be necessary on some camera for set_focus() to work (elph310). On other cameras, it has no effect on whether set_focus() works.
- on some cameras, the set_aflock() command must be issued after a "half-press" focus completes and before the half press is released
- if you call set_aflock() and then set_focus() (in a mode on your camera where that works) then the focus for all subsequent shots will stay at the value specified in set_focus(). If set_aflock() has not been called then set_focus() will only apply to the next shot - after that the camera will revery to auto focus.
- script command that may or may not actually set the focus setting (in mm) the next time the camera shoots.
- on some cameras, set_focus() will only work if the camera is in Canon AFL mode (ex: A1200)
- on some cameras, set_focus() will only work if the camera is in Canon MF mode (ex: SX50HS)
- on some cameras, set_focus() will work when set_aflock(1) has been called (ex: elph310)
- on some cameras, set_focus() will only work when the camera is in P mode (or at least not in AUTO)
- on some cameras, set_focus works every time regardless of mode (ex: G10, SD940)
- Notes :
- Canon AFL mode is typically achieved via simulated button presses using click() - see your camera manual for the correct sequence. May require holding a "half press" while another key is clicked.
- Canon MF mode is may be achieved via simulated button presses, post_levent_for_npt call, and/or call_event_proc calls.
- When in Canon MF mode, focus will be set immediately when a set_focus() command is issued. Otherwise the focus will not take effect until after the "half-press" part of the shooting sequence.
- If all of the above fail to work, you may be able to set focus to infinity on any camera by using click() commands to select the "landscape" focus mode. The needed button is usually indicated by the tulip flower icon on one of the camera buttons but check your camera manual to be sure.
link > Test Results posted here
The script copied below lets you try out the various options for using set_focus(). Save it to an ASCII plain text file with the name mf-test.lua.
The script provides six choices of camera setup - pick one from the user parameter at run time to see if that mode will work for your camera.
The script will attempt to focus at 100, 200, and 300 mm and take a two test shots at each distance. The first shot is preceeded by a set_focus() command but the second shot is not. The purpose of the second shot is to see if the focus distance set for the first shot is preserved for the second shot.
--[[ @title MF Test Suite @param f MF Mode @default f 0 @values f None AFlock AFL MF1 MF2 MF3 --]] props=require("propcase") set_console_layout(1 ,1, 45, 14 ) print( "Set Focus Tester v1.2") sleep(1000) if ( get_mode() == false ) then set_record(1) while ( get_mode() == false ) do sleep(100) end end if ( f==1) then -- method 1 : set_aflock() print("set_aflock() mode") set_aflock(1) set_prop(props.AF_LOCK,1) elseif( f==2) then -- method 2 : enable Canon AFL lock focus via key presses print("AFL mode") local count = 0 local timeout = false press("shoot_half") repeat sleep(50) count = count + 1 if (count > 40 ) then timeout = true end until (get_focus_ok() == 1 ) or (timeout == true) if (timeout == true) then print("Warning : focus attempt timed out") else click("left") end sleep(100) release("shoot_half") elseif( f==3) then -- method 3 : MF1 lock focus via key presses print("MF1 mode") click("up") elseif( f==4) then -- method 4 : MF2 lock focus using levent for key press print("MF2 mode") post_levent_for_npt("PressSw1AndMF") elseif( f==5) then -- method 5 : MF3 lock focus using event_proc for key press print("MF3 mode") call_event_proc("SS.Create") call_event_proc("SS.MFOn") else print("no focus mode selected") end sleep(1000) for focus=100,300,100 do set_focus(focus) sleep(2000) press("shoot_half") sleep(1000) before=get_focus() click("shoot_full") release("shoot_half") after=get_focus() if ((focus-after)/5 == 0) then fstr=" : okay" else fstr=" : fault" end print("Set:"..focus," Before:"..before," After:"..after..fstr) sleep(2000) press("shoot_half") sleep(1000) before=get_focus() click("shoot_full") release("shoot_half") after=get_focus() if ((focus-after)/5 == 0) then fstr=" : locked" else fstr=" : unlocked" end print(" "..focus," Before:"..before," After:"..after..fstr) sleep(1000) end if (f == 1 ) then -- method 1 : aflock disable set_aflock(0) elseif (f == 2 ) then -- method 2 : deselect AFL click("left") elseif (f == 3 ) then -- method 3 : MF1 off click("up") elseif (f == 4 ) then -- method 4 : MF2 off post_levent_for_npt("PressSw1AndMF") elseif (f == 5 ) then -- method 5 : MF3 off call_event_proc("SS.Create") call_event_proc("SS.MFOff") end print(".. done") sleep(100)
Links to MF Scripts
For Developers : SD Override / Manual Focus
This section under active construction as of Dec 29 2013.
To enable SD overrides to work via the CHDK menus, the following default settings in include/camera.h related to manual focus must be configured correctly :
#define CAM_CAN_SD_OVER_NOT_IN_MF 1 // Camera allows subject distance (focus) override when not in manual focus mode #undef CAM_CAN_SD_OVER_IN_AF_LOCK // Camera allows subject distance (focus) override when in AF Lock mode #undef CAM_CAN_SD_OVER_IN_AF_LOCK_ONLY // Camera allows subject distance (focus) override only when in AF Lock mode OR in movie mode #define CAM_CAN_SD_OVERRIDE 1 // Camera allows to do subject distance override #define CAM_HAS_MANUAL_FOCUS 1 // Camera has manual focus mode
Use these as follows :