This is the device firmware for the imagingBoard on the DIY 3D Printable Raspberry Pi Raman Spectrometer. For more details please visit: http://hackaday.io/project/1279
main.cpp@11:1851a9c7ce9c, 2014-09-18 (annotated)
- Committer:
- flatcat
- Date:
- Thu Sep 18 10:43:20 2014 +0000
- Revision:
- 11:1851a9c7ce9c
- Parent:
- 10:f16d2d5bd04d
Added serial configuration for sensitivity.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
flatcat | 0:984447b91a04 | 1 | #include "mbed.h" |
flatcat | 0:984447b91a04 | 2 | |
flatcat | 0:984447b91a04 | 3 | // *** BE SURE TO TEST BEFORE AND AFTER FOR 'IDLING'... CLEAR THE CCD EVERY OTHER FRAME TO TRY AND ELIMINATE NOISE BUILDUP |
flatcat | 0:984447b91a04 | 4 | //From http://www.ing.iac.es/~docs/ins/das/ins-das-29/integration.html |
flatcat | 0:984447b91a04 | 5 | //"Idling" vs. integrating |
flatcat | 0:984447b91a04 | 6 | //Charge from light leaks and thermal noise builds up on the detector between observations. If this charge is integrated by the detector, it may not be completely |
flatcat | 0:984447b91a04 | 7 | //cleared away by the clear cycle of the next observation. In that case, the observation will be contaminated by extra counts. (Often, this appears as a ramp in the |
flatcat | 0:984447b91a04 | 8 | //background leading up to a saturated region in the low-numbered rows.) |
flatcat | 0:984447b91a04 | 9 | //To avoid this problem, the detector is made to clear itself continuously between observations. This is called "idling", and is reported as such on the mimic. |
flatcat | 0:984447b91a04 | 10 | |
flatcat | 1:a220fd937508 | 11 | PwmOut masterClock(PB_4); |
flatcat | 0:984447b91a04 | 12 | PwmOut shiftGate(PB_8); |
flatcat | 1:a220fd937508 | 13 | InterruptIn shiftGate_int(PC_6); |
flatcat | 1:a220fd937508 | 14 | DigitalOut ICG(PB_3); |
flatcat | 0:984447b91a04 | 15 | AnalogIn imageIn(A0); |
flatcat | 1:a220fd937508 | 16 | DigitalOut LED(LED1); |
flatcat | 10:f16d2d5bd04d | 17 | DigitalOut illuminator(PA_8); |
flatcat | 10:f16d2d5bd04d | 18 | DigitalOut blueLED(PB_5); |
flatcat | 10:f16d2d5bd04d | 19 | DigitalOut redLED(PB_10); |
flatcat | 0:984447b91a04 | 20 | Serial raspi(USBTX, USBRX); |
flatcat | 0:984447b91a04 | 21 | |
flatcat | 10:f16d2d5bd04d | 22 | /* |
flatcat | 10:f16d2d5bd04d | 23 | int masterFreq_period = 20; //microseconds |
flatcat | 10:f16d2d5bd04d | 24 | int masterFreq_width = 10; //microseconds |
flatcat | 8:5fcd8a2149f0 | 25 | int shiftGate_period = 66; //microseconds |
flatcat | 8:5fcd8a2149f0 | 26 | int shiftGate_width = 33; //microseconds |
flatcat | 10:f16d2d5bd04d | 27 | */ |
flatcat | 10:f16d2d5bd04d | 28 | |
flatcat | 11:1851a9c7ce9c | 29 | float firmwareVersion = 0.2; |
flatcat | 11:1851a9c7ce9c | 30 | |
flatcat | 11:1851a9c7ce9c | 31 | |
flatcat | 10:f16d2d5bd04d | 32 | int masterFreq_period = 2; //microseconds |
flatcat | 10:f16d2d5bd04d | 33 | int masterFreq_width = 1; //microseconds |
flatcat | 10:f16d2d5bd04d | 34 | int shiftGate_period = 8; //microseconds |
flatcat | 10:f16d2d5bd04d | 35 | int shiftGate_width = 4; //microseconds |
flatcat | 1:a220fd937508 | 36 | |
flatcat | 3:83cb6eb61adf | 37 | int none = 0; |
flatcat | 11:1851a9c7ce9c | 38 | int veryLow = 10; |
flatcat | 1:a220fd937508 | 39 | int low = 100; |
flatcat | 9:841663cf312c | 40 | int mediumLow = 1000; |
flatcat | 1:a220fd937508 | 41 | int medium = 100000; |
flatcat | 10:f16d2d5bd04d | 42 | int high = 5000000; |
flatcat | 1:a220fd937508 | 43 | int veryHigh = 10000000; |
flatcat | 1:a220fd937508 | 44 | |
flatcat | 2:7751080fb267 | 45 | double imageData; |
flatcat | 11:1851a9c7ce9c | 46 | int sensitivity; |
flatcat | 1:a220fd937508 | 47 | int pixelTotal = 3694; |
flatcat | 1:a220fd937508 | 48 | int leadingDummyElements = 16; |
flatcat | 1:a220fd937508 | 49 | int leadShieldedElements = 13; |
flatcat | 1:a220fd937508 | 50 | int headerElements = 3; |
flatcat | 5:cbf08f942178 | 51 | const int signalElements = 3648; |
flatcat | 1:a220fd937508 | 52 | int trailingDummyElements = 14; |
flatcat | 1:a220fd937508 | 53 | int pixelCount; |
flatcat | 1:a220fd937508 | 54 | int readOutTrigger; |
flatcat | 1:a220fd937508 | 55 | int state; |
flatcat | 1:a220fd937508 | 56 | |
flatcat | 1:a220fd937508 | 57 | #define readOut_Begin 1 |
flatcat | 1:a220fd937508 | 58 | #define readOut_ACTIVE 2 |
flatcat | 1:a220fd937508 | 59 | #define readOut_LeadingDummy 3 |
flatcat | 1:a220fd937508 | 60 | #define readOut_LeadingShielded 4 |
flatcat | 1:a220fd937508 | 61 | #define readOut_headerElements 5 |
flatcat | 1:a220fd937508 | 62 | #define readOut_signalElements 6 |
flatcat | 1:a220fd937508 | 63 | #define readOut_trailingDummy 7 |
flatcat | 1:a220fd937508 | 64 | #define readOut_integrationTime 8 |
flatcat | 1:a220fd937508 | 65 | #define readOut_IDLE 9 |
flatcat | 1:a220fd937508 | 66 | #define readOut_Finish 0 |
flatcat | 0:984447b91a04 | 67 | |
flatcat | 0:984447b91a04 | 68 | #define MV(x) ((0xFFF*x)/3300) |
flatcat | 0:984447b91a04 | 69 | |
flatcat | 6:fe473ca8b625 | 70 | double pixelValue[signalElements] = { 0 }; |
flatcat | 1:a220fd937508 | 71 | |
flatcat | 1:a220fd937508 | 72 | void error() |
flatcat | 1:a220fd937508 | 73 | { |
flatcat | 1:a220fd937508 | 74 | while(1) { |
flatcat | 1:a220fd937508 | 75 | LED = !LED; |
flatcat | 1:a220fd937508 | 76 | wait(0.5); |
flatcat | 1:a220fd937508 | 77 | } |
flatcat | 1:a220fd937508 | 78 | } |
flatcat | 1:a220fd937508 | 79 | |
flatcat | 1:a220fd937508 | 80 | void checkState() |
flatcat | 1:a220fd937508 | 81 | { |
flatcat | 1:a220fd937508 | 82 | if (readOutTrigger == 1) { |
flatcat | 1:a220fd937508 | 83 | // state = readOut_LeadingDummy; |
flatcat | 1:a220fd937508 | 84 | } |
flatcat | 1:a220fd937508 | 85 | switch (state) { |
flatcat | 1:a220fd937508 | 86 | case readOut_Begin: |
flatcat | 10:f16d2d5bd04d | 87 | redLED = 1; |
flatcat | 10:f16d2d5bd04d | 88 | blueLED = 0; |
flatcat | 1:a220fd937508 | 89 | readOutTrigger = 1; |
flatcat | 1:a220fd937508 | 90 | state = readOut_ACTIVE; |
flatcat | 6:fe473ca8b625 | 91 | // raspi.printf("+++\r\n"); |
flatcat | 1:a220fd937508 | 92 | LED = 1; |
flatcat | 1:a220fd937508 | 93 | break; |
flatcat | 1:a220fd937508 | 94 | case readOut_ACTIVE: |
flatcat | 1:a220fd937508 | 95 | ICG = 1; |
flatcat | 1:a220fd937508 | 96 | state = readOut_LeadingDummy; |
flatcat | 1:a220fd937508 | 97 | break; |
flatcat | 1:a220fd937508 | 98 | case readOut_LeadingDummy: |
flatcat | 1:a220fd937508 | 99 | pixelCount++; |
flatcat | 10:f16d2d5bd04d | 100 | if (pixelCount == leadingDummyElements - 1) { |
flatcat | 1:a220fd937508 | 101 | pixelCount = 0; |
flatcat | 1:a220fd937508 | 102 | state = readOut_LeadingShielded; |
flatcat | 1:a220fd937508 | 103 | } |
flatcat | 1:a220fd937508 | 104 | break; |
flatcat | 1:a220fd937508 | 105 | case readOut_LeadingShielded: |
flatcat | 1:a220fd937508 | 106 | pixelCount++; |
flatcat | 10:f16d2d5bd04d | 107 | if (pixelCount == leadShieldedElements - 1) { |
flatcat | 1:a220fd937508 | 108 | pixelCount = 0; |
flatcat | 1:a220fd937508 | 109 | state = readOut_headerElements; |
flatcat | 1:a220fd937508 | 110 | } |
flatcat | 1:a220fd937508 | 111 | break; |
flatcat | 1:a220fd937508 | 112 | case readOut_headerElements: |
flatcat | 1:a220fd937508 | 113 | pixelCount++; |
flatcat | 10:f16d2d5bd04d | 114 | if (pixelCount == headerElements - 1) { |
flatcat | 1:a220fd937508 | 115 | pixelCount = 0; |
flatcat | 1:a220fd937508 | 116 | state = readOut_signalElements; |
flatcat | 1:a220fd937508 | 117 | } |
flatcat | 1:a220fd937508 | 118 | break; |
flatcat | 1:a220fd937508 | 119 | case readOut_signalElements: |
flatcat | 1:a220fd937508 | 120 | pixelCount++; |
flatcat | 6:fe473ca8b625 | 121 | pixelValue[pixelCount] = imageIn.read_u16(); |
flatcat | 6:fe473ca8b625 | 122 | // raspi.printf("%i\t%4.12f\r\n", pixelCount,(imageIn.read_u16() * 5.0) / 4096.0); |
flatcat | 10:f16d2d5bd04d | 123 | if (pixelCount == signalElements - 1) { |
flatcat | 1:a220fd937508 | 124 | pixelCount = 0; |
flatcat | 1:a220fd937508 | 125 | state = readOut_trailingDummy; |
flatcat | 1:a220fd937508 | 126 | } |
flatcat | 1:a220fd937508 | 127 | break; |
flatcat | 1:a220fd937508 | 128 | case readOut_trailingDummy: |
flatcat | 1:a220fd937508 | 129 | pixelCount++; |
flatcat | 10:f16d2d5bd04d | 130 | if (pixelCount == trailingDummyElements - 1) { |
flatcat | 1:a220fd937508 | 131 | pixelCount = 0; |
flatcat | 1:a220fd937508 | 132 | state = readOut_integrationTime; |
flatcat | 2:7751080fb267 | 133 | ICG = 0; |
flatcat | 1:a220fd937508 | 134 | } |
flatcat | 1:a220fd937508 | 135 | break; |
flatcat | 1:a220fd937508 | 136 | case readOut_integrationTime: |
flatcat | 1:a220fd937508 | 137 | wait_us(sensitivity); |
flatcat | 2:7751080fb267 | 138 | state = readOut_Finish; |
flatcat | 6:fe473ca8b625 | 139 | for (int pixelNumber=0; pixelNumber<signalElements; pixelNumber++) { |
flatcat | 10:f16d2d5bd04d | 140 | raspi.printf("%i\t%4.12f\r\n", pixelNumber, 5 - ((pixelValue[pixelNumber - 1] * 5) / 4096.0)); |
flatcat | 6:fe473ca8b625 | 141 | } |
flatcat | 6:fe473ca8b625 | 142 | // raspi.printf("---\r\n"); |
flatcat | 1:a220fd937508 | 143 | break; |
flatcat | 1:a220fd937508 | 144 | case readOut_Finish: |
flatcat | 10:f16d2d5bd04d | 145 | redLED = 0; |
flatcat | 1:a220fd937508 | 146 | state = readOut_IDLE; |
flatcat | 2:7751080fb267 | 147 | wait_us(sensitivity); |
flatcat | 1:a220fd937508 | 148 | LED = 0; |
flatcat | 10:f16d2d5bd04d | 149 | illuminator = 0; |
flatcat | 1:a220fd937508 | 150 | ICG = 1; |
flatcat | 1:a220fd937508 | 151 | break; |
flatcat | 1:a220fd937508 | 152 | case readOut_IDLE: |
flatcat | 1:a220fd937508 | 153 | if (ICG == 1) { |
flatcat | 4:4eedf8292719 | 154 | // ICG = 0; |
flatcat | 4:4eedf8292719 | 155 | // state = readOut_Begin; |
flatcat | 10:f16d2d5bd04d | 156 | blueLED = 1; |
flatcat | 1:a220fd937508 | 157 | } |
flatcat | 1:a220fd937508 | 158 | break; |
flatcat | 1:a220fd937508 | 159 | default: |
flatcat | 1:a220fd937508 | 160 | break; |
flatcat | 1:a220fd937508 | 161 | } |
flatcat | 1:a220fd937508 | 162 | } |
flatcat | 1:a220fd937508 | 163 | |
flatcat | 11:1851a9c7ce9c | 164 | void printInfo(){ |
flatcat | 11:1851a9c7ce9c | 165 | raspi.printf("meridianScientific\r\n"); |
flatcat | 11:1851a9c7ce9c | 166 | raspi.printf("ramanPi - The DIY 3D Printable RaspberryPi Raman Spectrometer\r\n"); |
flatcat | 11:1851a9c7ce9c | 167 | raspi.printf("Spectrometer imagingBoard\r\n"); |
flatcat | 11:1851a9c7ce9c | 168 | raspi.printf("-------------------------------------------------------------\r\n"); |
flatcat | 11:1851a9c7ce9c | 169 | raspi.printf("Firmware Version: %f\r\n",firmwareVersion); |
flatcat | 11:1851a9c7ce9c | 170 | raspi.printf("Current Sensitivity: %d\r\n", sensitivity); |
flatcat | 11:1851a9c7ce9c | 171 | } |
flatcat | 11:1851a9c7ce9c | 172 | |
flatcat | 0:984447b91a04 | 173 | int main() |
flatcat | 0:984447b91a04 | 174 | { |
flatcat | 1:a220fd937508 | 175 | ICG = 1; |
flatcat | 1:a220fd937508 | 176 | LED = 0; |
flatcat | 10:f16d2d5bd04d | 177 | blueLED = 0; |
flatcat | 10:f16d2d5bd04d | 178 | redLED = 0; |
flatcat | 1:a220fd937508 | 179 | pixelCount = 0; |
flatcat | 1:a220fd937508 | 180 | readOutTrigger = 0; |
flatcat | 1:a220fd937508 | 181 | state = readOut_IDLE; |
flatcat | 1:a220fd937508 | 182 | |
flatcat | 0:984447b91a04 | 183 | masterClock.period_us(masterFreq_period); |
flatcat | 0:984447b91a04 | 184 | masterClock.pulsewidth_us(masterFreq_width); |
flatcat | 0:984447b91a04 | 185 | |
flatcat | 0:984447b91a04 | 186 | shiftGate.period_us(shiftGate_period); |
flatcat | 0:984447b91a04 | 187 | shiftGate.pulsewidth_us(shiftGate_width); |
flatcat | 0:984447b91a04 | 188 | |
flatcat | 2:7751080fb267 | 189 | raspi.baud(921600); |
flatcat | 1:a220fd937508 | 190 | wait(0.5); |
flatcat | 1:a220fd937508 | 191 | |
flatcat | 1:a220fd937508 | 192 | shiftGate_int.rise(checkState); |
flatcat | 1:a220fd937508 | 193 | |
flatcat | 0:984447b91a04 | 194 | raspi.baud(921600); |
flatcat | 10:f16d2d5bd04d | 195 | blueLED = 0; |
flatcat | 11:1851a9c7ce9c | 196 | sensitivity = low; |
flatcat | 0:984447b91a04 | 197 | while(1) { |
flatcat | 10:f16d2d5bd04d | 198 | if (state != readOut_IDLE) //reading is top priority |
flatcat | 10:f16d2d5bd04d | 199 | { |
flatcat | 10:f16d2d5bd04d | 200 | continue; |
flatcat | 10:f16d2d5bd04d | 201 | } |
flatcat | 4:4eedf8292719 | 202 | char c = raspi.getc(); |
flatcat | 6:fe473ca8b625 | 203 | switch (c) { |
flatcat | 4:4eedf8292719 | 204 | case 'r': |
flatcat | 10:f16d2d5bd04d | 205 | illuminator = 1; |
flatcat | 10:f16d2d5bd04d | 206 | wait(1); |
flatcat | 4:4eedf8292719 | 207 | ICG = 0; |
flatcat | 4:4eedf8292719 | 208 | state = readOut_Begin; |
flatcat | 4:4eedf8292719 | 209 | break; |
flatcat | 11:1851a9c7ce9c | 210 | case 'l': |
flatcat | 11:1851a9c7ce9c | 211 | sensitivity = low; |
flatcat | 11:1851a9c7ce9c | 212 | break; |
flatcat | 11:1851a9c7ce9c | 213 | case 'v': |
flatcat | 11:1851a9c7ce9c | 214 | sensitivity = veryLow; |
flatcat | 11:1851a9c7ce9c | 215 | break; |
flatcat | 11:1851a9c7ce9c | 216 | case 'n': |
flatcat | 11:1851a9c7ce9c | 217 | sensitivity = mediumLow; |
flatcat | 11:1851a9c7ce9c | 218 | break; |
flatcat | 11:1851a9c7ce9c | 219 | case 'm': |
flatcat | 11:1851a9c7ce9c | 220 | sensitivity = medium; |
flatcat | 11:1851a9c7ce9c | 221 | break; |
flatcat | 11:1851a9c7ce9c | 222 | case 'h': |
flatcat | 11:1851a9c7ce9c | 223 | sensitivity = high; |
flatcat | 11:1851a9c7ce9c | 224 | break; |
flatcat | 11:1851a9c7ce9c | 225 | case 'c': |
flatcat | 11:1851a9c7ce9c | 226 | sensitivity = veryHigh; |
flatcat | 11:1851a9c7ce9c | 227 | break; |
flatcat | 11:1851a9c7ce9c | 228 | case 'i': |
flatcat | 11:1851a9c7ce9c | 229 | printInfo(); |
flatcat | 11:1851a9c7ce9c | 230 | break; |
flatcat | 4:4eedf8292719 | 231 | default: |
flatcat | 4:4eedf8292719 | 232 | break; |
flatcat | 4:4eedf8292719 | 233 | } |
flatcat | 0:984447b91a04 | 234 | } |
flatcat | 0:984447b91a04 | 235 | } |