Autor Tema: Detector obstaculos IR  (Leído 3871 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Detector obstaculos IR
« en: 11 de Septiembre de 2008, 16:01:25 »
He estado pensando en un detector de obstaculos IR... y estoy probando algo parecido a un sistema que vi por ahí en un detector comercial... a ver que pensais.

Muchas veces se usa una señal de 40 khz que está encendiendo y apagando el Led continuamente unas 40.0000 veces por segundo, luego esa señal es recogida por el receptor que tiene un filtro que solo deja pasar frecuencias alrededor de 40 khz, de esta manera solo es sensible a las señales que provienen del propio emisor, desechando cualquier otra, esto se utiliza en los mandos a distancia y comunicacion por IR, ya que esta señal se usa como portadora para modular otras señales de frecuencia mucho más bajas (alrededor de 1khz) que son los codigos que lee el aparato controlado por el mando a distancia, o se podria modular un protocolo de comunicaciones o lo que sea...

Pero en el caso de detectar obstaculos en realidad no es necesario todo esto, algunos detectores comerciales usan frecuencias mucho más bajas (7 khz por ejemplo) y no demodulan porque no tienen que extraer singuna señal modulada, simplemente sincronizan el receptor con el emisor, es decir la señal del receptor se compara con la del emisor... si coinciden entonces hay algo delante.

Dando un paso más... ¿realmente necesitamos que el detector IR compruebe 7000 veces por segundo si hay algo delante?... yo diría que no.... con 10 o 20 veces por segundo tenemos de sobra.
Incluso no es necesaria una señal a determinada frecuencia, simplemente enviar un pulso al Led emisor... comprobar si el receptor ha recibido un pulso... seguir con el programa general que puede estar haciendo cualquier otra cosa.... en otra parte del programa o en la siguiente vuelta volver a enviar otro pulso y comprobar si se recibe un pulso.

De esta manera se consiguen varias cosas... primero un ahorro de energía considerable, tambien un ahorro de código y no estar sujetos a frecuencias concretas,  los pulsos se pueden insertar como parte de un delay por ejemplo o en cualquier sitio que no molesten, la única condición es que sean enviados al menos 10 o 20 veces por segundo, pero pueden ser más... además es más dificil que hayan falsos positivos ya que la mayor parte del tiempo el pic no está escuchando al receptor IR.

He estado haciendo algunas pruebillas y funcionar funciona, pero las hice con un fototransistor directamenmte a una entrada... bueno, no directamente, hay que ponerle algo para que solo deje pasar pulsos y rechace la componente continua, yo lo hice con una Resistencia y un Condensador; me refería a que lo hice sin amplificar la señal, entonces solo detecta a un par de centimetros, el tema sería amplificar o usar un receptor de los que usan las Tv y otros aparatos, en este caso habría que ajustar el ancho del pulso para que no sobrepase 1/40.000 seg.

La prueba la hice con el siguiente código en asm... l, en este caso utilicé la rutina de "delay" de encendido del Led para meter dentro la instruccion que lee la patilla del pic... osea mientras el Led esta encendido a la vez esta comprobando si se recibe alguna señal:

Código: [Seleccionar]

   1. start 
   2.    bsf        STATUS,5 
   3.    movlw    b'10000000'            ;A7 como entrada detecta pulso IR 
   4.    movwf    TRISA 
   5.    clrf    TRISB                ;puerto B como salidas 
   6.    bcf        STATUS,5 
   7.    clrf    PORTA 
   8.    clrf    PORTB 
   9. ;------------------------------------------------------------------------------------------------- 
  10. ;lo siguiente es el pulso: 
  11. ;------------------------------------------------------------------------------------------------- 
  12. 
  13. __pulso 
  14. 
  15.    bsf        PORTB,2            ;ENCIENDE Led EMISOR INFRARROJO 
  16.     
  17. 
  18.    movlw    d'10'                ; ciclos del bucle 
  19.    movwf    pa 
  20. Delay_0                        ;bucle delay
  22.    btfss    PORTA,7               ;lee A,7 aqui está conectado el fototransistor 
  23.    goto    $+2                   ;si no hay deteccion salta dos lineas 
  24.    bsf     PORTB,0                ;si hay deteccion  enciende Led testigo 
  25.    decfsz    pa, f                ;resta 1 al contador (pa) y si es 0 salta una linea 
  26.    goto    Delay_0            ;vuelve al principo del bucle 
  27. 
  28. 
  29.    bcf     PORTB,2                ;APAGA Led EMISOR INFRARROJO 
  30.     
  31. 
  32. ;------------------------------------------------------------------------------------------------- 
  33. ;ya se envió el pulso y se comprobó si se recibe algo, ahora seguiría el programa... 
  34. ;para simular esto puse un delay y que vuelva al principio... 
  35. ;este delay es mucho mayor (250) que el pulso (10) 
  36. ;------------------------------------------------------------------------------------------------- 
  37.    movlw    d'250'                ; ciclos apagado 
  38.    movwf    pa 
  39. Delay_1 
  40.    nop 
  41.    decfsz    pa, f 
  42.    goto    Delay_1 
  43.    goto    __pulso 
  44. 
  45. 
  46. END 
  47. 

Estoy usando un pic 16F628A
Es una primera aproximación y habría que afinar el tema y sobre todo probarlo.... a ver que pasa
Se agradece cualquier sugerencia.


Desconectado Chrisbaf

  • PIC16
  • ***
  • Mensajes: 178
Re: Detector obstaculos IR
« Respuesta #1 en: 12 de Septiembre de 2008, 00:05:15 »
mira aqui hay algo que talvez de puede interesar http://www.chilebot.cl/guias/calcular-distancias-con-sensores-ir.php

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: Detector obstaculos IR
« Respuesta #2 en: 12 de Septiembre de 2008, 23:04:15 »
pues si que está interesante... inteligente método para calcular distancias con infrarrojos, no muy exacto, pero da una aproximación.

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: Detector obstaculos IR
« Respuesta #3 en: 18 de Septiembre de 2008, 01:27:20 »
Pues ahí sigo haciendo pruebas, con el fototransistor tengo problemas con la luz de bombillas incandescentes, se vé que emiten mucho infrarrojo, de todas formas no conseguí pasar de 10-15cm; entonces me puse a probar con un receptor de 38khz, haciendo una rutina que encienda el led IR 13us y apague otros 13us, lo primero que me llamó la atención es lo sensible que son estos bichitos a la frecuencia.. un par de us más o menos y ya no detecta casi nada, aún así no he pasado de los 30cm, lo que me extraña es que usando el circuito emisor de un mando a distancia consigo alcances de hasta 3m,.... es demasiada diferencia, incluso teniendo en cuenta que la frecuencia que me da el pic no sea exacta; las pruebas las hice con el mismo led, la misma potencia de emisión y todo igual, lo único que cambia es la señal viene del pic o viene del emisor del mando a distancia; el problema es que el mando emite una señal con una serie de pulsos que yo no puedo controlar, y que claro.. la frecuencia es fija a 38 khz... y me gustó la idea de medir distancias cambiando la frecuencia de emisión del IR y con el mando no lo puedo hacer, tendría que hacerlo cambiando la potencia de emisión, y eso complica la cosa.

Lo que me intriga es porqué con la señal del pic no alcanzo más de 30cm en el mejor de los casos... puede que sea cuestión del oscilador interno, ya que con 4Mhz de reloj, osea 1Mhz de ejecución de órdenes, la precisión no es mucha, pero seguro que está dentro del +-5% o cosa así y con el mando a distancia consigo alcances 10 veces mayores... porqué tanta diferencia?

Los 30 cm me valdrían para esquivar obstaculos, pero después de leer lo de estimar distancias con IR, se me ocurren varias cosas, como algún tipo de posicionamiento... tomar referencias.. vamos que el robot podría hacerse a la idea de como es el espacio alrededor y encontrar una salida, o hacerse una idea del tamaño y la forma del espacio, y posicionarse respecto a él;... para todo esto me haría falta un alcance de un par de metros al menos, y que el robot girara sobre sí mismo y fuera tomando medidas de distancia.

Que experiencia tienen ustedes con esto de los IR?