[Ajuda] Seguidor de linha

Estou fazendo um seguidor de linha com um arduino uno, o robô em sim ja esta quase pronto, mas estou com problema na hora de executar o codigo.

As ligações estão corretas e os sensores estão enviando os dados normalmente mas o arduino não esta enviando o sinal de nivel alto para ligar os motores, testei conectando um cabo direto de onde devia vir os sinais do arduino no polo possitivo e ele funciona, YouTube

o codigo para controlar o robô é este:

const int PinoSensor = 0; 
const int PinoSensor2 = 1; 

const int  motorpin1 = 3;  
      
const int  motor2pin1 = 5;      
      

int ValorSensor = 0; 

int ValorSensor2 = 1; 

void setup(){ 
  Serial.begin(9600); 
  
  pinMode(motorpin1,OUTPUT);        

  pinMode(PinoSensor1,INPUT);        
  
  pinMode(motor2pin1,OUTPUT);      

  pinMode(PinoSensor2,INPUT);    
 } 
  
 void loop(){ 
 int sensorValue = analogRead(PinoSensor); 
 Serial.println(sensorValue); 
 if (ValorSensor >=100){ 
  

  digitalWrite(motorpin2,HIGH); 
  

  } 
  else {  digitalWrite(motorpin1,LOW); 

  


  } 
  
 sensorValue = analogRead(PinoSensor2); 
 if (ValorSensor2  >= 350){ 


  digitalWrite(motor2pin1,HIGH); 
  

  } 
  else {  digitalWrite(motor2pin1,LOW); 

  

  } 
  
  
  
  
}

e para obter os valores dos sensores é este o codigo que estou usando:

void setup() 
{ Serial.begin(9600); //Necessary to set up Serial port 
} 
void loop() 
{ Serial.print(analogRead(0)); 
Serial.print(' '); 
delay(1000); //Set the number to change frequency of readings. 
}

Não estou conseguindo entender qual é o erro, se alguem poder me ajudar agradeço

No primeiro bloco de codigo tens erros de sintaxe (nomes de variaveis mal)
Corregi para ficar assim:

const int PinoSensor1 = 0; 
const int PinoSensor2 = 1; 
const int  motorpin1 = 3;  
const int  motor2pin1 = 5;            
int ValorSensor = 0; 
int ValorSensor2 = 1; 
void setup()
{ 
  Serial.begin(9600);   
  pinMode(motorpin1,OUTPUT);        
  pinMode(PinoSensor1,INPUT);          
  pinMode(motor2pin1,OUTPUT);      
  pinMode(PinoSensor2,INPUT);    
 } 
void loop()
{ 
  int sensorValue = analogRead(PinoSensor1); 
  Serial.println("Valor lido Sensor 1:");
  Serial.println(sensorValue); //que leitura obtens aqui??
  if (ValorSensor >=100)digitalWrite(motorpin1,HIGH);
  else  digitalWrite(motorpin1,LOW);
  sensorValue = analogRead(PinoSensor2); //a variavel sensorValue esta a ser recarregada aqui para o outro sensor queres mesmo isso?
  if (ValorSensor2  >= 350)digitalWrite(motor2pin1,HIGH); 
  else digitalWrite(motor2pin1,LOW);
  delay(1000);
}

Testa a ver o que faz agora

Que valores estás a ver vindo dos sensores?

Porque não testas o hardware primeiro actuando os motores com delays primeiro para teres a certeza que os motores estão a funcionar?

Por último, como ligaste os motores ao Arduino? Lembra-te que o Arduino não consegue actuar um motor e se o tentares, certamente que vais queimar o pino do chip... Mostra como ligaste isso com um esquema. :wink:

Complementado a dúvida dos colegas com as minhas dúvidas, quais e quantos sensores você esta usando?

Eu fiz um seguidor usando três sensores um central para a linha preta, e dois laterais para a superfície branca, esses laterais servem de referência sobre para qual lado o seguidor irá se o sensor central estiver fora do valor de referência.

