David's dead reckoning code for the LVBots competition on March 6th. Uses the mbed LPC1768, DRV8835, QTR-3RC, and two DC motors with encoders.

Dependencies:   PololuEncoder Pacer mbed GeneralDebouncer

Revision:
22:44c032e59ff5
Parent:
21:c279c6a83671
Child:
24:fc01d9125d3b
--- a/line_tracker.cpp	Thu Feb 27 23:20:34 2014 +0000
+++ b/line_tracker.cpp	Fri Feb 28 00:16:49 2014 +0000
@@ -12,30 +12,7 @@
         calibratedMaximum[s] = 0;   
         calibratedMinimum[s] = 0xFFFF;   
     }
-}
-
-void LineTracker::updateCalibration()
-{
-    const int sampleCount = 10;
-
-    uint16_t maxValues[LINE_SENSOR_COUNT];
-    uint16_t minValues[LINE_SENSOR_COUNT];
-    
-    for(uint8_t sample = 0; sample < sampleCount; sample++)
-    {
-        for(uint8_t s = 0; s < LINE_SENSOR_COUNT; s++)
-        {
-            uint16_t reading = readSensor(s);
-            if (reading > maxValues[s]) { maxValues[s] = reading; }
-            if (reading < minValues[s]) { minValues[s] = reading; }
-        }
-    }
-    
-    for(uint8_t s = 0; s < LINE_SENSOR_COUNT; s++)
-    {
-        if (minValues[s] > calibratedMaximum[s]) { calibratedMaximum[s] = minValues[s]; }
-        if (maxValues[s] > calibratedMinimum[s]) { calibratedMinimum[s] = maxValues[s]; }
-    }
+    calibrationState = 0;
 }
 
 void LineTracker::read()
@@ -55,13 +32,12 @@
 
 void LineTracker::updateCalibratedValues()
 {
-    // Update the calibrated values.
     for(uint8_t s = 0; s < LINE_SENSOR_COUNT; s++)
     {
         uint16_t calmin = calibratedMinimum[s];
         uint16_t calmax = calibratedMaximum[s];
         uint16_t denominator = calmax - calmin;
-        int16_t x = 0;
+        int32_t x = 0;
         if(denominator != 0)
         {
             x = ((int32_t)rawValues[s] - calmin) * 1000 / denominator;
@@ -130,4 +106,36 @@
 uint16_t LineTracker::getLinePosition()
 {
     return linePosition;   
-}
\ No newline at end of file
+}
+
+void LineTracker::updateCalibration()
+{
+    if(calibrationState == 0)
+    {
+        for(uint8_t s = 0; s < LINE_SENSOR_COUNT; s++)
+        {
+            recentValuesMin[s] = 0xFFFF;
+            recentValuesMax[s] = 0;
+        }
+    }
+
+    for(uint8_t s = 0; s < LINE_SENSOR_COUNT; s++)
+    {
+        uint16_t value = rawValues[s];
+        if (value < recentValuesMin[s]) { recentValuesMin[s] = value; }
+        if (value > recentValuesMax[s]) { recentValuesMax[s] = value; }
+    }
+
+    calibrationState = calibrationState + 1;
+
+    if (calibrationState == 9)
+    {
+        calibrationState = 0;   
+        
+        for(uint8_t s = 0; s < LINE_SENSOR_COUNT; s++)
+        {
+            if (recentValuesMin[s] > calibratedMaximum[s]) { calibratedMaximum[s] = recentValuesMin[s]; }
+            if (recentValuesMax[s] < calibratedMinimum[s]) { calibratedMinimum[s] = recentValuesMax[s]; }
+        }
+    }    
+}