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:
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.