synch the camera trigger with the signal in phase and quadrature (every frame or every N frames). We can also simulate the product by the in-phase signal (with a small arbitrary phase difference)
Diff: main.cpp
- Revision:
- 0:4b5874bff9bb
- Child:
- 1:4284f27d638d
diff -r 000000000000 -r 4b5874bff9bb main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jul 14 09:35:12 2014 +0000 @@ -0,0 +1,94 @@ +#include "mbed.h" +#include "Flipper.h" + +// The following parameters can be changed by serial commands: +// NOTE: program 9 on the LCC-230 gives a freq of 150Hz. If frame rate for the camera is 30fps, then the nb of cycles per frame is 150/30=5 +// for 28.09, then the of cycles per frame is 150/28.09=5.339 +float CAMERA_FPS=15;//28.0915;//28.09; +unsigned long CAMERA_TRIGGER_PERIOD=1000000.0/CAMERA_FPS; +float EXPOSURE_TIME_FACTOR=1.0/4; +unsigned long EXPOSURE_TIME=EXPOSURE_TIME_FACTOR*CAMERA_TRIGGER_PERIOD; + +float NB_CYCLES_PER_EXPOSURE_TIME=4;//5.339;//1;//1.0*150/28; // this is the nb of cycles of the led during one camera frame +float NB_CYCLES_PER_CAMERA_FRAME=1.0/EXPOSURE_TIME_FACTOR*NB_CYCLES_PER_EXPOSURE_TIME; + +unsigned long LED_PERIOD=1000000.0/(NB_CYCLES_PER_CAMERA_FRAME*CAMERA_FPS); //in us + +unsigned int NB_FRAMES_TOGGLE_QP=1; // this is the nb of camera frames before toggling the modulation (note: there is no synchronization!) + +enum SignalMode {PHASE=0, QUADRATURE, TOGGLE_PHASE_QUADRATURE}; +SignalMode currentSignalMode=TOGGLE_PHASE_QUADRATURE; //NOTE: all the leds mode affected by this at the same time + +Trigger cameraTrigger(cameraTriggerPin,1.0*CAMERA_FPS,(unsigned int)EXPOSURE_TIME); +Flipper ledSource(ledPin, LED_PERIOD); +Shutter lcdShutter(shutterPin, LED_PERIOD); + +Serial pc(USBTX, USBRX); // tx, rx +void processSerial(); + +int main() +{ + pc.baud(9600); + + + cameraTrigger.setQPToggleFrames(NB_FRAMES_TOGGLE_QP); + cameraTrigger.start(); + + ledSource.start(); + + // add some delay: + wait_us(5000); + lcdShutter.mixSignal(false); + lcdShutter.start(); + + // spin in a main loop. flipper will interrupt it to call flip + while(1) { + processSerial(); + } +} + +// String to store ALPHANUMERIC DATA (i.e., integers, floating point numbers, unsigned ints, etc represented as DEC) sent wirelessly: +char incomingValue[5]; +char incomingByte; +char indexString=0; + +void processSerial() +{ + + while(pc.readable()>0) { + char incomingByte =pc.getc(); + + if (incomingByte >='0' && incomingByte <='9') { + incomingValue[indexString]=incomingByte; + indexString++; + } else { // check for terminator (i.e. "CONTROL CODES"): + if (incomingByte=='P') { + currentSignalMode=PHASE; + cameraTrigger.toggleQP(false); + ledSource.flip(); + } else if (incomingByte=='Q') { + currentSignalMode=QUADRATURE; + cameraTrigger.toggleQP(false); + ledSource.flip(); + } else if (incomingByte=='T') { + currentSignalMode=TOGGLE_PHASE_QUADRATURE; // periodic toogling (every a TOGGLE_QP_PERIOD) + cameraTrigger.toggleQP(true); + } else if (incomingByte=='s') { // simulated shutter OFF + lcdShutter.mixSignal(false); + } else if (incomingByte=='S') { // simulated shutter ON + lcdShutter.mixSignal(true); + + // CAMERA PARAMETERS: + } else if (incomingByte == 'F') { // camera frame rate + incomingValue[indexString]=0; // termination for the string + indexString=0; + cameraTrigger.setFrameRate(atoi(incomingValue)); + } else if (incomingByte == 'E') { // control Exposure time: + incomingValue[indexString]=0; // termination for the string + indexString=0; + cameraTrigger.setExposure(atoi(incomingValue)); + } + + } + } +} \ No newline at end of file