collapse

* Posts Recentes

Aplicação de IC TP4056 - dissipador por SerraCabo
[Hoje às 23:07]


Perfi aluminio por Njay
[Hoje às 18:19]


Problema em Impressora por senso
[Ontem às 12:46]


Ajuda atualizar hora NTP Verão/Inverno por vasco
[19 de Janeiro de 2020, 01:31]


Audio - Controlo Volume por SerraCabo
[17 de Janeiro de 2020, 21:20]


Mau condutor por vasco
[14 de Janeiro de 2020, 16:44]


Pequena impressora por jm_araujo
[13 de Janeiro de 2020, 10:34]


Martelo??? por Njay
[13 de Janeiro de 2020, 02:30]


Circuito de proteção para ferro de soldar. por vasco
[11 de Janeiro de 2020, 20:49]


Como criar Gerber F.Cu a partir do ficheiro BottomCu.gbr? por senso
[09 de Janeiro de 2020, 14:42]

Autor Tópico: Robot + IR  (Lida 5812 vezes)

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

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.631
  • Helpdesk do sitio
Re: Robot + IR
« Responder #15 em: 03 de Junho de 2011, 23:24 »
Podes filtrar os valores, por exemplo ler 8 vezes ou 16 vezes cada sensor e dividir por 8 ou 16 vezes respectivamente, isto vai eliminar as pequenas oscilações, depois dás uma margem de 10 ou 20 para cima e para baixo.
Avr fanboy

Offline Pirex

  • Mini Robot
  • *
  • Mensagens: 10
Re: Robot + IR
« Responder #16 em: 04 de Junho de 2011, 00:18 »
Podes filtrar os valores, por exemplo ler 8 vezes ou 16 vezes cada sensor e dividir por 8 ou 16 vezes respectivamente, isto vai eliminar as pequenas oscilações, depois dás uma margem de 10 ou 20 para cima e para baixo.

e como faço isso?

Offline Pirex

  • Mini Robot
  • *
  • Mensagens: 10
Re: Robot + IR
« Responder #17 em: 08 de Junho de 2011, 13:13 »
Não sei porque razão, mas os 4 sensores todos ligados ao mesmo tempo alteram os valores.
Com todos ligados os valores são:

Infra-vermelhos:
Tem obstáculo: >130
Não tem obstáculo: <130

Luz:
Tem luz: > 700
Não tem luz: <700

Com isto, já fiz o código, ainda não sei se funciona porque ainda tenho o arduino ligado ao PC (depois é a pilhas), mas espero que com os IF's, o carro não ande sempre aos rabiosques.

Aqui fica o código:

Citar
byte sensorIR1=1;  //define o pino 1 para o sensor de infra-vermelhos do lado esquerdo
byte sensorIR2=2;  // define o pino 2 para o sensor de infra-vermelhos do lado direito
byte sensorLUZ1=3;  //define o pino 3 para o sensor de luz do lado esquerdo
byte sensorLUZ2=4;  //define o pino 4 para o sensor de luz do lado direito


int ValorIR1;  // valor do infra-vermelho do lado esquerdo
int ValorIR2;  // valor do infra-vermelho do lado direito
int ValorLUZ1; //  valor da luz do lado esquerdo
int ValorLUZ2;  // valor da luz do lado direito

 int PWMA=10; //pino pwm do motor esquerdo
 int PWMB=11; //pino pwm do motor direito



void setup() {
  Serial.begin(9600);   
  analogWrite(PWMA,255); //definir PWM do motor 1 para velocidade máxima (0 a 255)
  analogWrite(PWMB,255); //definir PWM do motor 2 para velocidade máxima (0 a 255)
}

