quinta-feira, 7 de julho de 2011

Projeto RAMA - Sensor de obstáculos

Ola,

Hoje vou explicar como foi feito o sensor que serve para ver se há algum obstáculo em frente ao mesmo.
Ele funciona segundo o princípio da reflexão da luz. Utiliza dois componentes básicos: o led infra vermelho e o receptor infravermelho.
A rotina de leitura do sensor é a seguinte: desligar LED -> medir fundo -> ligar LED -> medir leitura ->calcular.

Vou explicar como funciona: primeiro ele desliga o led infravermelho e mede a intensidade do fundo, isto é, a quantidade de infravermelho que já "havia" no local e a grava na variável fundo(apenas em uma sala completamente escura não há nenhum infravermelho).


Depois ele liga o LED infravermelho e mede a intensidade da luz refletida pelo objeto, e se não houver nenhum objeto então a intensidade refletida vai ser pouco diferente da intensidade de fundo.  
No código fonte a leitura é invertida devido à construção eletronica do sensor.

Depois disto, o programa no PIC calcula a direfença e verifica se o resultado é maior que o valor de disparo para objeto, que é um valor fixo que indica quando a diferença de luz chega a um nivel onde há um objeto na frente do sensor, então retorna uma variável booleana (sim ou não) com o resultado da leitura.

O esquemático e a placa de circuito:














Placa de circuito impresso: http://www.megaupload.com/?d=65Z3B9K1

Segue o código fonte:
> SensorIR.c
 ////////////////////////////////////////////////////////////////////////////////
//////////////////////////ROTINAS DO SENSOR/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

#DEFINE irled pin_a2

int disparo=60;
int fundo=0, leitura=0, res=0;

//Funçao para detecção de obstáculo
boolean obstaculo()
{
   set_adc_channel(0);
   delay_us(30);
   output_low(irled); //Desliga LED
   fundo = read_adc(); //Lê fundo
   delay_us(30);
   output_high(irled); //Liga LED
   leitura = 255 - read_adc(); //Lê medida
   output_low(irled);
   res = leitura - fundo; //Calcula
   if (res>disparo) //Retorna resultado
   {
      return true;
   }
   else
   {
      return false;
   }
}
Só isso por enquanto.

Até mais,

Giovanni WarLock