finds track with line scan camera
CAMERA.cpp@0:7653b2a26797, 2018-12-19 (annotated)
- Committer:
- pkolar1
- Date:
- Wed Dec 19 09:13:48 2018 +0000
- Revision:
- 0:7653b2a26797
fin
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pkolar1 | 0:7653b2a26797 | 1 | #include "mbed.h" |
pkolar1 | 0:7653b2a26797 | 2 | #include "CAMERA.h" |
pkolar1 | 0:7653b2a26797 | 3 | |
pkolar1 | 0:7653b2a26797 | 4 | CAMERA::CAMERA(PinName dig1,PinName dig2,PinName an): |
pkolar1 | 0:7653b2a26797 | 5 | SI(dig1),CK(dig2),lux(an) |
pkolar1 | 0:7653b2a26797 | 6 | { |
pkolar1 | 0:7653b2a26797 | 7 | init(); |
pkolar1 | 0:7653b2a26797 | 8 | t.attach(this, &CAMERA::protocol, 0.02); |
pkolar1 | 0:7653b2a26797 | 9 | } |
pkolar1 | 0:7653b2a26797 | 10 | |
pkolar1 | 0:7653b2a26797 | 11 | void CAMERA::init() |
pkolar1 | 0:7653b2a26797 | 12 | { |
pkolar1 | 0:7653b2a26797 | 13 | SI = 0; |
pkolar1 | 0:7653b2a26797 | 14 | CK = 0; |
pkolar1 | 0:7653b2a26797 | 15 | halfPulse = 0.0000005; //0.5 microseconds |
pkolar1 | 0:7653b2a26797 | 16 | carrot = 64; |
pkolar1 | 0:7653b2a26797 | 17 | for(i=0; i < 128; i++) pixel[i] = 0; |
pkolar1 | 0:7653b2a26797 | 18 | } |
pkolar1 | 0:7653b2a26797 | 19 | |
pkolar1 | 0:7653b2a26797 | 20 | void CAMERA::protocol() |
pkolar1 | 0:7653b2a26797 | 21 | { |
pkolar1 | 0:7653b2a26797 | 22 | sum = 0; |
pkolar1 | 0:7653b2a26797 | 23 | SI = 1; |
pkolar1 | 0:7653b2a26797 | 24 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 25 | CK = 1; |
pkolar1 | 0:7653b2a26797 | 26 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 27 | SI = 0; |
pkolar1 | 0:7653b2a26797 | 28 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 29 | pixel[0] = CAMERA::buffer(); |
pkolar1 | 0:7653b2a26797 | 30 | CK = 0; |
pkolar1 | 0:7653b2a26797 | 31 | for(i=1; i<128; i++) { |
pkolar1 | 0:7653b2a26797 | 32 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 33 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 34 | CK = 1; |
pkolar1 | 0:7653b2a26797 | 35 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 36 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 37 | pixel[i] = CAMERA::buffer(); |
pkolar1 | 0:7653b2a26797 | 38 | if(i > 9 && i < 118) sum += 1/(float)pixel[i]; |
pkolar1 | 0:7653b2a26797 | 39 | CK = 0; |
pkolar1 | 0:7653b2a26797 | 40 | |
pkolar1 | 0:7653b2a26797 | 41 | } |
pkolar1 | 0:7653b2a26797 | 42 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 43 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 44 | CK = 1; |
pkolar1 | 0:7653b2a26797 | 45 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 46 | wait(halfPulse); |
pkolar1 | 0:7653b2a26797 | 47 | CK = 0; |
pkolar1 | 0:7653b2a26797 | 48 | CAMERA::pathFinder(); |
pkolar1 | 0:7653b2a26797 | 49 | } |
pkolar1 | 0:7653b2a26797 | 50 | |
pkolar1 | 0:7653b2a26797 | 51 | int CAMERA::buffer() |
pkolar1 | 0:7653b2a26797 | 52 | { |
pkolar1 | 0:7653b2a26797 | 53 | signal = lux; |
pkolar1 | 0:7653b2a26797 | 54 | return signal*330; //multiplied because of |
pkolar1 | 0:7653b2a26797 | 55 | } //simpler handling of data |
pkolar1 | 0:7653b2a26797 | 56 | |
pkolar1 | 0:7653b2a26797 | 57 | void CAMERA::pathFinder() |
pkolar1 | 0:7653b2a26797 | 58 | { |
pkolar1 | 0:7653b2a26797 | 59 | mean = 108 / sum; //harmonic mean |
pkolar1 | 0:7653b2a26797 | 60 | i = carrot - 1; |
pkolar1 | 0:7653b2a26797 | 61 | while(mean < pixel[i] && i > 9) { |
pkolar1 | 0:7653b2a26797 | 62 | xL = i; |
pkolar1 | 0:7653b2a26797 | 63 | i--; //iterations to left |
pkolar1 | 0:7653b2a26797 | 64 | } //from the cursor |
pkolar1 | 0:7653b2a26797 | 65 | i = carrot; |
pkolar1 | 0:7653b2a26797 | 66 | while(mean < pixel[i] && i < 118) { |
pkolar1 | 0:7653b2a26797 | 67 | xR = i; |
pkolar1 | 0:7653b2a26797 | 68 | i++; //iterations to right |
pkolar1 | 0:7653b2a26797 | 69 | } //from the cursor. |
pkolar1 | 0:7653b2a26797 | 70 | carrot = (xL + xR)/2; //aritmetic mean |
pkolar1 | 0:7653b2a26797 | 71 | } //to position cursor |
pkolar1 | 0:7653b2a26797 | 72 | |
pkolar1 | 0:7653b2a26797 | 73 | int CAMERA::getPath() |
pkolar1 | 0:7653b2a26797 | 74 | { |
pkolar1 | 0:7653b2a26797 | 75 | return carrot; |
pkolar1 | 0:7653b2a26797 | 76 | } |
pkolar1 | 0:7653b2a26797 | 77 | |
pkolar1 | 0:7653b2a26797 | 78 | |
pkolar1 | 0:7653b2a26797 | 79 | /*void CAMERA::derivation() |
pkolar1 | 0:7653b2a26797 | 80 | { |
pkolar1 | 0:7653b2a26797 | 81 | min1 = 12; |
pkolar1 | 0:7653b2a26797 | 82 | min2 = 115; |
pkolar1 | 0:7653b2a26797 | 83 | for(i=0; i<5; i++) temp[i] = 0; |
pkolar1 | 0:7653b2a26797 | 84 | for(i=0; i<5; i++) x[i] = 0; |
pkolar1 | 0:7653b2a26797 | 85 | pad = false; |
pkolar1 | 0:7653b2a26797 | 86 | a = 0; |
pkolar1 | 0:7653b2a26797 | 87 | max_temp = 0; |
pkolar1 | 0:7653b2a26797 | 88 | for(i=12; i<64; i++) { |
pkolar1 | 0:7653b2a26797 | 89 | if(pixel[i] < pixel[i-1]) { |
pkolar1 | 0:7653b2a26797 | 90 | pad = true; |
pkolar1 | 0:7653b2a26797 | 91 | temp[a]++; |
pkolar1 | 0:7653b2a26797 | 92 | } else if(pad) { |
pkolar1 | 0:7653b2a26797 | 93 | x[a] = i; |
pkolar1 | 0:7653b2a26797 | 94 | a++; |
pkolar1 | 0:7653b2a26797 | 95 | pad = false; |
pkolar1 | 0:7653b2a26797 | 96 | } |
pkolar1 | 0:7653b2a26797 | 97 | } |
pkolar1 | 0:7653b2a26797 | 98 | for(a=0; a<5; a++) { |
pkolar1 | 0:7653b2a26797 | 99 | if(temp[a] > max_temp) { |
pkolar1 | 0:7653b2a26797 | 100 | max_temp = temp[a]; |
pkolar1 | 0:7653b2a26797 | 101 | min1 = x[a]; |
pkolar1 | 0:7653b2a26797 | 102 | } |
pkolar1 | 0:7653b2a26797 | 103 | } |
pkolar1 | 0:7653b2a26797 | 104 | for(i=0; i<5; i++) temp[i] = 0; |
pkolar1 | 0:7653b2a26797 | 105 | for(i=0; i<5; i++) x[i] = 0; |
pkolar1 | 0:7653b2a26797 | 106 | pad = false; |
pkolar1 | 0:7653b2a26797 | 107 | a = 0; |
pkolar1 | 0:7653b2a26797 | 108 | max_temp = 0; |
pkolar1 | 0:7653b2a26797 | 109 | for(i=115; i>=64; i--) { |
pkolar1 | 0:7653b2a26797 | 110 | if(pixel[i] < pixel[i+1]) { |
pkolar1 | 0:7653b2a26797 | 111 | pad = true; |
pkolar1 | 0:7653b2a26797 | 112 | temp[a]++; |
pkolar1 | 0:7653b2a26797 | 113 | } else if(pad) { |
pkolar1 | 0:7653b2a26797 | 114 | x[a] = i; |
pkolar1 | 0:7653b2a26797 | 115 | a++; |
pkolar1 | 0:7653b2a26797 | 116 | pad = false; |
pkolar1 | 0:7653b2a26797 | 117 | } |
pkolar1 | 0:7653b2a26797 | 118 | } |
pkolar1 | 0:7653b2a26797 | 119 | for(a=0; a<5; a++) { |
pkolar1 | 0:7653b2a26797 | 120 | if(temp[a] > max_temp) { |
pkolar1 | 0:7653b2a26797 | 121 | max_temp = temp[a]; |
pkolar1 | 0:7653b2a26797 | 122 | min2 = x[a]; |
pkolar1 | 0:7653b2a26797 | 123 | } |
pkolar1 | 0:7653b2a26797 | 124 | } |
pkolar1 | 0:7653b2a26797 | 125 | }*/ |