Skip to content

Commit 60e15dd

Browse files
committed
allow saving and setting exposure/shutter, gain and balance so that it can be frozen during timelapse
1 parent fa81fa0 commit 60e15dd

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

adafruit_pycamera/__init__.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,55 @@ def led_color(self, new_color):
882882
else:
883883
self.pixels[:] = colors
884884

885+
def get_camera_autosettings(self):
886+
exposure = (self.read_camera_register(0x3500) << 12) + \
887+
(self.read_camera_register(0x3501) << 4) + \
888+
(self.read_camera_register(0x3502) >> 4);
889+
wb = [self.read_camera_register(x) for x in \
890+
(0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405)]
891+
892+
settings = {
893+
'gain': self.read_camera_register(0x350b),
894+
'exposure': exposure,
895+
'wb': wb
896+
}
897+
return settings
898+
899+
def set_camera_wb(self, wb_register_values=None):
900+
if wb_register_values is None:
901+
# just set to auto balance
902+
self.camera.whitebal = True
903+
return
904+
905+
if len(wb_register_values) != 6:
906+
raise RuntimeError("Please pass in 0x3400~0x3405 inclusive!")
907+
908+
self.write_camera_register(0x3212, 0x03)
909+
self.write_camera_register(0x3406, 0x01)
910+
for i, reg_val in enumerate(wb_register_values):
911+
self.write_camera_register(0x3400+i, reg_val)
912+
self.write_camera_register(0x3212, 0x13)
913+
self.write_camera_register(0x3212, 0xa3)
914+
915+
def set_camera_exposure(self, new_exposure=None):
916+
if new_exposure is None:
917+
# just set auto expose
918+
self.camera.exposure_ctrl = True
919+
return
920+
exposure_ctrl = False
921+
922+
self.write_camera_register(0x3500, (new_exposure >> 12) & 0xFF)
923+
self.write_camera_register(0x3501, (new_exposure >> 4) & 0xFF)
924+
self.write_camera_register(0x3502, (new_exposure << 4) & 0xFF)
925+
926+
def set_camera_gain(self, new_gain=None):
927+
if new_gain is None:
928+
# just set auto expose
929+
self.camera.gain_ctrl = True
930+
return
931+
932+
self.camera.gain_ctrl = False
933+
self.write_camera_register(0x350b, new_gain)
885934

886935
class PyCamera(PyCameraBase):
887936
"""Wrapper class for the PyCamera hardware"""

examples/camera/code.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,20 @@
225225
print("OK")
226226
if pycam.mode_text == "LAPS":
227227
if timelapse_remaining is None: # stopped
228+
print("Starting timelapse")
228229
timelapse_remaining = pycam.timelapse_rates[pycam.timelapse_rate]
229230
timelapse_timestamp = time.time() + timelapse_remaining + 1
231+
# dont let the camera take over auto-settings
232+
saved_settings = pycam.get_camera_autosettings()
233+
#print(f"Current exposure {saved_settings['exposure']}, gain {saved_settings['gain']}, wb {saved_settings['wb']}")
234+
pycam.set_camera_exposure(saved_settings['exposure'])
235+
pycam.set_camera_gain(saved_settings['gain'])
236+
pycam.set_camera_wb(saved_settings['wb'])
230237
else: # is running, turn off
238+
print("Stopping timelapse")
239+
231240
timelapse_remaining = None
241+
pycam.camera.exposure_ctrl = True
242+
pycam.set_camera_gain(None) # go back to autogain
243+
pycam.set_camera_wb(None) # go back to autobalance
244+
pycam.set_camera_exposure(None) # go back to auto shutter

0 commit comments

Comments
 (0)