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 ![]()