void loop() {
 
  ValorIR1 = analogRead(sensorIR1);
 
  Serial.print(" Valor do IR Esquerdo: ");
  Serial.println(ValorIR1); 

 ValorIR2 = analogRead(sensorIR2);
 
  Serial.print(" Valor do IR Direito: ");
  Serial.println(ValorIR2); 
 
 
  ValorLUZ1 = analogRead(sensorLUZ1);
 
  Serial.print(" Valor da LUZ do lado esquerdo: ");
  Serial.println(ValorLUZ1); 
 
    ValorLUZ2 = analogRead(sensorLUZ2);
 
  Serial.print(" Valor da LUZ do lado direito: ");
  Serial.println(ValorLUZ2);
  Serial.print("");
   
 {
   
   if ((ValorIR1 < 130) && (ValorIR2 < 130) && (ValorLUZ1 < 700) && (ValorLUZ2 < 700))
    {
      frente();  //1
    }
 
  if ((ValorIR1 < 130) && (ValorIR2 < 130) && (ValorLUZ1 < 700) && (ValorLUZ2 > 700))
    {
     direita(); //2
    }
   
   if ((ValorIR1 < 130) && (ValorIR2 < 130) && (ValorLUZ1 > 700) && (ValorLUZ2 < 700))
  {
    esquerda(); //3
  }
 
  if ((ValorIR1 < 130) && (ValorIR2 < 130) && (ValorLUZ1 > 700) && (ValorLUZ2 > 700))
  {
    frente(); //4
  }
 
  if ((ValorIR1 < 130) && (ValorIR2 > 130) && (ValorLUZ1 < 700) && (ValorLUZ2 < 700))
  {
    esquerda(); //5
  }
 
  if ((ValorIR1 < 130) && (ValorIR2 > 130) && (ValorLUZ1 < 700) && (ValorLUZ2 > 700))
  {
    esquerda(); // 6
  }
 
  if ((ValorIR1 < 130) && (ValorIR2 > 130) && (ValorLUZ1 > 700) && (ValorLUZ2 < 700))
  {
    esquerda(); // 7
  }
   
  if ((ValorIR1 < 130) && (ValorIR2 > 130) && (ValorLUZ1 > 700) && (ValorLUZ2 > 700))
  {
    esquerda(); //8
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 < 130) && (ValorLUZ1 < 700) && (ValorLUZ2 < 700))
  {
    direita(); //9
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 < 130) && (ValorLUZ1 < 700) && (ValorLUZ2 > 700))
  {
    direita(); //10
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 < 130) && (ValorLUZ1 > 700) && (ValorLUZ2 < 700))
  {
    direita(); //11
  } 
 
  if ((ValorIR1 > 130) && (ValorIR2 < 130) && (ValorLUZ1 > 700) && (ValorLUZ2 > 700))
  {
    direita(); //12
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 > 130) && (ValorLUZ1 < 700) && (ValorLUZ2 < 700))
  {
    stop(); //13
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 > 130) && (ValorLUZ1 < 700) && (ValorLUZ2 > 700))
  {
    stop(); //14
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 > 130) && (ValorLUZ1 > 700) && (ValorLUZ2 < 700))
  {
    stop(); //15
  }
 
  if ((ValorIR1 > 130) && (ValorIR2 > 130) && (ValorLUZ1 > 700) && (ValorLUZ2 > 700))
  {
    stop(); //16
  }
  }
   
  delay(300);

}

void frente()
{
analogWrite(PWMA, 255);
analogWrite(PWMB, 255);
}

void stop()        // Esta funçao define o PWM a 0 para que o carro pare.
{
analogWrite(PWMA, 0);
analogWrite(PWMB, 0);
}
/*
void reduzir()    // esta função define o PWM a 133 para o carro reduzir a velocidade.
{
analogWrite(PWMA, 133);
analogWrite(PWMB, 133);
}*/

void esquerda()
{
  analogWrite(PWMA, 0);
  analogWrite(PWMB, 133);

}

void direita()
{
 analogWrite(PWMB, 0);
 analogWrite(PWMA, 133);
}