Esto es lo que tengo hasta ahora, también he realizado algunos cambios para tenerlo más claro.
He realizado pruebas, he variado la velocidad (más, menos)... he juntado lo máximo los sensores, tengo pensado ampliar la pista porque lo que he hecho es una pista oval (con dos cartulinas grandes blancas) y creo que el coche no se agarra lo suficiente. Además me da la impresión de que el coche tarda en poner marcha atras cuando pierde la linea negra en las curvas.
Si me puedes sugerir mejoras ... te lo agradecería.
.
.
/*
* SEGUIDOR DE LINEA NEGRA
* COMPONENTES:
*
* Aduino Uno R3,
* Shield Motor L293D,
* (3) Sensores TCRT5000 IR infrared line track foller sensor
* (1) Sensor IR Keyes
* (4) Motores 6v
* 1 Bateria 9v para Arduino (con interruptor ON-OFF)
* 1 Bateria 12v para Shield Motor L293D (con interruptor ON-OFF)
*
* VALORES:
* 0 = NEGRO
* 1 = BLANCO
*
* con la ayuda de surbyte (foro arduino)
*/
#include <AFMotor.h>
#define BLANCO HIGH
#define NEGRO LOW
// IZQ.EXT IZQ. DCHA. DCHA.EXT
// (s4) (s3) (s2) (s1)
const byte s1 = A3; // sensor Izquierda Externo al pin A3.
const byte s2 = A4; // sensor Izquierda al pin A4.
const byte s3 = A5; // sensor Derecha al pin A5.
const byte s4 = A2; // sensor Derecha Externo al pin A2.
bool sensorValors1; // guardamos el valor del sensor de la DERECHA EXTERNO.
bool sensorValors2; // guardamos el valor del sensor de la DERECHA.
bool sensorValors3; // guardamos el valor del sensor de la IZQUIERDA.
bool sensorValors4; // guardamos el valor del sensor de la IZQUIERDA EXTERNO.
AF_DCMotor m1DD(1); // motor Derecha Delante. ***************
AF_DCMotor m2DI(2); // motor Izquierda Delante. * m2DI - m1DD *
AF_DCMotor m3AI(3); // motor Atras Izquierda. * *
AF_DCMotor m4AD(4); // motor Atras Derecha. * m3AI - m4AD *
***************
void setup() {
Serial.begin(9600); // abrimos el monitor serial
pinMode(s1, INPUT); // declaramos los sensores como entrada
pinMode(s2, INPUT);
pinMode(s3, INPUT);
pinMode(s4, INPUT);
m1DD.setSpeed (180); // Configura velocidad a 180 (de 0 a 255).
m2DI.setSpeed (180);
m3AI.setSpeed (180);
m4AD.setSpeed (180);
}
void loop() {
// Recogemos los valores y los enviamos al monitor serial
sensorValors4 = !digitalRead(A3);
Serial.print("Izquierda Exterior = ");
Serial.println( sensorValors4);
sensorValors3 = digitalRead(A4);
Serial.print(" Izquierda = ");
Serial.println( sensorValors3);
sensorValors2 = digitalRead(A5);
Serial.print(" Derecha = ");
Serial.println( sensorValors2);
sensorValors1 = digitalRead(A2);
Serial.print(" Derecha Exterior = ");
Serial.println( sensorValors1);
Serial.println("--------------------------------");
// Accion a realizar según los resultados de los sensores.
// IZQ.EXT IZQ. DCHA. DCHA.EXT
// (s4) (s3) (s2) (s1)
// Con los 2 sensores centrales
if (digitalRead(s3) == NEGRO && digitalRead(s2) == NEGRO)
avanzamos();
if (digitalRead(s3) == NEGRO && digitalRead(s2) == BLANCO)
giroAizquierda();
if (digitalRead(s3) == BLANCO && digitalRead(s2) == NEGRO)
giroAderecha();
if (digitalRead(s3) == BLANCO && digitalRead(s2) == BLANCO)
atras();
// ----------------------------------------------------------------------------------------------------------------
// Con los 4 sensores
if (digitalRead(s4) == NEGRO && digitalRead(s3) == NEGRO && digitalRead(s2) == NEGRO && digitalRead(s1) == NEGRO)
avanzamos();
if (digitalRead(s4) == NEGRO && digitalRead(s3) == NEGRO && digitalRead(s2) == BLANCO && digitalRead(s1) == BLANCO)
giroAizquierda();
if (digitalRead(s4) == BLANCO && digitalRead(s3) == BLANCO && digitalRead(s2) == NEGRO && digitalRead(s1) == NEGRO)
giroAderecha();
if (digitalRead(s4) == BLANCO && digitalRead(s3) == BLANCO && digitalRead(s2) == BLANCO && digitalRead(s1) == BLANCO)
atras();
}
// ACCIONES: avanzamos, giroAizquieda, giroAderecha, atras
void avanzamos() {
m1DD.run(FORWARD); // si los dos sensores derecha y izquierda 0 = negro
m2DI.run(FORWARD); // entonces avanzamos
m3AI.run(FORWARD);
m4AD.run(FORWARD);
}
void giroAizquierda() {
m1DD.run(FORWARD); // giramos a la izquierda
m2DI.run(BACKWARD);
m3AI.run(BACKWARD);
m4AD.run(FORWARD);
}
void giroAderecha() {
m1DD.run(BACKWARD); // giramos a la derecha
m2DI.run(FORWARD);
m3AI.run(FORWARD);
m4AD.run(BACKWARD);
}
void atras() {
m1DD.run(BACKWARD); // si todos estan en 1 = Blanco
m2DI.run(BACKWARD); // entonces atras
m3AI.run(BACKWARD);
m4AD.run(BACKWARD);
}