SENSOR DE PROXIMIDADE INFRAVERMELHO – C/PIC 12F675 E TSOP1838 (REF256)

3

Detectando objetos por reflexão de raios infravermelhos…

Esta montagem permite detectar objetos a frente do sensor e também escolher como será a atuação na saída. Bastará escolher o modo de operação desejado no próprio programa C, recompilar e carregar no PIC. Veja o esquema abaixo:

SENSOR_PRESENCA_IR

Os sensores de proximidade podem ser usados em muitas aplicações interessantes como alarmes, torneira eletrônica, descargas eletrônicas, pequenos robôs autônomos, contadores de peças em linha de montagem, etc. Cada hobista poderá desenvolver a sua própria aplicação.
O sensor é composto de um receptor integrado de infravermelho (como o TSOP1838 ou similar) e um diodo emissor de infravermelho (como o LD271 ou similar). O diodo emite para frente e se tiver um objeto em seu caminho, será refletido de volta para o receptor infravermelho integrado (TSOP1838).
O programa usa a rotina “sensor_ir()” para gerar os pulsos no led infravermelho, receber os pulsos refletidos e depois, acionar a saída.
Ao ser chamada esta rotina, será produzido 80 pulsos de frequência de 38 Khz (burst) e um intervalo sem pulsos de 15 mseg. Isto é necessário porque o TSOP 1838 e seus similares não respondem a emissões continuas mesmo na exata frequência de operação deles. Durante a geração destes pulsos, a rotina também acompanha a saída do receptor pelo pino 4 do PIC. Se na leitura deste pino encontrar ‘0’, então incrementará um contador. Antes de sair desta rotina, o valor deste contador é comparado com um valor fixo, obtido experimentalmente. O resultado desta comparação determinará se houve ou não uma detecção de um objeto a frente do sensor, de uma forma mais confiável. A rotina retorna ‘1’ para objeto encontrado e ‘0’ para nenhum objeto encontrado.
Dependendo da aplicação do circuito, o hobista desejará usa-lo em modos diferentes. O programa tem 10 modos diferentes de operação, mais a opção de inverter a saída (para uso com transistor PNP). A escolha de um modo é feita facilmente mudando apenas um ou mais ‘defines’ das opções do usuário.

PROGRAMANDO O MODO DE OPERAÇÃO DESEJADO:
Abaixo temos a cópia de uma porção do programa com a opção ‘modo 5’ selecionada a título de exemplo:
/*******************************************************************************
ESCOLHA ABAIXO UMA DAS OPÇÕES POR DESCOMENTA-LA.
MANTENHA AS OUTRAS OPÇÕES COMENTADAS (COM “//” NA FRENTE)
*******************************************************************************/
// #define MODO_1 //
// #define MODO_2
// #define MODO_3
// #define MODO_4
#define MODO_5 //esta opção foi escolhida
// #define MODO_6
// #define MODO_7
// #define MODO_8
// #define MODO_9
// #define MODO_10

EXPLICAÇÃO DOS MODOS DE OPERAÇÃO:

