Robot seguidor de línea


 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