Review: Sensor Sharp GP2D120
Autor: Pedro Werneck | Publicado: 2010-10-12T08:26:00-07:00

O sensor de distância por infravermelho GP2D120 da Sharp é o mais preciso e com melhor sensibilidade da linha, porém menor alcance, de 4 a 30cm. Pode ser bem útil em aplicações como detectores e robôs, mas ele tem várias pegadinhas que só descobri depois de um bom tempo de pesquisa e experimentação.
A primeira delas é a pinagem. Como pode-se ver na imagem do datasheet do componente, os pinos não seguem o padrão comum em outros componentes, negativo-positivo-sinal, mas sinal-negativo-positivo. Cuidado para não inverter.


A segunda pegadinha é o conector. A distância entre os pinos é de 2mm, e não de 2.54mm como estamos habituados, além da capa um pouco diferente do JST . Ao comprar confira se a loja também vende o fio com o conector e compre ou terá dor de cabeça, pois ele é muito difícil de encontrar. Como alternativa você pode remover o conector e soldar fios.

Terceira, o sensor é muito suscetível a interferências, então é praticamente imprescindível o uso de um capacitor de ao menos 10uF entre o positivo e negativo da alimentação o mais próximo possível do sensor. Experimentando eu percebi que o ideal mesmo é ele ficar no sensor, e no meu caso foi fácil quando removi o conector para soldar fios como mencionei acima, mas se estiver fazendo um serviço limpo e tiver o cabo, provavelmente terá de experimentar um pouco.


A quarta pegadinha é que com um tempo médio de resposta de 39ms, não adianta tentar ler o valor do sensor com mais frequência do que isso. Um delay de 50ms entre as leituras costuma dar um bom resultado.

Por fim, o mais complicado. Apesar de algumas lojas propagandearem que a saída analógica faz com que seja fácil de usar, isso só seria verdade se a saída fosse linear. Como pode ver no gráfico do fabricante abaixo, a saída do sensor é uma curva bem doida.


Essa curva tem várias implicações. O pico no início é a distância mínima, e dá pra perceber por isso que quando a distância ao obstáculo diante do sensor é menor do que o mínimo, ele vai reportar o mesmo valor que daria para uma distância maior. Isso pode significar um robô batendo na parede achando que não tem nada, por exemplo. Outra coisa importante é que a curva não é muito uniforme e a medida dentro de determinada faixa é mais precisa do que outras. Na prática a resolução acima de 10cm é praticamente a metade daquela de 4 a 10cm.

A maior implicação dessa não-linearidade é a complicação que introduz quando é necessário realizar uma medida de fato. Se a sua aplicação exige apenas fazer algo acima ou abaixo de determinada distância, não há problemas. Porém se você deseja de fato computar a distância, precisará corrigir os dados.

Uma maneira de fazê-lo é usando uma tabela, porém ela pode ocupar muito espaço na memória. Outra maneira é usar uma aproximação. como quebrar a curva em várias linhas. Um artigo no Acroname Robotics demonstra uma maneira simples de gerar uma aproximação com uma única equação simples obtida depois de gerar uma constante a partir dos dados do sensor para diversas distâncias. Para o GP2D120 a equação é apenas:

D = (2914 / (v + 5)) - 1

O código de exemplo abaixo demonstra o uso.


void setup() {
   // inicializa a porta serial
   Serial.begin(9600);
 }
 
 void loop() {
   // le o valor do sensor
   int v = analogRead(0);
   // faz uma aproximacao
   float dist = (2914.0 / (v + 5)) - 1;
   
   // exibe o resultado
   Serial.println(dist, DEC);

   // aguarda 50ms
   delay(50);}