Modo 1 – Ao detectar objeto aciona a saída por um tempo determinado e desliga
(pulso temporizado). Tem um tempo inicial mínimo de permanência do objeto
na frente do sensor para que aconteça a atuação (despreza movimentos
rápidos do objeto).
Após a temporização, enquanto objeto ficar na frente do sensor a saída
permanecerá desligada
Modo 2 – Ao detectar objeto aciona a saída por um tempo determinado e desliga
(pulso temporizado). Aciona com movimentos rápidos do objeto).
Após a temporização, enquanto objeto ficar na frente do sensor, a saída
permanecerá desligada
Modo 3 – Inverte a saída cada vez que um objeto passa pela frente dos sensores
(modo retenção). Aciona com a passagem rápida de obstáculos.
Enquanto objeto ficar acionando o sensor a saída permanecerá inalterada
Modo 4 – Inverte a saída cada vez que um objeto passa pela frente dos sensores
(modo retenção). Tem um tempo inicial mínimo de permanência do objeto
para que aconteça a mudança de estado da saída (despreza acionamentos
rápidos).
Enquanto objeto ficar na frente do sensor a saída permanecerá inalterada
Modo 5 – Ao detectar objeto aciona a saída. Enquanto objeto ficar na frente do
sensor a saída permanecerá ligada.
Aciona com a passagem rápida de obstáculos.
Modo 6 – Ao detectar objeto aciona a saída. Enquanto objeto ficar na frente do
sensor a saída permanecerá ligada. Tem um tempo inicial mínimo de
permanência do objeto na frente do sensor para que aconteça o
acionamento da saída (despreza acionamentos rápidos).
Modo 7 – Ao detectar objeto aciona a saída. Enquanto objeto ficar na frente do
sensor a saída permanecerá ligada. Após o objeto sair da frente do
sensor a saída continuará ligada por um tempo adicional programado
(pulso com pós temporização).
Aciona com a passagem rápida de obstáculos.
Modo 8 – Ao detectar objeto aciona a saída. Enquanto objeto ficar na frente do
sensor a saída permanecerá ligada. Tem um tempo inicial mínimo de
permanência do objeto na frente do sensor para que aconteça o
acionamento da saída (despreza acionamentos rápidos).
Após o objeto sair da frente do sensor a saída continuará ligada por
um tempo adicional programado (pulso com pós temporização).
Modo 9 – Inverte a saída cada vez que um objeto passa pela frente dos sensores
(modo retenção). Aciona com a passagem rápida de obstáculos.
Enquanto objeto ficar acionando o sensor a saída permanecerá inalterada
Após objeto sair da frente do sensor ocorrerá um tempo morto onde o
sensor estará inoperante.
Modo 10 – Inverte a saída cada vez que um objeto passa pela frente dos sensores
(modo retenção). Tem um tempo inicial mínimo de permanência do objeto
para que aconteça a mudança de estado da saída (despreza acionamentos
rápidos).
Enquanto objeto ficar acionando o sensor a saída permanecerá inalterada
Após objeto sair da frente do sensor ocorrerá um tempo morto onde o
sensor estará inoperante.

PROGRAMANDO O MODO DE OPERAÇÃO DA SAÍDA:
O modo de operação da saída é determinado conforme a porção do programa abaixo, sendo que este exemplo será para ‘modo normal’:

//Escolha se a saída será invertida ou normal:

// #define SAIDA_INVERTIDA // pino 5 terá lógica invertida (se for descomentado)

//Obs. Para saída normal comente o acima (use na frente ‘//’).
Esta escolha permite usar transistores do tipo PNP ao invés dos tradicionais NPN para acionar o relé.

PROGRAMANDO OS TEMPOS DOS MODOS:
Conforme o modo de operação, poderá ter atrasos que podem também ser alterados para mais ou menos, conforme a necessidade do usuário. Para isto, altere os valores de tempos na porção de código do programa conforme vemos abaixo:

#ifdef MODO_1
#define TEMPO_PRE_AC_M1 25 //# Necessita de 0,25 segundos com objeto permanecendo na frente do sensor
#define TEMPO_SAIDA_LIG_M1 1500// Ficará com saída ligada por 1,5 segundos
#endif

#ifdef MODO_2
#define TEMPO_LIGADO_M2 2000 //Ficará com a saída ligada por 2 segundos
#endif

#ifdef MODO_4
#define TEMPO_PRE_AC_M4 25 //#Necessita de 0,25 segundos com objeto permanecendo na frente do sensor
#endif

#ifdef MODO_6
#define TEMPO_PRE_AC_M6 25 //# Necessita de 0,25 segundos com objeto permanecendo na frente do sensor
#endif

#ifdef MODO_7
#define TEMPO_ADICIONAL_M7 2000 //Ficará 2 segundos co a saída ligada após objeto sair frente do sensor
#endif

#ifdef MODO_8
#define TEMPO_ADICIONAL_M8 2000 // //Ficará 2 segundos co a saída ligada após objeto sair frente do sensor
#define TEMPO_PRE_AC_M8 25 //# Necessita de 0,25 segundos com objeto permanecendo na frente do sensor
#endif

#ifdef MODO_9
#define TEMPO_MORTO_M9 2000 //2 segundos – sensor inoperante neste tempo
#endif

#ifdef MODO_10
#define TEMPO_MORTO_M10 3000 //3 segundos – sensor inoperante neste tempo
#define TEMPO_PRE_AC_M10 50 //# Necessita de 0,50 segundos com objeto permanecendo na frente do sensor
#endif

# Nota: Os tempos de pré-acionamento tem proporções diferentes dos outros
tempos gerados pela rotina ‘delay_ms()’. Como são gerados no loop de
repetição principal e as rotinas serão diferentes conforme a escolha do
modo desejado, os tempos poderão não ser muito precisos.

Lembre-se sempre de recompilar o programa quando fizer uma alteração quer seja de modo de operação ou de tempos, usando o compilador CCS C Versão 3.00, para obter o novo arquivo hex, que será usado para carregar o PIC.

