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

Robot + IR

Started by Pirex, 09 de February de 2011, 15:20

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Pirex

Boas,

Estou a montar um robot usando o arduino com o Motorshield v3.0 e já consigo mete-lo a andar para trás e para a frente, só que agora quero ligar o sensor de infra-vermelhos só que não sei onde o tenho que ligar nem como vou trabalhar com ele.

Gostava que alguém me podesse dar umas indicações de como ligar, testar, etc.

Desde já, Obrigado!

metRo_

Quote from: Pirex on 09 de February de 2011, 15:20
Boas,

Estou a montar um robot usando o arduino com o Motorshield v3.0 e já consigo mete-lo a andar para trás e para a frente, só que agora quero ligar o sensor de infra-vermelhos só que não sei onde o tenho que ligar nem como vou trabalhar com ele.

Gostava que alguém me podesse dar umas indicações de como ligar, testar, etc.

Desde já, Obrigado!

Que sensor estás a usar?

Pirex

O sensor é o Sharp 2Y0A02 F 04

metRo_


Pirex

Sei e o problema não é isso.

O problema é que não sou nenhum profissional de electrónica, e como tenho a ponte-h, não sei onde é que tenho que ligar os pinos.

metRo_

Por que assim é mais facil de explicar de maneira a aprenderes.

O ideal é sempre começar por procurar o datasheet do componente, todas as informações relativas ao componentes encontram-se neste documento.

Neste caso está aqui: http://sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a02_e.pdf

Fiz um printscreen do que acho que é necessário.


A vermelho tens o Supply Voltage, é a tensão de alimentação do componentes, podemos ver que deve ser entre -0.3 até 7V, como Arduino funciona a 5V vamos usar 5V. Então ao pino Vcc do componente (quadro azul) ligas 5V, estes 5V vêm de um dos pinos do Arduino. Ao pino do GND do componente (quadro azul) ligas o gnd do Arduino. Neste momento temos o componente alimentado.

O sinal que sai do sensor é uma sinal analógico. Se reparares no quadro verde este sinal vai deste -0.3 até um máximo do Vcc+0.3V. No nosso caso irá então de 0 a 5V (usamos 5V no Vcc). Sendo este sinal analógio é necessário ligar este sinal a uma entrada analógica do Arduino. O Arduino possui uns pinos que estão indicados na placa por Analog In. É num destes pinos que deves colocar o sinal.


Pirex

Muito obrigado,

já me ajudou a progredir mais um passo no meu projecto.

senso

Se tiveres o fio descarnado e enrolares o cobre com as pontas dos dedos para ficar tipo em espiral quase de certeza que dá para meter na breadboard, se não, solda-se uns headers.
Usar o google é sempre bom, é que meter sharp ir sensor arduino no google deve dar para mil resultados, provavelmente todos com código, fotos, esquemas, videos, e mais qualquer coisa.
Avr fanboy

Pirex

Boas,

já andei mais no meu projecto...mas agora surgiu-me um novo problema: o código.

O que eu só quero que funcione por agora é:
- Quando o valor do sensor for maior que 200, o motor anda para a frente (o PWM é de 255).
- Quando o valor do sensor for entre 100 e 200, o motor reduz a velocidade (o PWM passa para 133).
- Quando o valor do sensor for menor que 100, o motor pára.

Gostava de saber é como é que meto o motor a rodar para trás, em vez de
QuoteanalogWrite(PWMA, 255);
tenho que meter o número negativo?
QuoteanalogWrite(PWMA, -255);
Assim?

Outra dúvida é que eu na quarta-feira meti o sensor a funcionar, e o valor do sensor era pequeno quando tinha o obstáculo perto e aumentava à medida que se afastava...ora hoje deu precisamente para fazer o contrário e não sei porquê lol


Este é o código que eu fiz até agora:

Quotebyte sensorPin=5;
int Valor=0;
int maxVal=0;
int minVal=1024;

int PWMA=10; //pino pwm do motor 1
int PWMB=11; //pino pwm do motor 2
int DIRA=12; //pino de controlo do motor 1
int DIRB=13; //pino de controlo do motor 1


