Line follower stops by Black line

Hello

I have a code for a line follower, it is intended that my robot follow the black line, but he stops at the black line! Does anyone know what that may lie: mounting the sensor, code or … Kan somebody look at my code and tell me what’s wrong is?

Thanks before

Ps: THE comment are in dutch because i am from Belgium

#include <QTRSensors.h>

#include <AFMotor.h>

AF_DCMotor motor1(1, MOTOR12_64KHZ);

AF_DCMotor motor2(2, MOTOR12_64KHZ);

#define KP .2

#define KD 5

#define M1_DEFAULT_SPEED 50

#define M2_DEFAULT_SPEED 50

#define M1_MAX_SPEED 255

#define M2_MAX_SPEED 255

#define MIDDLE_SENSOR 3

#define NUM_SENSORS 5

#define TIMEOUT 2500

#define EMITTER_PIN 2 // emitter is controlled by digital pin 2

#define DEBUG 0

QTRSensorsRC qtrrc((unsigned char) { 4,5,6,7,8} ,NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup() // voorbereiding

{

delay(1000); // 1000 miliseconden

manual_calibration(); // De methode wordt opgeroepen

set_motors(0,0); // De methode wordt opgeroepen

}

int lastError = 0;

int last_proportional = 0;

int integral = 0;

void loop()

{

unsigned int sensors[5];

// Het aantal sensors definiëren

int position = qtrrc.readLine(sensors);

// 0 tot 5000, waarbij 0 betekent direct onder de sensor of de lijn werd verloren

int error = position - 2000;

// error = positie - 2000

int motorSpeed = KP * error + KD * (error - lastError);

// De snelheid van de motor is gelijk aan 0,2 * error + 5 * (error - lastError)

lastError = error;

// De lastError = error

int leftMotorSpeed = M1_DEFAULT_SPEED + motorSpeed;

// linkermotor = 150 + motorspeed

int rightMotorSpeed = M2_DEFAULT_SPEED - motorSpeed;

// rechtermotor = 150 + motorspeed

set_motors(leftMotorSpeed, rightMotorSpeed);

// Zet de motor snelheid op (linkermotorsnelheid, rechtermotorsnelheid)

}

void set_motors(int motor1speed, int motor2speed)

{

if (motor1speed > M1_MAX_SPEED ) motor1speed = M1_MAX_SPEED;

// limiet van de snelheid van motor 1

if (motor2speed > M2_MAX_SPEED ) motor2speed = M2_MAX_SPEED;

// limiet van de snelheid van motor 2

if (motor1speed < 0) motor1speed = 0;

// Houd motor 1 boven de 0

if (motor2speed < 0) motor2speed = 0;

// Houd motor 2 boven de 0

motor1.setSpeed(motor1speed);

// Zet de motorsnelheid van motor 1 om in rotatie per minuut

motor2.setSpeed(motor2speed);

// Zet de motorsnelheid van motor 2 om in rotatie per minuut

motor1.run(FORWARD);

// Laat de motor 1 voorwaarts rijden

motor2.run(FORWARD);

// laat de motor 2 voorwaarts rijden

}

void manual_calibration() {

int i;

for (i = 0; i < 250; i++)

// de kalibratie neemt enkele seconden

{

qtrrc.calibrate(QTR_EMITTERS_ON);

// Het zet de emitter pin aan

delay(20);

// met een tussenstop van 20 miliseconden

}

if (DEBUG) {

// Als het juist is, zendt de sensor de data naar de seriele output

Serial.begin(9600);

for (int i = 0; i < NUM_SENSORS; i++)

// verhoog i, zolang i kleiner is dan het aantal sensors

{

Serial.print(qtrrc.calibratedMinimumOn*);*
// print de kalibratie tot een minimum bij een emitter pin die on is, bij sensor i
Serial.print(’ ');
// daarna een lege print
}
Serial.println();
// print data naar de seriele output, als menselijke taal via de ASCII tabel
for (int i = 0; i < NUM_SENSORS; i++)
// verhoog i, zolang i kleiner is dan het aantal sensors
{
Serial.print(qtrrc.calibratedMaximumOn);
// print de kalibratie tot een maximum bij een emitter pin die on is, bij sensor i
Serial.print(’ ');
// daarna een lege print
}
Serial.println();
// print data naar de seriele output, als menselijke taal via de ASCII tabel
Serial.println();
// print data naar de seriele output, als menselijke taal via de ASCII tabel
}
}

Does the robot follow the line if you place the robot directly over the line ?

When you say it stops at the black line, do you mean that no motor is running at all ?

When the robot stops, is the line on the left side of the robot ? Or the right side ? Or directly in front of the robot ?

Can you post a link (URL) to a description of your robot ?

Mee_n_Mac:
Does the robot follow the line if you place the robot directly over the line ?

When you say it stops at the black line, do you mean that no motor is running at all ?

When the robot stops, is the line on the left side of the robot ? Or the right side ? Or directly in front of the robot ?

Can you post a link (URL) to a description of your robot ?

De robot don’t follow THE line

Yes, when it stops at THE black line is no motor running

When THE robot stops is THE line on different place, it is not always THE same

I follow an tutorial: http://www.instructables.com/id/Arduino … QTR-8RC-l/

Only i use for my platform wood!

I will assume it’s all wired up correctly.

When you place it on a white floor or table, no line, what does it do ? It should run and circle to the left all the time. If it doesn’t do this then something else is wrong.

Can you connect a PC up to the Arduino’s USB port when it’s stuck at the black line ? If you can you can modify the code to “see” what’s going on. My GUESS is that the sensor report (qtrrc.readLine(sensors)) is giving the Arduino some odd nonsense position. The only way to tell is to look at that position data.

I looked at the code more carefully and there’s no condition that I can see where both motors can be commanded to stop at the same time. Perhaps they could each swap back and forth between off and some slow motion, and do this quickly enough that they are effectively stopped. I would go back and check the wiring from the sensors to the Arduino. Make sure the 5 sensors used (out of the 8 ) are wired from left to right, to pins 4,5,6,7,8. That is :

4 ↔ most left sensor used

5 ↔ next left sensor used

6 ↔ middle sensor used

7 ↔ next right sensor used

8 ↔ most right sensor used

Also … if you use the code tags, you can post your code and have it look like this.

#include <QTRSensors.h>
#include <AFMotor.h>

AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);

#define KP .2
#define KD 5
#define M1_DEFAULT_SPEED 50
#define M2_DEFAULT_SPEED 50
#define M1_MAX_SPEED 255
#define M2_MAX_SPEED 255
#define MIDDLE_SENSOR 3
#define NUM_SENSORS 5
#define TIMEOUT 2500
#define EMITTER_PIN 2 // emitter is controlled by digital pin 2
#define DEBUG 0

QTRSensorsRC qtrrc((unsigned char[]) { 
  4,5,6,7,8} 
,NUM_SENSORS, TIMEOUT, EMITTER_PIN);

unsigned int sensorValues[NUM_SENSORS];

void setup() // voorbereiding
{
  delay(1000); // 1000 miliseconden
  manual_calibration(); // De methode wordt opgeroepen
  set_motors(0,0); // De methode wordt opgeroepen
}

int lastError = 0;
int last_proportional = 0;
int integral = 0;

void loop()
{
  unsigned int sensors[5];
  // Het aantal sensors definiëren
  int position = qtrrc.readLine(sensors);
  // 0 tot 5000, waarbij 0 betekent direct onder de sensor of de lijn werd verloren
  int error = position - 2000;
  // error = positie - 2000
  int motorSpeed = KP * error + KD * (error - lastError);
  // De snelheid van de motor is gelijk aan 0,2 * error + 5 * (error - lastError)
  lastError = error;
  // De lastError = error

  int leftMotorSpeed = M1_DEFAULT_SPEED + motorSpeed;
  // linkermotor = 150 + motorspeed
  int rightMotorSpeed = M2_DEFAULT_SPEED - motorSpeed;
  // rechtermotor = 150 + motorspeed

  set_motors(leftMotorSpeed, rightMotorSpeed);
  // Zet de motor snelheid op (linkermotorsnelheid, rechtermotorsnelheid)
}

void set_motors(int motor1speed, int motor2speed)
{
  if (motor1speed > M1_MAX_SPEED ) motor1speed = M1_MAX_SPEED;
  // limiet van de snelheid van motor 1
  if (motor2speed > M2_MAX_SPEED ) motor2speed = M2_MAX_SPEED;
  // limiet van de snelheid van motor 2
  if (motor1speed < 0) motor1speed = 0;
  // Houd motor 1 boven de 0
  if (motor2speed < 0) motor2speed = 0;
  // Houd motor 2 boven de 0
  motor1.setSpeed(motor1speed);
  // Zet de motorsnelheid van motor 1 om in rotatie per minuut
  motor2.setSpeed(motor2speed);
  // Zet de motorsnelheid van motor 2 om in rotatie per minuut
  motor1.run(FORWARD);
  // Laat de motor 1 voorwaarts rijden
  motor2.run(FORWARD);
  // laat de motor 2 voorwaarts rijden
}


void manual_calibration() {
  int i;
  for (i = 0; i < 250; i++)
    // de kalibratie neemt enkele seconden
  {
    qtrrc.calibrate(QTR_EMITTERS_ON);
    // Het zet de emitter pin aan
    delay(20);
    // met een tussenstop van 20 miliseconden
  }
  if (DEBUG) {
    // Als het juist is, zendt de sensor de data naar de seriele output
    Serial.begin(9600);
    for (int i = 0; i < NUM_SENSORS; i++)
      // verhoog i, zolang i kleiner is dan het aantal sensors
    {
      Serial.print(qtrrc.calibratedMinimumOn[i]);
      // print de kalibratie tot een minimum bij een emitter pin die on is, bij sensor i
      Serial.print(' ');
      // daarna een lege print
    }
    Serial.println();
    // print data naar de seriele output, als menselijke taal via de ASCII tabel
    for (int i = 0; i < NUM_SENSORS; i++)
      // verhoog i, zolang i kleiner is dan het aantal sensors
    {
      Serial.print(qtrrc.calibratedMaximumOn[i]);
      // print de kalibratie tot een maximum bij een emitter pin die on is, bij sensor i
      Serial.print(' ');
      // daarna een lege print
    }
    Serial.println();
    // print data naar de seriele output, als menselijke taal via de ASCII tabel
    Serial.println();
    // print data naar de seriele output, als menselijke taal via de ASCII tabel
  }
}

{click on to open and enlarge}

Here’s a test for you to run if you can’t find anything wrong with the wiring.

Put the robot on it’s back or on it’s end as shown below. Start with a plain piece of white paper under the sensors. Turn the robot in and let it calibrate. The right motor should come on and run. The left should be off (or perhaps running very slowly). Then place a tab of white paper, with a fat black line on it, to the left and under the sensors (as shown below). Again the right motor should be running and the left motor stopped. Move the paper slowly from left to right. The left motor should start running and run faster as the paper goes from left to right. The right motor should start running and then slow and eventually stop as the paper goes from left to right.

{click on to enlarge and run the animation}