collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Dúvida com seguidor de linhas..  (Lida 5924 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Dúvida com seguidor de linhas..
« em: 23 de Janeiro de 2010, 11:38 »
Boas pessoa.
Hoje decidi pegar no projecto dum seguidor de linhas (utilizando o arduino) que se encontrava pendente devido a uns problemas que tinha com o funcionamento dele e que não os tinha conseguido resolver..

programação que estou a utilizar é a seguinte:

Código: [Seleccione]
int motor_right1 = 5;
int motor_right2 = 6;
int motor_left1 = 10;
int motor_left2 = 11;
int sensor_right = 5;
int sensor_left = 0;
int valor = 0;
int valor1 = 0;

void setup(){
  Serial.begin(9600);
 
  pinMode (motor_right1, OUTPUT);
  pinMode (motor_right2, OUTPUT);
  pinMode (motor_left1, OUTPUT);
  pinMode (motor_left2, OUTPUT);

}


void loop(){

 
  valor = analogRead (sensor_right);
  Serial.print (valor);
  delay (200);


  if (valor < 350){
  analogWrite (motor_right1, 0);
  analogWrite (motor_right2, 0);

  }
  else {
  analogWrite (motor_right1,255);
  analogWrite (motor_right2, 0);
  }
    Serial.print("  ");

  valor1 = analogRead (sensor_left);
  Serial.println (valor1);
  delay(200);

  if (valor1 <350){
    analogWrite (motor_left1,0);
    analogWrite (motor_left2,0);

  }
    else{
    analogWrite (motor_left1,255);
    analogWrite (motor_left2,0);
    }

  if (valor > 350 && valor1 < 350){
  analogWrite (motor_right1,0 );
  analogWrite (motor_right2, 0);
  analogWrite (motor_left1, 255);
  analogWrite (motor_left2,0);
  while (valor > 350 && valor1 >350);
  }
  if (valor <350 && valor1 > 350){
    analogWrite (motor_right1, 255);
    analogWrite (motor_right1, 0);
    analogWrite (motor_left1, 255);
    analogWrite (motor_left1, 0);
    while (valor > 350 && valor1 >350);
     }
}

os sensores dão os valores esperados, ora muito altos, ora muito baixos, mas os motores nao se comportam segundo a programação.., estou a utilizar o L293D,

alguém sabe o porquê de não obter os resultados esperados?

cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Dúvida com seguidor de linhas..
« Responder #1 em: 23 de Janeiro de 2010, 12:05 »
Boas.
alteração de código (estive a ver melhor e o código que tinha tinha inversão de marcha incluida, não a estou a utilizar agora...

Código: [Seleccione]
int motor_right = 3;
int motor_left = 6;
int sensor_right = 5;
int sensor_left = 0;
int valor = 0;
int valor1 = 0;

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

}


void loop(){

 
  valor = analogRead (sensor_right);
  Serial.print (valor);
  delay(200);


  if (valor < 350){
  analogWrite (motor_right, 0);

  }
  else {
  analogWrite (motor_right,255);
  }
    Serial.print("  ");

  valor1 = analogRead (sensor_left);
  Serial.println (valor1);
  delay(200);

  if (valor1 <350){
    analogWrite (motor_left,0);

  }
    else{
    analogWrite (motor_left,255);
    }

  if (valor > 350 && valor1 < 350){
  analogWrite (motor_right,0 );
  analogWrite (motor_left, 255);
  while (valor > 350 && valor1 >350);
  }
  if (valor <350 && valor1 > 350){
    analogWrite (motor_right, 255);
    analogWrite (motor_left, 0);
    while (valor > 350 && valor1 >350);
     }
}

agora os motores andam e param consoante o valor dos sensores, mas se colocar o sensor da esquerda no branco e o da direita manter-se no preto, o da direita abranda um bocado, e o da esquerda abranca mais do que o da direita e continua andar "aos solabancos, muito de vagarinho", isso nao deveria acontecer, o da direita deveria continuar andar normalmente e o da esquerda parar...o mesmo acontece para o oposto, sensor da direita no preto, e da esquerda no branco..

alguém sabe a que se deve isto?
Obrigado.
cumprimentos,
Fred

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re: Dúvida com seguidor de linhas..
« Responder #2 em: 23 de Janeiro de 2010, 14:19 »
diz-nos como tens tu ligado o circuito (pelo menos a parte do arduino + ponte h + motores)..

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Dúvida com seguidor de linhas..
« Responder #3 em: 23 de Janeiro de 2010, 14:59 »
Boas Ricardo..
Então...

### Pinos da Ponte H---> 
                                         pino1.+ da fonte
                                         pino2.saída PWM 6 do arduino
                                         pino3.motor right
                                         pino 4 e 5. massa
                                         pino6.motor left
                                         pino7.saída PWM 3 do arduino
                                         pino8.+ da fonte

essa parte penso que está bem ligada, caso contrário os motores nem andariam.o meu problema é que ao colocar um sensor no branco e outro no preto , o motor que deveria parar nao para por completo (anda aos solbancos de vagarinho) e o reduz a sua velocidade mas anda ligeiramente mais depressa..,

cumps
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Dúvida com seguidor de linhas..
« Responder #4 em: 23 de Janeiro de 2010, 15:22 »
Uma coisa boa que fazias era meter um Serial.print() dos valores no loop, que é para veres quais são os valores...

Aconselhava-te a tirar os whiles que tens dentro dos IFs... Pode muito bem ser isso que esteja a causar os solavancos...

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Dúvida com seguidor de linhas..
« Responder #5 em: 23 de Janeiro de 2010, 21:12 »
Boas mycrobyte :)
Segui os teus conselhos, e  já funcionou :D , muitissimo obrigado...
e já agora, sabes me dizer o porquê dos whiles provocarem os solabancos nos motores?, eu pensava que isso deveria ter haver com alguns "delay´s"..
cumprimentos,
Fred

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Dúvida com seguidor de linhas..
« Responder #6 em: 23 de Janeiro de 2010, 21:52 »
Boas mycrobyte :)
Segui os teus conselhos, e  já funcionou :D , muitissimo obrigado...
e já agora, sabes me dizer o porquê dos whiles provocarem os solabancos nos motores?, eu pensava que isso deveria ter haver com alguns "delay´s"..

