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:

Configure o pino de I/O para nível alto e como saída
Aguarde no míninimo 10 μs para que a saída suba de nível.
Coloque o mesmo pino de I/O como entrada (tri-stated).
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?