O esquema, fotos, componentes que você esta usando podem nos ajudar a entender o que estás a fazer.

Obrigado pela atenção de todos, com a ajuda do haistems_por, conseguir fazer o robô funcionar direito XD XD mas caso possa ajudar alguem vou colocar mais dados do meu robo e de como fiz.

O robô é guiado por dois sensores frontais de IR o esquela obtive nesta pagina Making a Line Sensor using IR Receiver

Para controlar os motores eu usei um SN754410, que é similar os L283d, so que mais potente.

O esquema do robô é este

Obs: os sensor sharp são so para representar os sensores ir

pode se visto aqui tambem

Obs2: como meu robo so anda em uma direção, sempre para frente, so usei duas portas do sn754410, a 2 e a 15, uma para cada motor

E o código que usei foi este

const int PinoSensor = 0; 
const int PinoSensor2 = 1; 

const int  motorpin1 = 3; 
      
const int  motor2pin1 = 5;      
      

int ValorSensor = 0; 

int ValorSensor2 = 1; 

void setup(){ 
  Serial.begin(9600); 
  
  pinMode(motorpin1,OUTPUT);        

  pinMode(PinoSensor,INPUT);        
  
  pinMode(motor2pin1,OUTPUT);      

  pinMode(PinoSensor2,INPUT);    
 } 
  
 void loop(){ 
 int sensorValue = analogRead(PinoSensor); 
 Serial.println(sensorValue); 
 if (sensorValue >=100){ 
  

  digitalWrite(motorpin1,HIGH); 
  

  } 
  else {  digitalWrite(motorpin1,LOW); 

  


  } 
  
  int sensorValue2 = analogRead(PinoSensor2); 
 if (sensorValue2  >= 350){ 


  digitalWrite(motor2pin1,HIGH); 
  

  } 
  else {  digitalWrite(motor2pin1,LOW); 

  

  } 
  
  
  
  
}

lucaslimaduarte:
Obrigado pela atenção de todos, com a ajuda do haistems_por, conseguir fazer o robô funcionar direito XD XD mas caso possa ajudar alguem vou colocar mais dados do meu robo e de como fiz.

Fala ai Lucas!

Teu código ajudará outras pessoas, estou certo disso ^^

Eu uso três sensores no meu following, um para a faixa preta (referência central) eu para a área branca (referências laterais).

E Parabéns xD

Obrigado Mortis :D, fiz com dois sensores pq nunca tinha feito um seguidor de linha e queria fazer o mais basico possivel para começar a entender o funcionamente, por isso do codigo tão simples sem nem usar todas as portas do sn754410

