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)

Dependencies:   mbed

Committer:
mbedalvaro
Date:
Mon Dec 08 07:03:38 2014 +0000
Revision:
1:4284f27d638d
Parent:
0:4b5874bff9bb
this is the latest code for the active markers project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:4b5874bff9bb 1 #ifndef Flipper_h
mbedalvaro 0:4b5874bff9bb 2 #define Flipper_h
mbedalvaro 0:4b5874bff9bb 3
mbedalvaro 0:4b5874bff9bb 4 #include "mbed.h"
mbedalvaro 0:4b5874bff9bb 5
mbedalvaro 1:4284f27d638d 6 #define ledPin p23 // the actual modulation of the LED source (equal to PHASE or QUAD signal every N frames)
mbedalvaro 1:4284f27d638d 7 #define shutterPin p22 // for tests
mbedalvaro 1:4284f27d638d 8 #define cameraTriggerPin p21
mbedalvaro 0:4b5874bff9bb 9
mbedalvaro 0:4b5874bff9bb 10 // A class for flip()-ing a DigitalOut using a timer
mbedalvaro 0:4b5874bff9bb 11
mbedalvaro 0:4b5874bff9bb 12 //1) Class for toggling the LED (in phase or quadrature, with a multiplier)
mbedalvaro 0:4b5874bff9bb 13 class Flipper {
mbedalvaro 0:4b5874bff9bb 14 public:
mbedalvaro 0:4b5874bff9bb 15 static DigitalOut _pin;
mbedalvaro 0:4b5874bff9bb 16 static bool state;
mbedalvaro 0:4b5874bff9bb 17 static bool multiplier;//=true; // this is for simulating the deconvolution
mbedalvaro 0:4b5874bff9bb 18 // NOTE initialization needs to be in the cpp file, unless it's a const
mbedalvaro 0:4b5874bff9bb 19
mbedalvaro 0:4b5874bff9bb 20 static void delay90() {state = !state; _pin=state;}
mbedalvaro 0:4b5874bff9bb 21 static void multImmediate() { _pin=state&&multiplier;}
mbedalvaro 0:4b5874bff9bb 22
mbedalvaro 0:4b5874bff9bb 23
mbedalvaro 0:4b5874bff9bb 24 Flipper(PinName pin, unsigned int interval): us_interval(interval) {
mbedalvaro 0:4b5874bff9bb 25 Flipper::_pin=pin;
mbedalvaro 0:4b5874bff9bb 26 state=true;
mbedalvaro 0:4b5874bff9bb 27 _pin=state;
mbedalvaro 0:4b5874bff9bb 28 }
mbedalvaro 0:4b5874bff9bb 29
mbedalvaro 0:4b5874bff9bb 30 void start() {
mbedalvaro 1:4284f27d638d 31 myTicker.attach_us(this, &Flipper::flip, (unsigned int)(0.5*us_interval)); // the address of the object, member function, and interval
mbedalvaro 0:4b5874bff9bb 32 }
mbedalvaro 0:4b5874bff9bb 33
mbedalvaro 0:4b5874bff9bb 34 void stop() {
mbedalvaro 0:4b5874bff9bb 35 myTicker.detach();
mbedalvaro 0:4b5874bff9bb 36 }
mbedalvaro 0:4b5874bff9bb 37
mbedalvaro 0:4b5874bff9bb 38 void flip() {
mbedalvaro 0:4b5874bff9bb 39 state = !state;
mbedalvaro 0:4b5874bff9bb 40 _pin=state&&multiplier;
mbedalvaro 0:4b5874bff9bb 41 }
mbedalvaro 0:4b5874bff9bb 42
mbedalvaro 0:4b5874bff9bb 43 private:
mbedalvaro 0:4b5874bff9bb 44 unsigned int us_interval;
mbedalvaro 0:4b5874bff9bb 45 Ticker myTicker;
mbedalvaro 0:4b5874bff9bb 46 };
mbedalvaro 0:4b5874bff9bb 47
mbedalvaro 0:4b5874bff9bb 48 // 2) Camera trigger class (NOTE: we are using MODE 2 of Point gray, meaning we control the exposure)
mbedalvaro 0:4b5874bff9bb 49 class Trigger {
mbedalvaro 0:4b5874bff9bb 50
mbedalvaro 0:4b5874bff9bb 51 friend class Flipper; // because we will call delay90() method
mbedalvaro 0:4b5874bff9bb 52
mbedalvaro 0:4b5874bff9bb 53 public:
mbedalvaro 0:4b5874bff9bb 54
mbedalvaro 0:4b5874bff9bb 55 enum triggerState {
mbedalvaro 0:4b5874bff9bb 56 WAITING=0,
mbedalvaro 0:4b5874bff9bb 57 EXPOSE,
mbedalvaro 0:4b5874bff9bb 58 NUM_STATES
mbedalvaro 0:4b5874bff9bb 59 };
mbedalvaro 0:4b5874bff9bb 60
mbedalvaro 1:4284f27d638d 61 //Trigger(PinName pin, float fps, unsigned int exposure) : _pin(pin) {
mbedalvaro 1:4284f27d638d 62 // _pin=1;
mbedalvaro 1:4284f27d638d 63 // us_exposureTime=exposure;
mbedalvaro 1:4284f27d638d 64 // us_waitingTime=(unsigned int)(1000000.0/fps-us_exposureTime);
mbedalvaro 1:4284f27d638d 65 // framesQPToggle=2; // default number of frames before toggling between Q and P signals (delaying the Flipper signal by 90 deg).
mbedalvaro 1:4284f27d638d 66 // QP_Mode=true;
mbedalvaro 1:4284f27d638d 67 // }
mbedalvaro 1:4284f27d638d 68
mbedalvaro 1:4284f27d638d 69 Trigger(PinName pin, unsigned int waitingtime, unsigned int exposure) : _pin(pin) {
mbedalvaro 0:4b5874bff9bb 70 _pin=1;
mbedalvaro 0:4b5874bff9bb 71 us_exposureTime=exposure;
mbedalvaro 1:4284f27d638d 72 us_waitingTime=waitingtime;
mbedalvaro 0:4b5874bff9bb 73 framesQPToggle=2; // default number of frames before toggling between Q and P signals (delaying the Flipper signal by 90 deg).
mbedalvaro 0:4b5874bff9bb 74 QP_Mode=true;
mbedalvaro 0:4b5874bff9bb 75 }
mbedalvaro 0:4b5874bff9bb 76
mbedalvaro 0:4b5874bff9bb 77 void setQPToggleFrames(unsigned int numToggleQPFrames) {
mbedalvaro 0:4b5874bff9bb 78 framesQPToggle=numToggleQPFrames;
mbedalvaro 0:4b5874bff9bb 79 }
mbedalvaro 0:4b5874bff9bb 80
mbedalvaro 1:4284f27d638d 81 // void setFrameRate(float fps) {
mbedalvaro 1:4284f27d638d 82 // us_waitingTime=(unsigned int)(1000000.0/fps-us_exposureTime);
mbedalvaro 1:4284f27d638d 83 // }
mbedalvaro 1:4284f27d638d 84
mbedalvaro 1:4284f27d638d 85 void setFrameRate(unsigned int waitingtime) {
mbedalvaro 1:4284f27d638d 86 us_waitingTime=waitingtime;
mbedalvaro 0:4b5874bff9bb 87 }
mbedalvaro 0:4b5874bff9bb 88
mbedalvaro 0:4b5874bff9bb 89 void setExposure(unsigned int exposure) {
mbedalvaro 0:4b5874bff9bb 90 us_exposureTime=exposure;
mbedalvaro 0:4b5874bff9bb 91 }
mbedalvaro 0:4b5874bff9bb 92
mbedalvaro 0:4b5874bff9bb 93 void start() {
mbedalvaro 0:4b5874bff9bb 94 // We start in WAITING and go to EXPOSE
mbedalvaro 0:4b5874bff9bb 95 myTimer.attach_us(this, &Trigger::trigger, us_waitingTime); // the address of the object, member function, and interval
mbedalvaro 0:4b5874bff9bb 96 myTriggerState=WAITING;
mbedalvaro 0:4b5874bff9bb 97 frameCounter=0;
mbedalvaro 0:4b5874bff9bb 98 }
mbedalvaro 0:4b5874bff9bb 99
mbedalvaro 0:4b5874bff9bb 100 void toggleQP(bool mode) {
mbedalvaro 0:4b5874bff9bb 101 QP_Mode=mode;
mbedalvaro 0:4b5874bff9bb 102 }
mbedalvaro 0:4b5874bff9bb 103
mbedalvaro 0:4b5874bff9bb 104 void stop() {
mbedalvaro 0:4b5874bff9bb 105 myTimer.detach();
mbedalvaro 0:4b5874bff9bb 106 }
mbedalvaro 0:4b5874bff9bb 107
mbedalvaro 0:4b5874bff9bb 108 void trigger() {
mbedalvaro 0:4b5874bff9bb 109 switch(myTriggerState) {
mbedalvaro 0:4b5874bff9bb 110 case WAITING: // if the state was "wait" and we got here, we need to start exposing:
mbedalvaro 0:4b5874bff9bb 111 _pin=0; // a high-low change triggers the camera
mbedalvaro 0:4b5874bff9bb 112 // now we need to reset the timeout and give it another value:
mbedalvaro 0:4b5874bff9bb 113 myTimer.attach_us(this, &Trigger::trigger, us_exposureTime);
mbedalvaro 0:4b5874bff9bb 114 myTriggerState=EXPOSE;
mbedalvaro 0:4b5874bff9bb 115 break;
mbedalvaro 0:4b5874bff9bb 116 case EXPOSE: // if the state was EXPOSE, we need to stop exposing and go to wait:
mbedalvaro 0:4b5874bff9bb 117 _pin=1; // a low-high stop exposing
mbedalvaro 0:4b5874bff9bb 118 // now we need to reset the timeout and give it another value:
mbedalvaro 0:4b5874bff9bb 119 myTimer.attach_us(this, &Trigger::trigger, us_waitingTime);
mbedalvaro 0:4b5874bff9bb 120 myTriggerState=WAITING;
mbedalvaro 0:4b5874bff9bb 121
mbedalvaro 0:4b5874bff9bb 122 // Also, this means we acquired ONE frame...
mbedalvaro 0:4b5874bff9bb 123 // Switch the from phase to quadrature int the friend class Flipper, every N frames (if we want):
mbedalvaro 0:4b5874bff9bb 124 frameCounter=(frameCounter+1)%framesQPToggle;
mbedalvaro 0:4b5874bff9bb 125 if (QP_Mode&&frameCounter==0) {
mbedalvaro 0:4b5874bff9bb 126 //Flipper::state = ! Flipper::state ; // this correspond to calling the flip function (but without multiplier)
mbedalvaro 0:4b5874bff9bb 127 Flipper::delay90();
mbedalvaro 0:4b5874bff9bb 128 }
mbedalvaro 0:4b5874bff9bb 129 break;
mbedalvaro 0:4b5874bff9bb 130 default:
mbedalvaro 0:4b5874bff9bb 131 break;
mbedalvaro 0:4b5874bff9bb 132 }
mbedalvaro 0:4b5874bff9bb 133 }
mbedalvaro 0:4b5874bff9bb 134
mbedalvaro 0:4b5874bff9bb 135 private:
mbedalvaro 0:4b5874bff9bb 136 DigitalOut _pin;
mbedalvaro 0:4b5874bff9bb 137 bool QP_Mode; // this is to select toggling or not
mbedalvaro 0:4b5874bff9bb 138 triggerState myTriggerState;
mbedalvaro 0:4b5874bff9bb 139 unsigned int frameCounter;
mbedalvaro 0:4b5874bff9bb 140 unsigned int framesQPToggle;
mbedalvaro 0:4b5874bff9bb 141 unsigned int us_exposureTime, us_waitingTime;
mbedalvaro 0:4b5874bff9bb 142 Timeout myTimer; // I need to use a timeout, and not a ticker because the intervals are different for the trigger period and exposure time
mbedalvaro 0:4b5874bff9bb 143 };
mbedalvaro 0:4b5874bff9bb 144
mbedalvaro 0:4b5874bff9bb 145 // 3) The simulation of the LCD shutter:
mbedalvaro 0:4b5874bff9bb 146 class Shutter{
mbedalvaro 0:4b5874bff9bb 147 friend class Flipper; // because we will modify the Flipper variable "multiplier"
mbedalvaro 0:4b5874bff9bb 148
mbedalvaro 0:4b5874bff9bb 149 public:
mbedalvaro 0:4b5874bff9bb 150 // Note: we don't really need a toggling pin for this, but it can be good to see it on the oscilloscope
mbedalvaro 0:4b5874bff9bb 151 Shutter(PinName pin, unsigned int interval) : _pin(pin), us_interval(interval) {
mbedalvaro 0:4b5874bff9bb 152 state=true;
mbedalvaro 0:4b5874bff9bb 153 _pin=state;
mbedalvaro 0:4b5874bff9bb 154 mix=true;
mbedalvaro 0:4b5874bff9bb 155 }
mbedalvaro 0:4b5874bff9bb 156
mbedalvaro 0:4b5874bff9bb 157 void start() {
mbedalvaro 1:4284f27d638d 158 myTicker.attach_us(this, &Shutter::flip, (unsigned int)(0.5*us_interval)); // the address of the object, member function, and interval
mbedalvaro 0:4b5874bff9bb 159 }
mbedalvaro 0:4b5874bff9bb 160
mbedalvaro 0:4b5874bff9bb 161 void mixSignal(bool mode) {
mbedalvaro 0:4b5874bff9bb 162 mix=mode;
mbedalvaro 0:4b5874bff9bb 163 }
mbedalvaro 0:4b5874bff9bb 164
mbedalvaro 0:4b5874bff9bb 165 void stop() {
mbedalvaro 0:4b5874bff9bb 166 myTicker.detach();
mbedalvaro 0:4b5874bff9bb 167 }
mbedalvaro 0:4b5874bff9bb 168
mbedalvaro 0:4b5874bff9bb 169 // the shutter "flip" function also affect the friend variable "multiplier":
mbedalvaro 0:4b5874bff9bb 170 void flip() {
mbedalvaro 0:4b5874bff9bb 171 state = !state;
mbedalvaro 0:4b5874bff9bb 172 _pin=state;
mbedalvaro 0:4b5874bff9bb 173 if (mix) {
mbedalvaro 0:4b5874bff9bb 174 Flipper::multiplier=state;
mbedalvaro 0:4b5874bff9bb 175 }
mbedalvaro 0:4b5874bff9bb 176 else {
mbedalvaro 0:4b5874bff9bb 177 Flipper::multiplier=true;
mbedalvaro 0:4b5874bff9bb 178 }
mbedalvaro 0:4b5874bff9bb 179 Flipper::multImmediate();
mbedalvaro 0:4b5874bff9bb 180 }
mbedalvaro 0:4b5874bff9bb 181
mbedalvaro 0:4b5874bff9bb 182 private:
mbedalvaro 0:4b5874bff9bb 183 bool mix; // this is for mixing this signal with the led (ie, product)
mbedalvaro 0:4b5874bff9bb 184 bool state;
mbedalvaro 0:4b5874bff9bb 185 DigitalOut _pin;
mbedalvaro 0:4b5874bff9bb 186 unsigned int us_interval;
mbedalvaro 0:4b5874bff9bb 187 Ticker myTicker;
mbedalvaro 0:4b5874bff9bb 188 };
mbedalvaro 0:4b5874bff9bb 189
mbedalvaro 0:4b5874bff9bb 190 #endif