David's line following code from the LVBots competition, 2015.
Dependencies: GeneralDebouncer Pacer PololuEncoder mbed
Fork of DeadReckoning by
Diff: line_tracker.cpp
- Revision:
- 22:44c032e59ff5
- Parent:
- 21:c279c6a83671
- Child:
- 24:fc01d9125d3b
diff -r c279c6a83671 -r 44c032e59ff5 line_tracker.cpp --- 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]; } + } + } +}