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: Duvida Seguidor de linha  (Lida 6338 vezes)

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

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Duvida Seguidor de linha
« 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);
       
}

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: Duvida Seguidor de linha
« Responder #1 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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Duvida Seguidor de linha
« Responder #2 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.
Avr fanboy

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Re: Duvida Seguidor de linha
« Responder #3 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...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Duvida Seguidor de linha
« Responder #4 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.
Avr fanboy

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Re: Duvida Seguidor de linha
« Responder #5 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 ...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Duvida Seguidor de linha
« Responder #6 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.
Avr fanboy

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Re: Duvida Seguidor de linha
« Responder #7 em: 28 de Maio de 2011, 03:11 »


É este o esquema das nossas ligações. So não estao representados os emissores de IV

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Re: Duvida Seguidor de linha
« Responder #8 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...

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Duvida Seguidor de linha
« Responder #9 em: 28 de Maio de 2011, 14:21 »
tens condensadores de decoupling nisso?

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Re: Duvida Seguidor de linha
« Responder #10 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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Duvida Seguidor de linha
« Responder #11 em: 28 de Maio de 2011, 21:58 »
Ui, devias ter ai mais meia duzia deles...
Avr fanboy

Offline DiogoPainho

  • Mini Robot
  • *
  • Mensagens: 18
Re: Duvida Seguidor de linha
« Responder #12 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.