Problemas com robô seguidor de linha. (ARDUINO)


#1

Há uns dois dias estou travado, tentando fazer o robô conseguir fazer a curva. Ele segue a linha direito, mas quando chega numa curva fechada ele praticamente a ignora e segue reto. A menos que seja colocado perto da mesma, porque nesse caso ele consegue fazer a curva. (Colocarei vídeos abaixo demonstrando melhor). Gostaria que alguém pudesse me ajudar ou dar qualquer dica, pois já tentei de tudo, variando velocidade e até a posição dos sensores. O código estará também abaixo:

#define DirEsq 7
#define DirDir 4
#define VelEsq 6
#define VelDir 5
#define s1 10
#define s2 11
#define s3 12
#define s4 13

char Cor1,Cor2,Cor3,Cor4;

void Parar(){
analogWrite(VelEsq,0);
analogWrite(VelDir,0);
}

void Frente(int Velocidade1,int Velocidade2){
digitalWrite(DirEsq,HIGH);
digitalWrite(DirDir,HIGH);
analogWrite(VelEsq,Velocidade1);
analogWrite(VelDir,Velocidade2);
}

void Tras(int Velocidade1,int Velocidade2){
digitalWrite(DirEsq,LOW);
digitalWrite(DirDir,LOW);
analogWrite(VelEsq,Velocidade1);
analogWrite(VelDir,Velocidade2);
}

void Esquerda(int Velocidade1,int Velocidade2){
Tras(255,255);
digitalWrite(DirEsq,LOW);
digitalWrite(DirDir,HIGH);
analogWrite(VelEsq,Velocidade1);
analogWrite(VelDir,Velocidade2);
}

void Direita(int Velocidade1,int Velocidade2){
digitalWrite(DirEsq,HIGH);
digitalWrite(DirDir,LOW);
analogWrite(VelEsq,Velocidade1);
analogWrite(VelDir,Velocidade2);
}

void Ler(){
if(digitalRead(s1) == 1)
Cor1 = ‘P’;
if(digitalRead(s1) == 0)
Cor1 = ‘B’;
if(digitalRead(s2) == 1)
Cor2 = ‘P’;
if(digitalRead(s2) == 0)
Cor2 = ‘B’;
if(digitalRead(s3) == 1)
Cor3 = ‘P’;
if(digitalRead(s3) == 0)
Cor3 = ‘B’;
if(digitalRead(s4) == 1)
Cor4 = ‘P’;
if(digitalRead(s4) == 0)
Cor4 = ‘B’;
}

void setup() {
pinMode(DirEsq,OUTPUT);
pinMode(DirDir,OUTPUT);
pinMode(VelEsq,OUTPUT);
pinMode(VelDir,OUTPUT);
pinMode(s1,INPUT);
pinMode(s2,INPUT);
pinMode(s3,INPUT);
pinMode(s4,INPUT);

digitalWrite(DirEsq,HIGH);
digitalWrite(DirDir,HIGH);

delay(1000);
}

void loop() {
Ler();//ver o estado de cada sensor

Serial.print(Cor1);
Serial.print("  ");
Serial.print(Cor2);
Serial.print("  ");
Serial.print(Cor3);
Serial.print("  ");
Serial.println(Cor4);

if(digitalRead(s2) == 0 and digitalRead(s3) == 0){      //B B
  if(digitalRead(s1) == 1 and digitalRead(s4) == 0){
    Esquerda(255,255);
  }
  if(digitalRead(s1) == 0 and digitalRead(s4) == 1){
    Direita(255,255);
  }
  if(digitalRead(s1) == 0 and digitalRead(s4) == 0){
    Frente(70,70);
  }
  if(digitalRead(s1) == 1 and digitalRead(s4) == 1){
    Parar();
  }
}

if(digitalRead(s2) == 1 and digitalRead(s3) == 0){    //P B
  if(digitalRead(s1) == 1){
    Esquerda(255,255);
  }
  else{
    Frente(70,255);
  }
}

if(digitalRead(s2) == 0 and digitalRead(s3) == 1){    //B P
  if(digitalRead(s4) == 1){
    Direita(255,255);
  }
  else{
    Frente(255,70);
    
  }
}
if(digitalRead(s2) == 1 and digitalRead(s3) == 1){   //P P
  if(digitalRead(s1) == 1 and digitalRead(s4) == 0){
    Esquerda(255,255);
  }
  if(digitalRead(s1) == 0 and digitalRead(s4) == 1){
    Direita(255,255);
  }
  if(digitalRead(s1) == 0 and digitalRead(s4) == 0){
    Frente(70,70);
  }
  if(digitalRead(s1) == 1 and digitalRead(s4) == 1){
    Parar();
  }
}

}


#2

os vídeos não estão carregando…


#3

Você será fazendo os testes dos sensores sem usar as cláusulas if-else, o que pode ocasionar caso a movimentação seja muito rápido entrando em duas cláusulas If.
Faça um teste assim:
If(digitalRead(s1)==1)
Cor1 = 1;
ELSE
Cor1= 0;