Quero mesmo é fazer um com cinco sensores que possa fazer curva de 90º ---, mas não faço a menor ideia de como o codigo funciona =( agora vou pesquisar mais e tentar fazer o de cinco sensores :stuck_out_tongue_closed_eyes:

Boas.

Para não estar a abrir um novo tópico e visto o meu caso ser também referente a um veiculo que segue uma linha, coloco aqui a questão para o meu caso.

Para reutilizar um pequeno veiculo que tinha feito há algum tempo, resolvi colocar no mesmo 2 LDR de forma a poder fazer com que o mesmo se move-se seguindo uma linha preta. Fica a imagem com o veiculo e o conceito que tenho para os 2 LDR.

Mas não consigo que o mesmo ande como pretendia. Não sei estarei a utilizar erradamente os 2LDR para o que pretendo ou se será no próprio código que deixo abaixo.

#include <Servo.h>
  
  #define LEFTSERVOPIN  11
  #define RIGHTSERVOPIN  13
  
  Servo leftServo; 
  Servo rightServo; 
  
  int speed = 15; //velocidade de ambos os servos: percentagem entre 0 e 100
  
  int pinLDRDir = 0; // pino analógico A0 direita
  float LDRDir = 0;  // receberá o valor do LDR da direita
  int pinLDREsq = 2; // pino analógico A2 esquerda
  float LDREsq = 0;  // receberá o valor do LDR da esquerdaDR
    
   
  void setup()                  
  {
    setSpeed(speed);
    pinMode(LEFTSERVOPIN, OUTPUT);     
    pinMode(RIGHTSERVOPIN, OUTPUT);    
    leftServo.attach(LEFTSERVOPIN);    //'attaches' esquerdo servo
    rightServo.attach(RIGHTSERVOPIN);  //'attaches' direito servo
    vaiParado();     

    Serial.begin(9600);    
    
  }
  
  
  void loop()                     
  {
     
     LDRDir = analogRead(pinLDRDir);
     LDREsq = analogRead(pinLDREsq);
     
     //Se 75% de LDREsq >= LDRDir - Vira a 
    if( LDREsq*0.75 >= LDRDir)
      vaiEsquerda();
      
     //Senão se 75% de LDRDir >= LDREsq - Vira a 
    else if( LDRDir*0.75 >= LDREsq)
      vaiDireita();
      
    else
      vaiFrente();
  }
  
  
   //------------------------------------------------------------------------------------------------------------
  //INICIALIZAÇÃO DOS SERVOS PELO ARDUINO - ROTINAS
  
  /*
   * define a velocidade do veiculo entre 0-(parado) e 100-(velocidade máxima)
  */ 
  
  void setSpeed(int newSpeed){
    if(newSpeed >= 100) {
      newSpeed = 100;}    
    if(newSpeed <= 0) {
      newSpeed = 0;}         
    speed = newSpeed * 0.9;                   
  }
  
  /* veiculo em frente */
  void vaiFrente(){
   leftServo.write(90 + speed);
   rightServo.write(90 - speed);
  }
  
  /* veiculo para trás */
  void vaiTras(){
   leftServo.write(90 - speed);
   rightServo.write(90 + speed);
  }
    
  /* veiculo para a direita */
  void vaiDireita(){
   leftServo.write(90 + speed);
   rightServo.write(90 + speed);
  }
  
  /* veiculo para a esquerda */
  void vaiEsquerda(){
   leftServo.write(90 - speed);
   rightServo.write(90 - speed);
  }
  
   /* veiculo parado */
  void vaiParado(){
   //leftServo.write(90);
   //rightServo.write(90);
   leftServo.write(0);
   rightServo.write(0);
  }

Agradeço todo e qualquer contributo que possam dar.

Fala ai Lucas,

Você já fez 90%, o resto é repetir o que você já fez com alguns IFs a mais!

Eu fiz algo bem simples também, mas nós chegaremos lá rs

É isso ai!

Olá, Andre...

Primeira diferença é que usamos sensores IR, mas o funcionamento não é muito diferente.

A primeira coisa:
Quais valores os LDRs retornam quando estão sobre o branco e o preto?

normalmente eu comparo o resultado da leitura do analogRead() com um valor, por exemplo:

    if( LDREsq >= 100) //Supondo que seja 100 o valor sobre a linha
      vaiEsquerda();
    else if( LDRDir >= 100) //Supondo que seja 100 o valor sobre a linha
      vaiDireita();
      
    else
      vaiFrente();
  }

Você compara os dois lados, mas não tem um valor de referência

Tem um tutorial que parece legal em http://www.buildcircuit.com/ldr-based-line-following-robot-using-arduino-and-ardumoto/

Nesste tudorial ele usa led para emitir a luz e aumentar a leitura do LDR, sem o led e em ambiente escuro teu sensor ficaria sem referência.

Até

No branco entre os 300 e os 350 e no preto está a dar entre 135 e 145.

Vou experimentar comparando com um valor e ver o tutorial.

andremendes:
No branco entre os 300 e os 350 e no preto está a dar entre 135 e 145.

Vou experimentar comparando com um valor e ver o tutorial.

Beleza! Depois nos conta o resulado!

Abraço