void setup() {
  Serial.begin(9600);
  Serial.println("in setup");   
  pinMode(13, OUTPUT);
  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() {
  //Serial.println("In loop");
  Valor = analogRead(sensorPin);
  if(Valor < minVal) {
    minVal = Valor;
  }
  if(Valor > maxVal) {
    maxVal = Valor;
  }
  Serial.print("Max: ");
  Serial.print(maxVal);
  Serial.print(" Min: ");
  Serial.print(minVal);
  Serial.print(" Ultimo: ");
  Serial.println(Valor);
 
   if(100 < Valor < 200 )
   {
    reduzir(); //chama a função frente
    }
  //  delay(5000); //os motores andam para a frente durante 5 segundos

    if(Valor < 100)
    {
      stop();
    }
   
  {
  delay(1000);
}

}
void tras()
{
  analogWrite(PWMA, -255);
  digitalWrite(DIRA, HIGH);
}

void frente()
{
analogWrite(PWMA, 255);
analogWrite(PWMB, 255);
digitalWrite(DIRA,LOW);
digitalWrite(DIRB,LOW);
}

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);
digitalWrite(DIRA, LOW);

}

void esquerda()
{
  analogWrite(PWMA, 133);
  digitalWrite(DIRA, HIGH);
  analogWrite(PWMB, 0);
  digitalWrite(DIRB, LOW);
}

void direita()
{
analogWrite(PWMB, 133);
digitalWrite(DIRB, HIGH);
analogWrite(PWMA, 0);
digitalWrite(DIRA, LOW);
}

Desde já obrigado pelas ajudas ;)

senso

Vai ao site do fabricante do teu shield e vê quais são os pinos que definem a direção de rotação dos motores, porque vai haver um pino que quanto metes a 1 ele vai andar num sentido e quando metes a 0 anda noutro.
O analogWrite tem de ser sempre um valor entre 0 e 255, meter um valor negativo ele trunca a 0 e não faz nada.
No setup quando metes o pwm a 255 no setup os motores não começam logo a andar?

EDIT: aliás até tens ai, o DIRA  e DIRB são quem trata da direção, é só veres se LOW é para a frente ou para trás..
Até já tens ai funções que mexem o DIRA e DIRB para andar para a frente e para trás, é o que dá copiar código e colar, nem sequer tentam perceber o que copiam.
Avr fanboy

amando96

O sensor pode estar a dar os resultados opostos aos da outra vez porque se calhar ligaste doutra maneira?

Pirex

A função que anda para a frente foi copiada, as outras fui eu que as fiz (e secalhar sao essas que estão mal -__-)

amando96, eu liguei exactamente da mesma maneira.

Pirex

Ora muito bem..

O projecto avançou, já tenho o material todo, o carro está montado, está tudo testado, só me falta a parte em que sou mais fraco, a programação.

O carro vai ter 2 sensores infra-vermelhos (para detectar obstáculos) e 2 sensores de luz (para seguir a luz).

O meu professor mandou-me fazer um código com funções e mais não sei o quê, e sinceramente, não sei como é que hei-de  o fazer.
Tenho os valores dos sensores, que os vou deixar aqui para quem se disponibilizar a ajudar-me, e a dar ideias.

Infra-vermelhos:
Quanto tem obstáculo: >100
Quando não tem obstáculo: <100

Sensor Luz:
Quando tem luz: > 700
Quando não tem luz: < 700

Ora, como devem ter percebido, é suposto o carro seguir a luz e desviar-se dos obstáculos, mas tem 1 sensor de cada tipo dos lados esquerdo e direito.

Deixo aqui o código que tenho feito até agora.

Quote

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 1
int PWMB=11; //pino pwm do motor 2



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("");

{
   
  delay(5000);
}

}


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 esquerda()
{
  analogWrite(PWMA, 0);
  analogWrite(PWMB, 133);
}

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



Desde já o meu obrigado!

senso

Estas duas chavetas á volta do delay:

{
   
  delay(5000);
}



Não fazem nada, então agora é chamar as funções quando queres que ele ande para a frente ou que vire.
Para isso usas if's para comparar os valores, se fores iguais para a luz por exemplo anda em frente, se for mais luz de um lado viras para esse lado, e etc,etc.
Avr fanboy

Pirex

Eu na altura tinha dito ao meu stor que fazia com IFs, ao que ele me disse que isso não servia porque o carro ia andar sempre aos S's.

Mas vou ver se funciona, só experimentando mesmo.

Mas há 1 pormenor, é praticamente impossível dar valores iguais nos 2 sensores de luz, são muito sensíveis, e não sei como fazer, tipo, uma margem de uns 100 valores de diferença entre os 2 sensores seria como se fosse a mesma luz nos dois, e seguia em frente.