Pages: [1]   Go Down
Author Topic: [Ajuda] Seguidor de linha  (Read 2570 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1583
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No primeiro bloco de codigo tens erros de sintaxe (nomes de variaveis mal)
Corregi para ficar assim:
Code:
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
« Last Edit: September 21, 2012, 02:54:05 am by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley-wink
Logged

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).

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado pela atenção de todos, com a ajuda do haistems_por, conseguir fazer o robô funcionar direito smiley-lol smiley-lol 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:
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);

 

  }
 
 
 
 
}
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado pela atenção de todos, com a ajuda do haistems_por, conseguir fazer o robô funcionar direito smiley-lol smiley-lol 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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado Mortis smiley-grin, 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  smiley-cry agora vou pesquisar mais e tentar fazer o de cinco sensores smiley-yell
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
« Last Edit: September 23, 2012, 11:03:39 am by andremendes » Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
« Last Edit: September 23, 2012, 02:11:05 pm by Mortis » Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
   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é
« Last Edit: September 23, 2012, 02:22:55 pm by Mortis » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 510
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: