Go Down

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

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

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. ;)
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.

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

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:

#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é

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