' {$STAMP BS2} ' {$PBASIC 2.5} ' Stamp laser camera trigger controller. MRH Nov 2008 - May 2011 ' Assign and configure pins LcdPIN PIN 15 SensorPin PIN 0 SensorPin2 PIN 1 CameraPin PIN 9 LaserPin PIN 14 FuncPin PIN 4 Step1Pin PIN 5 Step10Pin PIN 6 INPUT SensorPin INPUT SensorPin2 INPUT FuncPIN INPUT Step1Pin INPUT Step10Pin OUTPUT LaserPIN OUTPUT CameraPin HIGH LaserPin LOW CameraPin ' Declare LCD codes Baud19200 CON 32 LcdClear CON 12 LcdLine2 CON 148 LcdOnNoC CON 22 LcdBlOn CON 17 LcdBlOff CON 18 LcdTopLeft CON 128 LcdTopRight CON 143 lcdBlStatus VAR BYTE lcdToggle VAR BYTE ' Declare other constants and variables defDelay VAR WORD delay VAR WORD defDelay = 0 delay = defDelay RecoverWait VAR WORD RecoverWait = 500 SETUP CON 1 RUNIT CON 0 DARK CON 1 LIGHT CON 0 btnWrk1 VAR BYTE btnWrk10 VAR BYTE btnWrk1 = 0 btnWrk10 = 0 sensorHistory VAR BYTE sensorHistory = LIGHT sensorHistory2 VAR BYTE sensorHistory2 = LIGHT ' Start up LCD HIGH LcdPIN :PAUSE 100 ' Set pin high to be a serial port SEROUT LcdPin, Baud19200, [LcdOnNoC] SEROUT LcdPIN, Baud19200, [LcdClear]: PAUSE 5 SEROUT LcdPin, Baud19200, [LcdLine2,"CamTrig v2.0"] SEROUT LcdPin, Baud19200, [LcdBlOff] ' Backlight off (costs 60mA) lcdBlStatus = LcdBlOff DO GOSUB PollLoop ' Main polling loop. Returns after trigger LOOP END '----------------------------------------------------------------------- ' Function declarations '----------------------------------------------------------------------- PollLoop : 'Polls for light changes and switch change for setup. DO ' Main loop ''GOSUB AliveFunc ' Show pulse IF (FuncPin = SETUP) THEN GOSUB SetupFunc ' Setup switch is on IF (SensorPin = DARK AND SensorPin2 = DARK AND (sensorHistory = LIGHT OR sensorHistory2 = LIGHT)) THEN PAUSE delay ' Wait user-defined delay LOW LaserPIN ' Switch off laser HIGH CameraPin ' Trigger camera or flash SEROUT LcdPin, Baud19200, [LcdLine2,"Sensors Off Off "] SEROUT LcdPin, Baud19200, [LcdTopLeft,"--- Trigger ---"] sensorHistory = DARK sensorHistory2 = DARK PAUSE RecoverWait ' Pause for slow devices like cameras SEROUT LcdPin, Baud19200, [LcdTopLeft,"Ready "] LOW CameraPin ' Reset camera HIGH LaserPin ' Laser back on 'GOSUB AwaitSetupFunc ' Then wait for user to go back to Setup RETURN ' go back to main in case we want to do something special ELSEIF (SensorPin = LIGHT AND SensorPin2 = LIGHT) THEN SEROUT LcdPin, Baud19200, [LcdLine2,"Sensors On On "] sensorHistory = LIGHT sensorHistory = LIGHT ELSEIF (SensorPin = LIGHT AND SensorPin2 = DARK) THEN SEROUT LcdPin, Baud19200, [LcdLine2,"Sensors On Off "] sensorHistory = LIGHT sensorHistory2 = DARK ELSEIF (SensorPin = DARK AND SensorPin2 = LIGHT) THEN SEROUT LcdPin, Baud19200, [LcdLine2,"Sensors Off On "] sensorHistory = DARK sensorHistory = LIGHT ELSEIF (SensorPin = DARK AND SensorPin2 = DARK) THEN SEROUT LcdPin, Baud19200, [LcdLine2,"Sensors Off Off "] sensorHistory = DARK sensorHistory = DARK ENDIF LOOP ' End of polling loop RETURN '----------------------------------------------------------------------- ' SetupFunc - Allows setting of delay between interupt and trigger SetupFunc: LOW LaserPIN ' Switch off laser SEROUT LcdPin, Baud19200, [LcdTopLeft,"CamTrig setup "] SEROUT LcdPin, Baud19200, [LcdLine2,"Delay = ",DEC delay," ms "] PollButton1: 'btnWrk1 = 0 BUTTON Step1Pin, 0, 255, 20, btnWrk1, 0, PollButton2 delay = delay + 1 SEROUT LcdPin, Baud19200, [LcdLine2,"Delay = ",DEC delay," ms "] PollButton2: 'btnWrk10 = 0 BUTTON Step10Pin, 0, 255, 20, btnWrk10, 0, PollSetup delay = delay + 10 SEROUT LcdPin, Baud19200, [LcdLine2,"Delay = ",DEC delay," ms "] PollSetup: IF (Step1Pin = 0 AND Step10Pin = 0) THEN ' both buttons pressed resets delay and toggles backlighting delay = defDelay SEROUT LcdPin, Baud19200, [LcdLine2,"Delay = ",DEC delay," ms "] IF (lcdBlStatus = LcdBlOff) THEN SEROUT LcdPin, Baud19200, [LcdBlOn] ' Backlight on (costs 60mA) lcdBlStatus = LcdBlOn ELSE SEROUT LcdPin, Baud19200, [LcdBlOff] ' Backlight on (costs 60mA) lcdBlStatus = LcdBlOff ENDIF PAUSE 500 ENDIF IF (FuncPin = SETUP) THEN GOTO PollButton1 ' Keep polling HIGH LaserPIN ' Switch off laser SEROUT LcdPin, Baud19200, [LcdTopLeft,"CamTrig active"] RETURN ' end Setup func '----------------------------------------------------------------------- AliveFunc: ' AliveFunc - Gives pulse on LCD to show vitality IF (lcdToggle = ".") THEN lcdToggle = " " ELSE lcdToggle = "." ENDIF SEROUT LcdPin, Baud19200, [LcdTopRight, lcdToggle] RETURN ' end alive func '----------------------------------------------------------------------- AwaitSetupFunc: ' AwaitSetupFunc - Awaits return to setup mode (prevents strobing) SEROUT LcdPin, Baud19200, [LcdTopLeft,"Go to Setup ",LcdLine2,"to continue "] StillWaiting: PAUSE 100 IF (FuncPin = RUNIT) THEN GOTO StillWaiting SEROUT LcdPin, Baud19200, [LcdClear] RETURN '-----------------------------------------------------------------------