Rastreador(Problema con bifurcaciones)

Hola a todos!hace poco que compre un pack arduino para hacer un robot rastreador(de los que siguen una linea y detectan las bifurcaciones).
La cosa es que para programarlo he conseguido que siga la linea correctamente,pero no se como hacer lo de las bifurcaciones,lo he pensado bastante pero siempre llego a un callejon sin salida.
Si alguien puede ayudarme se lo agradeceria eternamente.
Aqui dejop el codigo como lo tengo ahora msimo:

//-------------------------VARIABLES DEL CIRCUITO---------------------//
//--------------------------------NO TOCAR ---------------------------//
int led1 = 12; //NO TOCAR //
int led2 = 11; //NO TOCAR //
int led3 = 10; //NO TOCAR //
int boton1 = 2; //NO TOCAR //
int boton2 = 9; //NO TOCAR //
int motor_derecho_a = 3; //NO TOCAR //
int motor_derecho_b = 4; //NO TOCAR //
int pwm_derecho = 5; //NO TOCAR //
int motor_izquierdo_a = 7; //NO TOCAR //
int motor_izquierdo_b = 8; //NO TOCAR //
int pwm_izquierdo = 6; //NO TOCAR //
//--------------------------------------------------------------------//
//VARIABLES DE LA FUNCION DE CONTROL //
//--------------------------------------------------------------------//
//--------------------------------NO TOCAR ---------------------------//
int errorAnt=0; //NO TOCAR //
int resultado; //NO TOCAR //
//--------------------------------------------------------------------//
//VARIABLES DE LA FUNCION PONMOTORES //
//--------------------------------------------------------------------//
//--------------------------------NO TOCAR ---------------------------//
#define Stop 2 //NO TOCAR //
#define Adelante 1 //NO TOCAR //
#define Atras 0 //NO TOCAR //
//
//--------------------------------------------------------------------//

//--------------------VARIBLES DE CONTROL DEL PID---------------------//
int error,errorant=0,md,mi,control;
//------------MODIFICAR PARA MEJORAR FUNCIONAMIENTO-------------------//
int KD=45;
int KP=75;
int bias =230;
//--------------------------------------------------------------------//
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(motor_derecho_a, OUTPUT);
pinMode(motor_derecho_b, OUTPUT);
pinMode(motor_izquierdo_a, OUTPUT);
pinMode(motor_izquierdo_b, OUTPUT);

pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
Serial.begin(9600);
delay(2500);
}

void loop()
{
Serial.print(leer());
error=leer();
control=PD(error);

md=bias-control;
mi=bias+control;
ponMotores(mi,md);

}

// LECTURA //
// ********************************************************************************************** //
int leer()
{

int error;

if(analogRead(A0)>512)
error=-3;
else if(analogRead(A1)>512)
error=-2;
else if(analogRead(A2)>512)
error=-1;
else if(analogRead(A3)>512)
error=0;
else if(analogRead(A4)>512)
error=0;
else if(analogRead(A5)>512)
error=1;
else if(analogRead(A6)>512)
error=2;
else if(analogRead(A7>12))
error=3;
else
error=10;

return (error);
}

// ********************************************************************************************** //
// CONTROL //
// ********************************************************************************************** //

int PD(int error)
{

int control;

control=error*KP + (errorAnt-error)*KD;

if(error==10)
error=errorAnt;
errorAnt=error;

return(control);

}

// ********************************************************************************************** //
// BIFURCACION //
// ********************************************************************************************** //

// ********************************************************************************************** //
// MOTOR DERECHO //
// ********************************************************************************************** //

void MotorDerecho(int Sentido)
{
switch (Sentido)
{
case Atras:
digitalWrite(motor_derecho_a, LOW);
digitalWrite(motor_derecho_b, HIGH);
break;

case Adelante:
digitalWrite(motor_derecho_a, HIGH);
digitalWrite(motor_derecho_b, LOW);
break;

case Stop:
digitalWrite(motor_derecho_a, LOW);
digitalWrite(motor_derecho_b, LOW);
break;
}
}

// ********************************************************************************************** //
// MOTOR IZQUIERDO //
// ********************************************************************************************** //

void MotorIzquierdo(int Sentido)
{

switch(Sentido)
{
case Atras:
digitalWrite(motor_izquierdo_a, LOW);
digitalWrite(motor_izquierdo_b, HIGH);
break;

case Adelante:
digitalWrite(motor_izquierdo_a, HIGH);
digitalWrite(motor_izquierdo_b, LOW);
break;

case Stop:
digitalWrite(motor_izquierdo_a, LOW);
digitalWrite(motor_izquierdo_b, LOW);
break;
}
}
void ponMotores(signed int mi,signed int md)
{

// Actuamos sobre motor derecho
if (md>0)
{
if(md>250)
md=250;
MotorDerecho(Adelante);
analogWrite(pwm_derecho,md );
}
else
{
if(md<-250)
md=-250;
MotorDerecho(Atras);
analogWrite(pwm_derecho,-md );
}
// Actuamos sobre motor izquierdo
if (mi>0)
{
if(mi>250)
mi = 250;
MotorIzquierdo(Adelante);
analogWrite(pwm_izquierdo,mi );

}
else
{
if(mi<-250)
mi = -250;
MotorIzquierdo(Atras);
analogWrite(pwm_izquierdo,-mi );
}
}

Cualquier cosa decidmelo gracias :slight_smile:

Es un poquito más complicado de lo que parece, pero tienes que ver en el momento de la bifurcación, tienes que decidirte por uno de los caminos. Los parámetros para escoger por cual ir va a gusto de cada persona.

Cuantos sensores de infrarrojos tienes colocados? y como ?

Intentare echarte una mano con este proyecto en lo que pueda.

Un saludo

Los rastreadores son complicados. Por una parte necesitas una buena cantidad de sensores bien posicionados y por otra necesitas depurar mucho el programa porque tienes que capaz de diferenciar la marca y la bifurcación.

A groso modo antes de la bifurcación hay junto a la linea una marca y tras la marca es cuando se bifurca. Como el lado de la marca señala hacia que lado va a ir la bifurcación por lo que primero tienes que ser capaz de leer esas marcas. No es sencillo yo solo te puedo recomendar que al principio el robot vaya muy despacio y que uses telemetría. Suerte

jonoveve:
Es un poquito más complicado de lo que parece, pero tienes que ver en el momento de la bifurcación, tienes que decidirte por uno de los caminos. Los parámetros para escoger por cual ir va a gusto de cada persona.

Cuantos sensores de infrarrojos tienes colocados? y como ?

Intentare echarte una mano con este proyecto en lo que pueda.

Un saludo

Tengo 8 sensores en la parte delantera,en forma de una pequeña curva,he acabado de soldarlo hoy,y por lo que veo va un poco como quiere,no se si sera problemas de hardware pero espero que no :astonished: