LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: DiogoPainho em 26 de Maio de 2011, 20:03

Título: Duvida Seguidor de linha
Enviado por: DiogoPainho em 26 de Maio de 2011, 20:03
Boas. A minha ideia e construir um robo seguidor de linha.
Ja consegui desenvolver um algoritmo, no entanto, quando faço a leitura dos sensores, estes dão-me bons valores para trabalhar, mas quando insero no algoritmo onde actuam os motores, os valores oscilam bastante sem ter um valor aceitavel para trabalhar. Como posso corrigir o problema?

Eis o algoritmo:


int motorleft1 = 9;
int motorleft2 = 8;
int motorright1 = 7;
int motorright2 = 6;
int pwml = 10;
int pwmr = 11;
int front = 4;
int left = 5;
int right = 3;
int cruzl = 2;
int cruzr = 1;
int fc = 0;
int botton1 = 1;
int botton2 = 2;
int botton3 = 3;
int botton4 = 4;
int botton5 = 5;
int buzzer = 6;

// ————————————————————————— Motores
void setup()
  {
  pinMode(pwml, OUTPUT);
  pinMode(pwmr, OUTPUT);
  pinMode(motorleft1, OUTPUT);
  pinMode(motorleft2, OUTPUT);
  pinMode(motorright1, OUTPUT);
  pinMode(motorright2, OUTPUT);
  pinMode(buzzer, OUTPUT); //------------------ Buzzer
  pinMode(fc,INPUT);    //------------------ Sensor Parede
 
   Serial.begin(9600); //Para podermos ver o valor na consola
 
  }
 
// ————————————————————————— Loop
void loop()
//Ler Sensores
{
   front = analogRead(front);   
   right = analogRead(right);
   left = analogRead(left);
   cruzl = analogRead(cruzl);
   cruzr = analogRead(cruzr);
   
   
   
    Serial.println(analogRead(left));
   
     



//-------------------------Andar para a frente
  {
 
       if(front > 30)
  {
          analogWrite(pwml, 170);
          analogWrite(pwmr, 170);
          digitalWrite(motorleft1, HIGH);
          digitalWrite(motorleft2, LOW);
          digitalWrite(motorright1, HIGH);
          digitalWrite(motorright2, LOW);
         
          delay (1000);
 
  }
//-------------------------Andar para traz
       if(fc = 0)
  {

          analogWrite(pwml, 127);
          analogWrite(pwmr, 127);
          digitalWrite(motorleft1, LOW);
          digitalWrite(motorleft2, HIGH);
          digitalWrite(motorright1, HIGH);
          digitalWrite(motorright2, LOW);
          digitalWrite(buzzer, HIGH);
          delay(1000);

  }
//--------------------------Virar à esquerda

       if (left < 30)
{
          analogWrite(pwml, 170);
          analogWrite(pwmr, 170);
          digitalWrite(motorleft1, LOW);
          digitalWrite(motorleft2, HIGH);
          digitalWrite(motorright1, HIGH);
          digitalWrite(motorright2, LOW);
          delay (1000);
}
//-------------------------Virar à direita

        if(right < 30)
{
          analogWrite(pwml, 170);
          analogWrite(pwmr, 170);
          digitalWrite(motorleft1,HIGH);
          digitalWrite(motorleft2, LOW);
          digitalWrite(motorright1,LOW);
          digitalWrite(motorright2, HIGH);
          delay (1000);
}
//---------------------- Fim

    //    if(left >10)
   //     if(front >10)
    //    if(right >10)
// {         
//         analogWrite(pwml, 0);
//         analogWrite(pwmr, 0);
//         digitalWrite(motorleft1,LOW);
//         digitalWrite(motorleft2, LOW);
//         digitalWrite(motorright1,LOW);
//         digitalWrite(motorright2, LOW);   

  }
//------------ Cruzamentos e salas
//if (bottom1 = 0)
//{
       
  //       if(cruzl <200);
//}
  //        analogWrite(pwml, 200);
    //      analogWrite(pwmr, 200);
      //    digitalWrite(motorleft1, HIGH);
        //  digitalWrite(motorleft2, LOW);
          //digitalWrite(motorright1, LOW);
          //digitalWrite(motorright2, HIGH);

//if   (bottom2 = 0)
//{
  //       if(cruzr <200)
//{
  //        analogWrite(pwml, 200);
    //      analogWrite(pwmr, 200);
      //    digitalWrite(motorleft1, HIGH);
        //  digitalWrite(motorleft2, LOW);
        //  digitalWrite(motorright1, LOW);
         // digitalWrite(motorright2, HIGH);
//}
//}
//if   (bottom3 = 0)
//{
//      if(cruzr <200)
//{
  //        analogWrite(pwml, 200);
    //      analogWrite(pwmr, 200);
      //    digitalWrite(motorleft1, HIGH);
        //  digitalWrite(motorleft2, LOW);
        //  digitalWrite(motorright1, LOW);
        //  digitalWrite(motorright2, HIGH);
//}         
  //      if(cruzl <200)
 
//{
  //        analogWrite(pwml, 200);
    //      analogWrite(pwmr, 200);
      //    digitalWrite(motorleft1, HIGH);
        //  digitalWrite(motorleft2, LOW);
       //   digitalWrite(motorright1, LOW);
        //  digitalWrite(motorright2, HIGH); 
       delay (1000);
       
}
Título: Re: Duvida Seguidor de linha
Enviado por: andre_f_carvalho em 27 de Maio de 2011, 18:36
n precebo o codigo que se usa no arduino, mas o mais provavel é estares a misturar valor dos motores com o dos sensores
Título: Re: Duvida Seguidor de linha
Enviado por: senso em 27 de Maio de 2011, 20:10
Aqui:
Código: [Seleccione]
if(fc = 0)

Devia ser  == e não =, == é para comparar,= é para atribuir o valor á variavel, logo o teu isse vai dar sempre true e não comparar com 0.
Que sensores estás a usar?
É normal que os valores oscilem, podes ter usar alguma filtragem nos sensores, mas sem mais informação é dificil de saber.
Título: Re: Duvida Seguidor de linha
Enviado por: DiogoPainho em 28 de Maio de 2011, 02:17
Estou a usar sensores IV. Quanto ao código é esse o unico reparo que tem a fazer? De resto a lógica está boa? Sou iniciante...
Título: Re: Duvida Seguidor de linha
Enviado por: senso em 28 de Maio de 2011, 02:23
O teu problema é que o teu código é demasiado simples e muito susceptivel a erros..
Tens um if(left<30) e outro com right<30, o que acontece se o valor desses 2 sensores for <30 ao mesmo tempo? O robot vai andar a oscilar e provavelmente tu não vais saber porque.
Título: Re: Duvida Seguidor de linha
Enviado por: DiogoPainho em 28 de Maio de 2011, 02:27
Então para além de por left > 30 tenho de por left > 30 && front <30 && right > 30, por exemplo...? Porém a minha dificuldade é que os sensores quando são lidos através do programa simples que é possivel encontrar em vários foruns, obtenho valores que dao para tabalhar, ou seja, 0 quando esta no preto e 30 quando está no branco. Porém quando transporto isso para este codigo, obtenho valores como por exemplo 20 110 50 10, tudo muito inconstante :s

Já agora pode-me relembrar qual e o programa que se usa para fazer o esquema das ligações, ja o tive, mas perdi-lhe o rumo ...
Título: Re: Duvida Seguidor de linha
Enviado por: senso em 28 de Maio de 2011, 02:44
Fritzing é o nome do programa.
Que sensores são?
Se mexeres os sensores depressa com a mão tambem deves obter esses valores assim mais elevados, é que uma coisa é com os sensores parados e tudo bonito, mas a mexer é outra coisa.
Título: Re: Duvida Seguidor de linha
Enviado por: DiogoPainho em 28 de Maio de 2011, 03:11
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg804.imageshack.us%2Fimg804%2F443%2Fesquemaligaoesbb.jpg&hash=4a111dca850f67fac533800f8bd6092bf609dec7) (http://imageshack.us/photo/my-images/804/esquemaligaoesbb.jpg/)

É este o esquema das nossas ligações. So não estao representados os emissores de IV
Título: Re: Duvida Seguidor de linha
Enviado por: DiogoPainho em 28 de Maio de 2011, 03:14
Os sensores são tres para de emissores e receptores de IV, como utiliza o Qu-Bot... Mesmo assim, simulando o movimento dos sensores pela linha e pelas zonas brancas os valores são aceitaveis para trabalhar, no entanto, quando trabalham em conjunto com os motores, esses valores são mesmo inconstantes. vai de 8 a 80 em cima do branco e do preto, quase nao há diferença...
Título: Re: Duvida Seguidor de linha
Enviado por: CBX em 28 de Maio de 2011, 14:21
tens condensadores de decoupling nisso?
Título: Re: Duvida Seguidor de linha
Enviado por: DiogoPainho em 28 de Maio de 2011, 16:09
Os unicos condensadores que uso é no regulador de tensão, ou seja, um condensador de 100 microF(Electrolito) à entrada e um de 100 nanoF (Poliester) à saida
Título: Re: Duvida Seguidor de linha
Enviado por: senso em 28 de Maio de 2011, 21:58
Ui, devias ter ai mais meia duzia deles...
Título: Re: Duvida Seguidor de linha
Enviado por: DiogoPainho em 29 de Maio de 2011, 21:44
Vou testar por um ou dois para os sensores a ver se as mediçoes ficam mais estáveis.