finds track with line scan camera

Dependents:   aNXPCupCar

Revision:
0:7653b2a26797
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CAMERA.cpp	Wed Dec 19 09:13:48 2018 +0000
@@ -0,0 +1,125 @@
+#include "mbed.h"
+#include "CAMERA.h"
+
+CAMERA::CAMERA(PinName dig1,PinName dig2,PinName an):
+    SI(dig1),CK(dig2),lux(an)
+{
+    init();
+    t.attach(this, &CAMERA::protocol, 0.02);
+}                   
+
+void CAMERA::init()
+{
+    SI = 0;
+    CK = 0;
+    halfPulse = 0.0000005;  //0.5 microseconds
+    carrot = 64;
+    for(i=0; i < 128; i++) pixel[i] = 0;
+}
+
+void CAMERA::protocol()
+{
+    sum = 0;
+    SI = 1;
+    wait(halfPulse);
+    CK = 1;
+    wait(halfPulse);
+    SI = 0;
+    wait(halfPulse);
+    pixel[0] = CAMERA::buffer();
+    CK = 0;
+    for(i=1; i<128; i++) {
+        wait(halfPulse);
+        wait(halfPulse);
+        CK = 1;
+        wait(halfPulse);
+        wait(halfPulse);
+        pixel[i] = CAMERA::buffer();
+        if(i > 9 && i < 118) sum += 1/(float)pixel[i];
+        CK = 0;
+
+    }
+    wait(halfPulse);
+    wait(halfPulse);
+    CK = 1;
+    wait(halfPulse);
+    wait(halfPulse);
+    CK = 0;
+    CAMERA::pathFinder();
+}
+
+int CAMERA::buffer()
+{
+    signal = lux;
+    return signal*330;      //multiplied because of
+}                           //simpler handling of data
+
+void CAMERA::pathFinder()
+{
+    mean = 108 / sum;       //harmonic mean
+    i = carrot - 1;
+    while(mean < pixel[i] && i > 9) {
+        xL = i;
+        i--;                //iterations to left
+    }                       //from the cursor
+    i = carrot;
+    while(mean < pixel[i] && i < 118) {
+        xR = i;
+        i++;                //iterations to right
+    }                       //from the cursor.
+    carrot = (xL + xR)/2;   //aritmetic mean
+}                           //to position cursor
+
+int CAMERA::getPath()
+{
+    return carrot;
+}
+
+
+/*void CAMERA::derivation()
+{
+    min1 = 12;
+    min2 = 115;
+    for(i=0; i<5; i++) temp[i] = 0;
+    for(i=0; i<5; i++) x[i] = 0;
+    pad = false;
+    a = 0;
+    max_temp = 0;
+    for(i=12; i<64; i++) {
+        if(pixel[i] < pixel[i-1]) {
+            pad = true;
+            temp[a]++;
+        } else if(pad) {
+            x[a] = i;
+            a++;
+            pad = false;
+        }
+    }
+    for(a=0; a<5; a++) {
+        if(temp[a] > max_temp) {
+            max_temp = temp[a];
+            min1 = x[a];
+        }
+    }
+    for(i=0; i<5; i++) temp[i] = 0;
+    for(i=0; i<5; i++) x[i] = 0;
+    pad = false;
+    a = 0;
+    max_temp = 0;
+    for(i=115; i>=64; i--) {
+        if(pixel[i] < pixel[i+1]) {
+            pad = true;
+            temp[a]++;
+        } else if(pad) {
+            x[a] = i;
+            a++;
+            pad = false;
+        }
+    }
+    for(a=0; a<5; a++) {
+        if(temp[a] > max_temp) {
+            max_temp = temp[a];
+            min2 = x[a];
+        }
+    }
+}*/