• Welcome to LusoRobótica - Robótica em Português.
 

Dúvida com seguidor de linhas..

Started by fred gomes, 23 de January de 2010, 11:38

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

fred gomes

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:

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

fred gomes

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

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

ricardo-reis

diz-nos como tens tu ligado o circuito (pelo menos a parte do arduino + ponte h + motores)..

fred gomes

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

microbyte

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

fred gomes

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

microbyte

Quote from: fred gomes on 23 de January 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"..

É 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

fred gomes

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

fred gomes

cumprimentos,
Fred

OxyGen

coloca aqui o codigo final sff...
OxyGen #

fred gomes

Olá..
neste tópico tens la o código.

"Robot de Busca e Salvamento!"

está logo no inicio..
cumprimentos,
Fred