35#include "QTRSensors.h"
41void QTRSensors::init(
unsigned char *pins,
unsigned char numSensors,
42 unsigned char emitterPin)
44 calibratedMinimumOn=0;
45 calibratedMaximumOn=0;
46 calibratedMinimumOff=0;
47 calibratedMaximumOff=0;
51 if (numSensors > QTR_MAX_SENSORS)
52 _numSensors = QTR_MAX_SENSORS;
54 _numSensors = numSensors;
58 _pins = (
unsigned char*)malloc(
sizeof(
unsigned char)*_numSensors);
64 for (i = 0; i < _numSensors; i++)
69 _emitterPin = emitterPin;
81void QTRSensors::read(
unsigned int *sensor_values,
unsigned char readMode)
83 unsigned int off_values[QTR_MAX_SENSORS];
86 if(readMode == QTR_EMITTERS_ON || readMode == QTR_EMITTERS_ON_AND_OFF)
91 readPrivate(sensor_values);
94 if(readMode == QTR_EMITTERS_ON_AND_OFF)
96 readPrivate(off_values);
98 for(i=0;i<_numSensors;i++)
100 sensor_values[i] += _maxValue - off_values[i];
110void QTRSensors::emittersOff()
112 if (_emitterPin == QTR_NO_EMITTER_PIN)
114 pinMode(_emitterPin, OUTPUT);
115 digitalWrite(_emitterPin, LOW);
116 delayMicroseconds(200);
119void QTRSensors::emittersOn()
121 if (_emitterPin == QTR_NO_EMITTER_PIN)
123 pinMode(_emitterPin, OUTPUT);
124 digitalWrite(_emitterPin, HIGH);
125 delayMicroseconds(200);
129void QTRSensors::resetCalibration()
132 for(i=0;i<_numSensors;i++)
134 if(calibratedMinimumOn)
135 calibratedMinimumOn[i] = _maxValue;
136 if(calibratedMinimumOff)
137 calibratedMinimumOff[i] = _maxValue;
138 if(calibratedMaximumOn)
139 calibratedMaximumOn[i] = 0;
140 if(calibratedMaximumOff)
141 calibratedMaximumOff[i] = 0;
149void QTRSensors::calibrate(
unsigned char readMode)
151 if(readMode == QTR_EMITTERS_ON_AND_OFF || readMode == QTR_EMITTERS_ON)
153 calibrateOnOrOff(&calibratedMinimumOn,
154 &calibratedMaximumOn,
159 if(readMode == QTR_EMITTERS_ON_AND_OFF || readMode == QTR_EMITTERS_OFF)
161 calibrateOnOrOff(&calibratedMinimumOff,
162 &calibratedMaximumOff,
167void QTRSensors::calibrateOnOrOff(
unsigned int **calibratedMinimum,
168 unsigned int **calibratedMaximum,
169 unsigned char readMode)
172 unsigned int sensor_values[16];
173 unsigned int max_sensor_values[16];
174 unsigned int min_sensor_values[16];
177 if(*calibratedMaximum == 0)
179 *calibratedMaximum = (
unsigned int*)malloc(
sizeof(
unsigned int)*_numSensors);
182 if(*calibratedMaximum == 0)
188 for(i=0;i<_numSensors;i++)
189 (*calibratedMaximum)[i] = 0;
191 if(*calibratedMinimum == 0)
193 *calibratedMinimum = (
unsigned int*)malloc(
sizeof(
unsigned int)*_numSensors);
196 if(*calibratedMinimum == 0)
199 for(i=0;i<_numSensors;i++)
200 (*calibratedMinimum)[i] = _maxValue;
206 read(sensor_values,readMode);
207 for(i=0;i<_numSensors;i++)
210 if(j == 0 || max_sensor_values[i] < sensor_values[i])
211 max_sensor_values[i] = sensor_values[i];
214 if(j == 0 || min_sensor_values[i] > sensor_values[i])
215 min_sensor_values[i] = sensor_values[i];
220 for(i=0;i<_numSensors;i++)
222 if(min_sensor_values[i] > (*calibratedMaximum)[i])
223 (*calibratedMaximum)[i] = min_sensor_values[i];
224 if(max_sensor_values[i] < (*calibratedMinimum)[i])
225 (*calibratedMinimum)[i] = max_sensor_values[i];
235void QTRSensors::readCalibrated(
unsigned int *sensor_values,
unsigned char readMode)
240 if(readMode == QTR_EMITTERS_ON_AND_OFF || readMode == QTR_EMITTERS_OFF)
241 if(!calibratedMinimumOff || !calibratedMaximumOff)
243 if(readMode == QTR_EMITTERS_ON_AND_OFF || readMode == QTR_EMITTERS_ON)
244 if(!calibratedMinimumOn || !calibratedMaximumOn)
248 read(sensor_values,readMode);
250 for(i=0;i<_numSensors;i++)
252 unsigned int calmin,calmax;
253 unsigned int denominator;
256 if(readMode == QTR_EMITTERS_ON)
258 calmax = calibratedMaximumOn[i];
259 calmin = calibratedMinimumOn[i];
261 else if(readMode == QTR_EMITTERS_OFF)
263 calmax = calibratedMaximumOff[i];
264 calmin = calibratedMinimumOff[i];
269 if(calibratedMinimumOff[i] < calibratedMinimumOn[i])
272 calmin = calibratedMinimumOn[i] + _maxValue - calibratedMinimumOff[i];
274 if(calibratedMaximumOff[i] < calibratedMaximumOn[i])
277 calmax = calibratedMaximumOn[i] + _maxValue - calibratedMaximumOff[i];
280 denominator = calmax - calmin;
284 x = (((
signed long)sensor_values[i]) - calmin)
285 * 1000 / denominator;
290 sensor_values[i] = x;
315int QTRSensors::readLine(
unsigned int *sensor_values,
316 unsigned char readMode,
unsigned char white_line)
318 unsigned char i, on_line = 0;
323 readCalibrated(sensor_values, readMode);
328 for(i=0;i<_numSensors;i++) {
329 int value = sensor_values[i];
340 avg += (long)(value) * (i * 1000);
348 if(_lastValue < (_numSensors-1)*1000/2)
353 return (_numSensors-1)*1000;
357 _lastValue = avg/sum;
365QTRSensorsRC::QTRSensorsRC()
367 calibratedMinimumOn = 0;
368 calibratedMaximumOn = 0;
369 calibratedMinimumOff = 0;
370 calibratedMaximumOff = 0;
374QTRSensorsRC::QTRSensorsRC(
unsigned char* pins,
375 unsigned char numSensors,
unsigned int timeout,
unsigned char emitterPin)
377 calibratedMinimumOn = 0;
378 calibratedMaximumOn = 0;
379 calibratedMinimumOff = 0;
380 calibratedMaximumOff = 0;
383 init(pins, numSensors, timeout, emitterPin);
407void QTRSensorsRC::init(
unsigned char* pins,
408 unsigned char numSensors,
unsigned int timeout,
unsigned char emitterPin)
410 QTRSensors::init(pins, numSensors, emitterPin);
424void QTRSensorsRC::readPrivate(
unsigned int *sensor_values)
431 for(i = 0; i < _numSensors; i++)
433 sensor_values[i] = _maxValue;
434 digitalWrite(_pins[i], HIGH);
435 pinMode(_pins[i], OUTPUT);
438 delayMicroseconds(10);
440 for(i = 0; i < _numSensors; i++)
442 pinMode(_pins[i], INPUT);
443 digitalWrite(_pins[i], LOW);
446 unsigned long startTime = micros();
447 while (micros() - startTime < _maxValue)
449 unsigned int time = micros() - startTime;
450 for (i = 0; i < _numSensors; i++)
452 if (digitalRead(_pins[i]) == LOW && time < sensor_values[i])
453 sensor_values[i] = time;
461QTRSensorsAnalog::QTRSensorsAnalog()
463 calibratedMinimumOn = 0;
464 calibratedMaximumOn = 0;
465 calibratedMinimumOff = 0;
466 calibratedMaximumOff = 0;
470QTRSensorsAnalog::QTRSensorsAnalog(
unsigned char* pins,
471 unsigned char numSensors,
unsigned char numSamplesPerSensor,
472 unsigned char emitterPin)
474 calibratedMinimumOn = 0;
475 calibratedMaximumOn = 0;
476 calibratedMinimumOff = 0;
477 calibratedMaximumOff = 0;
480 init(pins, numSensors, numSamplesPerSensor, emitterPin);
507void QTRSensorsAnalog::init(
unsigned char* pins,
508 unsigned char numSensors,
unsigned char numSamplesPerSensor,
509 unsigned char emitterPin)
511 QTRSensors::init(pins, numSensors, emitterPin);
513 _numSamplesPerSensor = numSamplesPerSensor;
526void QTRSensorsAnalog::readPrivate(
unsigned int *sensor_values)
534 for(i = 0; i < _numSensors; i++)
535 sensor_values[i] = 0;
537 for (j = 0; j < _numSamplesPerSensor; j++)
539 for (i = 0; i < _numSensors; i++)
541 sensor_values[i] += analogRead(_pins[i]);
546 for (i = 0; i < _numSensors; i++)
547 sensor_values[i] = (sensor_values[i] + (_numSamplesPerSensor >> 1)) /
548 _numSamplesPerSensor;
552QTRSensors::~QTRSensors()
556 if(calibratedMaximumOn)
557 free(calibratedMaximumOn);
558 if(calibratedMaximumOff)
559 free(calibratedMaximumOff);
560 if(calibratedMinimumOn)
561 free(calibratedMinimumOn);
562 if(calibratedMinimumOff)
563 free(calibratedMinimumOff);