Puede seguir un oscuro, sobre un fondo claro. En este caso utilicé cinta adhesiva negra en una pizarra. Primero se calibra durante 5 segundos. Lo mueve a través de la línea un par de veces para que se acostumbre a la diferencia en reflectividad. Después de la calibración comienza hacia adelante. Utilicé un algoritmo para determinar su error de la línea. Si determina mediante el algoritmo que resulta en un error extremo, se convertirá por un tiempo más largo. Del mismo modo, si el robot determina es sólo una fracción de una pulgada de la línea, sólo cambiará por una fracción de segundo. Esto reduce la remuneración excesiva y hace que la línea que sigue un poco más suave y más fiable.
Este es el código yo, comencé desde cero y añadir la biblioteca de MegaServo. Soy consciente de que hay una biblioteca para los arreglos de sensor IR de chip, pero me encontré con problemas así que decidí empezar de cero con el sensor de lectura. Estoy usando la versión análoga de la matriz del sensor chip, a diferencia de la versión RC, que una señal digital. Mis sensores de salida un voltaje analógico basado en la reflectancia de la superficie. Por ejemplo, si va a proporcionar 5V a los sensores en Vcc, y tiene una superficie oscura, que va de salida del sensor a un voltaje más cercano a 5V. Por el contrario, si el sensor encuentra una muy reflexiva, (superficie blanca) producirá más cercano a 0V. Puedo leer estos 6 salidas analógicas de mis 6 sensores a través de los 6 pines de entrada-salida análoga en mi Arduino.
Además, mi parada algoritmo utiliza if anidadas declaraciones para comprobar 3 veces si el robot es realmente al final, antes de se detiene por 10 segundos, parpadea la luz. Esto evita que una parada accidental en medio de la pista debido a lecturas inexactas o glitches. Durante la calibración, calculé un valor medio de reflectancia que utilizo más tarde para ayudar con la navegación y de toma de decisiones. También imprimí algunos datos a la pantalla de serie para propósitos de prueba.
Este es mi código:
// ==========================================================
No dude en cambiar y utilizar este código, pero por favor dame crédito.
Autor: Austin Duff - 24 de junio de 2009
// ==========================================================
#include < PololuQTRSensors.h >
#include < Servo.h >
#include < MegaServo.h >
#define NBR_SERVOS 3
#define FIRST_SERVO_PIN 2
Servo izquierdo;
Derecho del servo;
Torre del servo;
Servos de MegaServo [NBR_SERVOS];
int pingPin = 7;
int mitad = 0;
int mn = 0;
mx int = 0;
void setup()
{
Servos [0] .attach (2, 800, 2200); Torre
Servos [1] .attach (9, 800, 2200); izquierda
Servos [2] .attach (10, 800, 2200); derecho
Serial.Begin(9600);
Servos[0].Write(65);
digitalWrite (13, bajo);
Servos[2].Write(90);
Servos[1].Write(90);
para (int i = 0; i < 5000; i ++)
{
digitalWrite (13, HIGH);
int val = 0;
para (int j = 0; j < = 5; j ++)
{
Val = analogRead(j);
Si (val > = mx)
MX = val;
Si (val < = mn)
MN = val;
}
Delay(1);
}
medio = ((mx + mn)/2);
digitalWrite (13, bajo);
Servos[2].Write(90);
Servos[1].Write(90);
}
void loop()
{
int s0 = 0;
int s1 = 0;
s2 int = 0;
s3 de int = 0;
int s4 = 0;
int s5 = 0;
S0 = analogRead(0);
S1 = analogRead(1);
S2 = analogRead(2);
S3 = analogRead(3);
S4 = analogRead(4);
S5 = analogRead(5);
Serial.Print ("media:");
Serial.Print(MID);
Serial.Print("");
Serial.Print(S0);
Serial.Print("");
Serial.Print(S1);
Serial.Print("");
Serial.Print(S2);
Serial.Print("");
Serial.Print(S3);
Serial.Print("");
Serial.Print(S4);
Serial.Print("");
Serial.Print(S5);
Serial.Print("");
Serial.println();
Servos[2].Write(180);
Servos[1].Write(0);
Delay(10);
if(((S0+S1+S2)/3) > (((s3+s4+s5)/3) + 250)) & & (! () (S0 > MID) & &(s5 > mid)))
{
Servos[2].Write(180);
Servos[1].Write(90);
Serial.Print ("derecha");
Delay(ABS(((S5+S4+S3)/3)-((S0+S1+S2)/3))/2));
}
if(((S0+S1+S2)/3) < (((s3+s4+s5)/3) -250)) & & (! () (S0 > MID) & &(s5 > mid)))
{
Servos[2].Write(90);
Servos[1].Write(0);
Serial.Print ("izquierda");
Delay(ABS(((S5+S4+S3)/3)-((S0+S1+S2)/3))/2));
}
Si ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90);
Servos[1].Write(90);
Serial.Print ("STOP");
Si ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90);
Servos[1].Write(90);
Serial.Print ("STOP");
Si ((s0 > mid) & &(s5 > mid))
{
Servos[2].Write(90);
Servos[1].Write(90);
Serial.Print ("STOP");
para (int k = 0; k < 50; k ++)
{
digitalWrite (13, HIGH);
Delay(100);
digitalWrite (13, bajo);
Delay(100);
}
Delay(5000);
}
}
}
}