Buscar

Como usar sensor de distância analógico em entrada digital

No caso de alguns fabricantes de microcontroladores, como a Microchip, que segmentam muito as capacidades de seus microcontroladores, os integrados mais baratos e que podem ser encontrados em casas de eletrônicos do Brasil possuem pouca ou nenhuma entrada analógica.


Quando queremos medir distâncias, precisamos de uma variação contínua da nossa grandeza, no caso a distância. Neste caso, a forma mais natural de pensar é conectar a entrada analógica do PIC.


O que muitos não sabem é como poder ligar em uma entrada digital o sensor infravermelho para medirmos esta variável "analógica".


Retirado do site da Pololu, onde é dito o funcionamento de seus sensores. É explicado em alguns passos:




  1. Configure o pino de I/O para nível alto e como saída

  2. Aguarde no míninimo 10 μs para que a saída suba de nível.

  3. Coloque o mesmo pino de I/O como entrada (tri-stated).

  4. Meça o tempo que a tensão leva para cair de nível lógico.





Devido a operação do circuito do fototransistor como fonte de corrente, antes do primeiro passo o capacitor encontra-se carregado e a tensão no terminal OUT está em nível lógico "0". Então ao executar da primeira etapa o capacitor se descarrega.


Após aguardar o tempo de descarga o pino é configurado como entrada para que seja feita a leitura de seu estado lógico.


Finalmente, deve ser aguardado o tempo para que o capacitor carregue e o estado lógico caia e então deve ser mensurado o tempo em alto. Através da medição deste tempo pode ser indiretamente descoberta a distância de um anteparo.


O resultado é esse:




Em azul é o sinal em OUT e em amarelo é o que o micro controlador está interpretando do sinal em OUT. Fiz no código para o sinal interpretado ser reproduzido em uma saída, em amarelo.


O código para um PIC12F675 ficou como abaixo:

#include <htc.h>
 
#define _XTAL_FREQ 4000000
 
void main(void){
 
    TRISIO = 0xfe; // configura o GP0 como saída
    GPIO = 0x10; // todos pinos em nível baixo, exceto GP4
    WPU = 0x00; // desativa todos pull-ups
 
 
 while(1){
        GPIO = 0xff; // todos pinos em nivel alto
        TRISIO4 = 0; // configura o pino GP5 (capacitor) como saída
        __delay_us(10); // aguarda 10us
        TRISIO4 = 1; // configura o mesmo pino como entrada
 while(GP5){ // aguarda o pino chegar em nível baixo
 }
        GPIO = 0xfe; // então define o GP0 como nivel baixo
        __delay_us(700); // aguarda tempo mínimo
 
 }
 }

Esse é um código que pode ser facilmente implementado em praticamente qualquer microcontrolador.


Houveram algumas modificações no circuito a fim de adaptá-lo aos componentes disponíveis, o TIL78 (fototransistor) e o TIL32 (emissor) e estas são: substituição do resistor de acionamento do TIL32 por um de 47ohms e o de descarga do capacitor por um de 100ohms. Tais modificações causaram o receptor, a luz ambiente, a fornecer um tempo de 129,6 μs total. Já com grande reflexão do infravermelho o mesmo tempo correspondeu a 29,6 μs.


Fica a demonstração do funcionamento



Já conhecia a técnica? Já utilizou?
16 visualizações0 comentário

Posts Relacionados

Ver tudo