Go Down

Topic: [Ajuda] Seguidor de linha (Read 3682 times) previous topic - next topic

lucaslimaduarte

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, http://www.youtube.com/watch?v.....e=youtu.be

o codigo para controlar o robô é este:
Code: [Select]
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:
Code: [Select]
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

HugoPT

#1
Sep 21, 2012, 09:26 am Last Edit: Sep 21, 2012, 09:54 am by HugoPT Reason: 1
No primeiro bloco de codigo tens erros de sintaxe (nomes de variaveis mal)
Corregi para ficar assim:
Code: [Select]

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
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

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. ;)
This... is a hobby.

Mortis

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.

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.

O robô é guiado por dois sensores frontais de IR o esquela obtive nesta pagina http://extremeelectronics.co.in/robotics/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

Code: [Select]
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);

 

  }
 
 
 
 
}

Mortis


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

lucaslimaduarte

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 :smiley-yell:

andremendes

#7
Sep 23, 2012, 06:01 pm Last Edit: Sep 23, 2012, 06:03 pm by andremendes Reason: 1
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.

Code: [Select]
#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.

Mortis

#8
Sep 23, 2012, 09:01 pm Last Edit: Sep 23, 2012, 09:11 pm by Mortis Reason: 1
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!

Mortis

#9
Sep 23, 2012, 09:20 pm Last Edit: Sep 23, 2012, 09:22 pm by Mortis Reason: 1
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:
Code: [Select]

   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é

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.

Mortis


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

Go Up