Nota Importante na hora de programar o PIC:
É muito importante ao programar o PIC com o hex gerado, para não perder o byte de programação do oscilador interno do PIC, pois isto fará que não funcione nada ao tentar ligar o circuito. Após programar, leia o que foi programado no PIC e veja se a última posição da memória Flash tem um valor começando com 0x34XX, sendo o XX o valor do byte de programação original de fábrica. Se ler apenas 0xFF então não funcionará. Terá que colocar um valor manualmente como por exemplo, 0x34FC.
Obs. Esta montagem é experimental, sendo de caráter didático, montada apenas em placa experimental (do tipo “Breadboard”), sujeita a “bugs” ainda não detectados. Está sendo fornecido os arquivos para que cada hobista possa alterar o programa segundo suas necessidades.

Segue pasta zipada com os arquivos da montagem:

sensor_presenca_ir

Manuais:
PIC 12F675
TSOP1838 DATASHEET

Curiosidades:
O sistema de navegação da tartaruga marinha
Uma das nozes mais úteis do planeta
“Um monumento ao Diabo”
As frutas exóticas da Amazônia
Já provou a frutinha que pula?
O versátil limão siciliano
Proteja sua audição!

Outros assuntos:
Problemas financeiros e dívidas — a Bíblia pode ajudar?
Será que alguém já viu a Deus?
É possível saber quem realmente escreveu a Bíblia?
O que os números significam na Bíblia? A numerologia tem base bíblica?
O que é a fera de sete cabeças de Apocalipse capítulo 13?
Os desastres naturais são castigo de Deus?

Vídeos:
Uma exposição especial sobre a Bíblia
vídeos infantis com o Pedrinho
Veja filmes bíblicos
Quem é o Autor da Bíblia?
Será que é amor ou paixão?
Eu me cansei das religiões

Até o próximo artigo!

3

8 comments

  1. 0

    Este es el mensaje de error en proteus
    [PIC12 WDT] PC=0x0066. Processor has been reset as a result of incorrect watchdog timer initialisation. [U1]

    1. 0

      Olá Insecon!
      Parece ser alguma coisa com a configuração do WatchDog no Proteus. Tente algum forum de Proteus para tentar uma ajuda.
      Cláudio

  2. 0

    Ola, não aparecer mensagem e compila bem, mas o arquivo hex não funciona.
    Se os arquivos originais trabalhar bem com proteus e placa.
    com este v4.104 PCWHD.
    Eu continuo tentando.
    Obrigado.
    Antonio Del Rio.

  3. 0

    Olá Claudio, antetodo obrigado por responder.
    O problema é que com o compilador CCS C v.5015 modificado e não funciona mais.
    Se finciona o hex sensor_pres_ir_pulso_m5 bem em proteus.
    Você poderia me dizer como posso modificar o arquivo de origem, que pode ter configurado incorretamente o compilador.
    Onde obter a versão que você usa?
    Obrigado.

    1. 0

      Olá Insecon!
      Quando você compila qual é a mensagem de erro que aparece?
      As versões mais novas exigem que se configure pinos para comunicação. Se for este o caso, acrescente isto no cabeçalho. Consulte o ajuda do compilador para obter a grafia correta.
      Cláudio

  4. 0

    Hola, ele construiu o sensor de proximidade e funciona bem, mas necessita modificar os tempos, quando compilado com o compilador de Pic C, e simulo con Proteus no funciona.
    Cargando o HEX (sensor_pres_ir_pulso_m5) funciona perfecto.
    Por favor Podria ayudarme a simular proteus ??
    Gracias.
    Antonio Del Río
    Insecon@wanadoo.es
    Original:
    Hola, he construido el sensor de proximidad y funciona bien pero necesito modificar tiempos, cuando lo compilo con Pic C Compiler , y simulo con Proteus no funciona.
    Cargando el HEX (sensor_pres_ir_pulso_m5) funciona perfecto.
    Por favor Podría ayudarme a simular proteus??
    Gracias.
    Antonio del Río
    insecon@wanadoo.es

    1. 0

      Olá Insecon!
      Infelizmente seu comentário passou despercebido por mim, apenas hoje notei que não foi respondido. Peço desculpas. Talvez não necessite mais da ajuda pelo tempo decorrido. Quanto ao Proteus, algumas de minhas montagens não irão funcionar neste simulador (não saberia dizer o porque). Monte o circuito no breadboard e teste seu programa diretamente no pic. Desta forma terá certeza que irá funcionar suas alterações no programa.
      Cláudio

Comments are closed.