É muito simples, ao definires valores concretos, estás a partir do princípio que o valor real nunca anda próximo desse valor que defines... Ora, pode acontecer que o valor real seja até exactamente o valor que tu definiste como margem...

Agora supõe outra coisa. Imagina que os valores dos 2 sensores são: 900 e 200
tens:
valor = 900 e valor1 = 200

Agora vê o teu código... Relembro que o código é lido sequencialmente e as coisas não são executadas em simultâneo.
void loop(){

 
  valor = analogRead (sensor_right);
  Serial.print (valor);
  delay(200);


  if (valor < 350){ não entra aqui, porque valor = 900
  analogWrite (motor_right, 0);

  }
  else { Entra aqui...
  analogWrite (motor_right,255);
  }
    Serial.print("  ");

  valor1 = analogRead (sensor_left);
  Serial.println (valor1);
  delay(200);

  if (valor1 <350){ Entra aqui porque valor1 = 200
    analogWrite (motor_left,0);

  }
    else{
    analogWrite (motor_left,255);
    }

  if (valor > 350 && valor1 < 350){ Entra aqui, pelas mesmas razões
  analogWrite (motor_right,0 );
  analogWrite (motor_left, 255);
  while (valor > 350 && valor1 >350);

  }
  if (valor <350 && valor1 > 350){
    analogWrite (motor_right, 255);
    analogWrite (motor_left, 0);
    while (valor > 350 && valor1 >350);
     }
}

Ora, o que é executado, está sublinhado... E resumidamente, por ordem:
  • Motor direito on (255)
  • Motor esquerdo off (0)
  • Motor direito off (0)
  • Motor esquerdo on (255)

Ora cá está o belo do solavanco.

Para já não falar que os whiles, penso que querias que não saísse dali enquanto se verificasse a condição que tens no IF. Ora vê:
if (valor > 350 && valor1 < 350){
  while (valor > 350 && valor1 >350);
}

Se as condições não são as mesmas, o while não faz ali nada, pois quando valor > 350 && valor1 >350, nem chegas a executar o que está dentro do IF.

Isto fez algum sentido? Espero ter tirado algumas dúvidas a mais pessoal. ;)

PS: é microbyte  :D

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Dúvida com seguidor de linhas..
« Responder #7 em: 23 de Janeiro de 2010, 22:15 »
já percebi o motivo dos solabancos..lool, tens toda a razão..
eu tinha muitas coisas desnecessárias no código (apesar de não estarem propiamente incorrectas só estavam ali atrapalhar),

já alterei o codigo e ja funciona na prefeição...
mais uma vez mto obrigado pelas explicações mycrobite ;)
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Dúvida com seguidor de linhas..
« Responder #8 em: 23 de Janeiro de 2010, 22:18 »
ups :-X
sorry, ...microbyte..
cumprimentos,
Fred

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Dúvida com seguidor de linhas..
« Responder #9 em: 09 de Maio de 2010, 00:39 »
coloca aqui o codigo final sff...
OxyGen #

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Dúvida com seguidor de linhas..
« Responder #10 em: 09 de Maio de 2010, 19:52 »
Olá..
neste tópico tens la o código.

"Robot de Busca e Salvamento!"

 está logo no inicio..
cumprimentos,
Fred