Pololu Robotics & Electronics
Menu
My account Comments or questions? About Pololu Contact Ordering information Distributors

Pololu Forum

QTR-8A Sensor Incorrect Readings

Hello,
I have been working with the QTR-8A sensor with an Arduino UNO in an attempt to create a line following robot. To test the QTR-8A sensor I have been using the “QTRAExample” (as seen below) file provided with the Polulu QTR-sensor-library. The issue that I have been having is that sensor 5 and 6 will print out inaccurate values when calibrating over a white piece of paper, and a standard piece of electrical tape (all other sensors calibrate to a value between 500-600, while sensor 5 and 6 calibrate between 800-900).

#include <QTRSensors.h>

// This example is designed for use with six QTR-1A sensors or the first six sensors of a
// QTR-8A module.  These reflectance sensors should be connected to analog inputs 0 to 5.
// The QTR-8A's emitter control pin (LEDON) can optionally be connected to digital pin 2, 
// or you can leave it disconnected and change the EMITTER_PIN #define below from 2 to 
// QTR_NO_EMITTER_PIN.

// The setup phase of this example calibrates the sensor for ten seconds and turns on
// the LED built in to the Arduino on pin 13 while calibration is going on.
// During this phase, you should expose each reflectance sensor to the lightest and 
// darkest readings they will encounter.
// For example, if you are making a line follower, you should slide the sensors across the
// line during the calibration phase so that each sensor can get a reading of how dark the
// line is and how light the ground is.  Improper calibration will result in poor readings.
// If you want to skip the calibration phase, you can get the raw sensor readings
// (analog voltage readings from 0 to 1023) by calling qtra.read(sensorValues) instead of
// qtra.readLine(sensorValues).

// The main loop of the example reads the calibrated sensor values and uses them to
// estimate the position of a line.  You can test this by taping a piece of 3/4" black
// electrical tape to a piece of white paper and sliding the sensor across it.  It
// prints the sensor values to the serial monitor as numbers from 0 (maximum reflectance) 
// to 1000 (minimum reflectance) followed by the estimated location of the line as a number
// from 0 to 5000.  1000 means the line is directly under sensor 1, 2000 means directly
// under sensor 2, etc.  0 means the line is directly under sensor 0 or was last seen by
// sensor 0 before being lost.  5000 means the line is directly under sensor 5 or was
// last seen by sensor 5 before being lost.


#define NUM_SENSORS             6  // number of sensors used
#define NUM_SAMPLES_PER_SENSOR  4  // average 4 analog samples per sensor reading
#define EMITTER_PIN             QTR_NO_EMITTER_PIN  // emitter is controlled by digital pin 2

// sensors 0 through 5 are connected to analog inputs 0 through 5, respectively
QTRSensorsAnalog qtra((unsigned char[]) {0, 1, 2, 3, 4, 5}, 
  NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];


void setup()
{
  delay(500);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);    // turn on Arduino's LED to indicate we are in calibration mode
  for (int i = 0; i < 400; i++)  // make the calibration take about 10 seconds
  {
    qtra.calibrate();       // reads all sensors 10 times at 2.5 ms per six sensors (i.e. ~25 ms per call)
  }
  digitalWrite(13, LOW);     // turn off Arduino's LED to indicate we are through with calibration

  // print the calibration minimum values measured when emitters were on
  Serial.begin(9600);
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtra.calibratedMinimumOn[i]);
    Serial.print(' ');
  }
  Serial.println();
  
  // print the calibration maximum values measured when emitters were on
  for (int i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(qtra.calibratedMaximumOn[i]);
    Serial.print(' ');
  }
  Serial.println();
  Serial.println();
  delay(1000);
}


void loop()
{
  // read calibrated sensor values and obtain a measure of the line position from 0 to 5000
  // To get raw sensor values, call:
  //  qtra.read(sensorValues); instead of unsigned int position = qtra.readLine(sensorValues);
  unsigned int position = qtra.readLine(sensorValues);
  
  // print the sensor values as numbers from 0 to 1000, where 0 means maximum reflectance and
  // 1000 means minimum reflectance, followed by the line position
  for (unsigned char i = 0; i < NUM_SENSORS; i++)
  {
    Serial.print(sensorValues[i]);
    Serial.print('\t');
  }
  //Serial.println(); // uncomment this line if you are using raw values
  Serial.println(position); // comment this line out if you are using raw values
  
  delay(250);
}

Here is a small section of the output following calibration:
512 494 504 502 924 899
1023 1023 1023 1023 1023 1023

986 971 982 971 929 814 2411
984 964 818 973 767 0 1905
929 996 942 925 545 798 2302
939 950 917 909 494 983 2388
972 973 971 959 848 870 2419
677 633 747 735 0 709 2249
677 661 695 1000 1000 0 2244
518 850 1000 865 0 419 2064
816 1000 1000 909 151 564 2061
886 992 913 877 0 483 1894
1000 899 894 898 525 540 2140
841 879 822 842 484 669 2276
992 977 996 963 969 983 2491

I have tried multiple QTR-8A sensors and the problem is the same with the other modules. I have also been calibrating the sensor at 3mm height from the piece of paper, as recommended in the user’s guide. I have also tried switching out the wires running from the sensor to the Arduino, and the problem still consists. I have been powering the sensor from a power supply at 5V and it is pulling .09A. Lastly, I checked if the IR sensors were emitting properly by turning off the lights, and using the front facing camera of my phone, and they were all emitting properly. I can send pictures if they are needed.

Thank You in advance and I look forward to what you have to say! =)

Hello.

Can you post pictures showing how the sensor array is mounted to your robot and a close-up of the board? Also, can you post a video showing how you are calibrating the sensors? If you swapped the connections to sensors 5 and 6 with sensors 1 and 2, does the problem follow the connections or not? How are you powering the sensor array?

- Amanda