El robot seguidor de línea esta basado en el Robot Mclon que obtuvimos en la página web https://tecnoloxia.org/mclon/. Este robot lo modificamos según los proyectos que propongamos. En esta caso hemos modificado el soporte de la placa Arduino y el puente H L293D, el soporte para la batería y el soporte para el sensor seguidor de línea.
Ahora vemos como funcionan en el siguiente video:
/*
ESTE PROGRAMA SIGUE LA INTERSECCIÓN DE COLOR DE LA LÍNEA NEGRA A AL IZQUIERDA Y LA BLANCA
A AL DERECHA.
LA TABLA DE LA VERDAD SERÍA:
SensorI SensorD MotorI MotorD
0 0 1 0 Giro a la derecha
0 1 1 1 Adelante
1 0 En la otra zona del cambio de color
1 1 0 1 Giro a la izquierda
*/
///////////////////////////////////////////////////////
// MOTOR
///////////////////////////////////////////////////
//definición de pines
//Motor Derecha
const int pinENA = 3;
const int pinIN1 = 4;
const int pinIN2 = 5;
const int speedD = 100; //velocidad de giro 80% (200/255)
//Motor Izquierda
const int pinENB = 9;
const int pinIN3 = 7;
const int pinIN4 = 8;
const int speedI = 100; //velocidad de giro 80% (200/255)
/////////////////////////////////////////////////////////////////////////
// SENSOR SEGUI LÍNEA HW-006-V1.3
/////////////////////////////////////////////////////////////////////////////
// sobre blano la respuesta es 1
// sobre negro la respuesta es 0
#define sensorD 2
#define sensorI 10
int valorD = 0;
int valorD_old = 0;
int valorI = 0;
int valorI_old = 0;
//////////////////////////////////////////////////////
// Control
/////////////////////////
int TabladeVerdad = 0;
//////////////////////////////
//FUCIONES DE MOVIMIENTO
////////////////////////////////
void atras(){
digitalWrite(pinIN1, HIGH);
digitalWrite(pinIN2, LOW);
digitalWrite(pinIN3, HIGH);
digitalWrite(pinIN4, LOW);
}
void adelante (){
digitalWrite(pinIN1, LOW);
digitalWrite(pinIN2, HIGH);
digitalWrite(pinIN3, LOW);
digitalWrite(pinIN4, HIGH);
}
void parar (){
digitalWrite(pinIN1, LOW);
digitalWrite(pinIN2, LOW);
digitalWrite(pinIN3, LOW);
digitalWrite(pinIN4, LOW);
}
void izquierda(){
digitalWrite(pinIN3, LOW);
digitalWrite(pinIN4, HIGH);
}
void derecha(){
digitalWrite(pinIN1, LOW);
digitalWrite(pinIN2, HIGH);
}
void LineaContraria () {
parar();
atras();
delay (1000);
izquierda();
delay(1000);
while (valorI == HIGH || valorD == HIGH) {
adelante ();
}
}
void setup(){
Serial.begin(115200);
//Motores
//Derecha
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
pinMode(pinENA, OUTPUT);
//Izquierda
pinMode(pinIN3, OUTPUT);
pinMode(pinIN4, OUTPUT);
pinMode(pinENB, OUTPUT);
//Sensores
pinMode(sensorD, INPUT);
pinMode(sensorI, INPUT);
}
void loop()
{
// Establecemos la velocidad de los motores
analogWrite (pinENA,speedD);
analogWrite (pinENB,speedI);
// Leemos la señanl del sensor
valorD = digitalRead (sensorD);
valorI = digitalRead (sensorI);
if(valorD != valorD_old || valorI != valorI_old){
if (valorI == LOW && valorD == LOW){ TabladeVerdad = 3;} // giro a la derecha
if (valorI == LOW && valorD == HIGH){ TabladeVerdad = 1;} //adelante
//if (valorI == HIGH && valorD == LOW){ TabladeVerdad = 4;} // En la otra zona de la franja Falla porque hay que esperar a que se
//estabilice el sensor.
if (valorI == HIGH && valorD == HIGH){ TabladeVerdad = 2;} //giro a izquierda
switch(TabladeVerdad){
case 1: // adelante
parar();
adelante();
break;
case 2: //muevo el motor derecho para que gire a la izquierda
parar();
izquierda();
break;
case 3: //muevo el motor izquierdo para que gire a la derecha
parar();
derecha();
break;
case 4: //marcha atras
LineaContraria ();
break;
}
}
valorD_old = valorD;
valorI_old = valorI;
}

No hay comentarios:
Publicar un comentario