Autor Tema: Deteccion de pulsos infrarrojos  (Leído 3517 veces)

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

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Deteccion de pulsos infrarrojos
« en: 12 de Abril de 2006, 15:13:58 »
Estoy realizando mi primer bot, y para la deteccion de objetos habia pensado en generar un pulso de infrarrojos los cuales en presencia de un objeto rebotaran y seran captados mediante un tsop1738, tiene logica inversa. El programa que hice no funcionaba, asi que he hecho este de prueba que simplemente capta los pulsos pero sigue sin funcionar. El Tsop y el emisor de infrarrojos funciona bien, asi que creo que el problema debe estar en el codigo, he puesto encender algunos led's conectados al puerto B en distintas partes del codigo para ver que procesos se realizan, se activan los pines B0 y B1, asi que creo que el problema esta en que o no cuenta rebotes o por alguna razon no entra en el if si distinto de 0. Era por si alguien sabe que puesto estar haciendo mal, gracias de antemano.

Aqui esta el codigo:

Código: C
  1. #include <16f876a.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  3. #use delay(clock=4000000)
  4. #use standard_io(b)
  5. #use standard_io(c)
  6. #define sensor_ir input(PIN_B3)
  7. #bit T0IF = 0xb.2
  8.  
  9. int duty       =  12;
  10. int tempo      =  25;
  11. int cuenta_reb =  0;
  12.  
  13. void detecta_reb (void){
  14.   output_high(pin_b0);
  15.   set_timer0(0x00);//pongo a 0 timer
  16.   setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
  17.   //mientras temporizo cuento rebotes
  18.      while(!T0IF){
  19.       if(!sensor_ir){
  20.          output_high(pin_b1);
  21.          ++cuenta_reb;
  22.          while(!sensor_ir){}
  23.       }
  24.      }
  25.      T0IF=0;//pongo a 0 la bandera
  26.      if (cuenta_reb!=0){//Por ahora 0, mirar si cambiar
  27.      output_high(pin_b2);
  28.      }
  29.   }
  30.  
  31. void main() {
  32.    output_b(0x00);
  33.  
  34.    setup_ccp1(CCP_PWM);                // Configura CCP1 como PWM
  35.  
  36.    setup_timer_2(T2_DIV_BY_1,tempo,1); // f=38KHz (t = 26us)
  37.  
  38.    set_pwm1_duty(duty);                // Determina tiempo en alto
  39.  
  40.    do{
  41.       if(!sensor_ir){
  42.          detecta_reb();
  43.       }
  44.       delay_ms(100);//para poder ver que se enciende
  45.       output_low(pin_b2);//borra para poner a 0 sino detecta
  46.       cuenta_reb =  0;// pongo a cero contador
  47.      }while (TRUE);
  48. }

He colocado aqui el hilo y no en el subforo de robotica porque el problema creo que debe ser del programa, y no del hardware, pero si considerais que no debe ir aqui no hay problema
« Última modificación: 12 de Abril de 2006, 15:16:59 por kain589 »
Saludos desde Córdoba, españa

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Deteccion de pulsos infrarrojos
« Respuesta #1 en: 12 de Abril de 2006, 17:01:54 »
Hola kain

Por lo que veo pin_b1 siempre estará encendido, nunca lo apagas en el código.

Lo revisé y no le encuentro más fallas. El tiempo que das para detectar la presencia del rebote es de 4.096ms, talvez los rebotes duran más que eso.

¿Qué leds son los que se activan?


Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Deteccion de pulsos infrarrojos
« Respuesta #2 en: 12 de Abril de 2006, 17:16:05 »
Gracias por tu respuesta, si B0 y B1 nunca se apagan, en el codigo final no iran, en este los he puesto a modo de señalizadores, para ver que zonas del programa se ejecutaban. El led B2 es el que no se activa, y deberia activarse si el numero de rebotes es distinto de 0 ya que entraria en el "if (cuenta_reb!=0)"
La señal es de 38khz, por eso le he puesto esa temporizacion, al principio le puse que temporizara 1.024ms y tampoco iba por eso le subi a 4.096,
Saludos desde Córdoba, españa

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Deteccion de pulsos infrarrojos
« Respuesta #3 en: 12 de Abril de 2006, 17:30:56 »
OK, si pin_b2 no prende me imagino que el PIC se queda atorado aquí...

Código: [Seleccionar]
while(!sensor_ir){}

El TSOP1738 es muy poderoso, detecta rebotes incluso a varios metros de distancia usando leds al estilo de controles remotos. Probablemente el tsop nunca deja de enviar un 0 (que es presencia de portadora 38kHz) y por eso se queda atorado ahí el PIC.

Intenta desconectar por completo el led emisor (que pusiste en CCP1) para probar que el while libere al PIC.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: Deteccion de pulsos infrarrojos
« Respuesta #4 en: 12 de Abril de 2006, 18:19:20 »
Hola

desgraciadamente no se nada de C de manera que si es problema de software no te puedo ayudar, pero te comento la primera experiencia que tuve con un tsop1738 precisamente y que me rompio bien la cabeza...
lo primero, como bien dice migsantiago, es que los rebotes se las traen, de manera que procura que el emisor y el receptor no esten muy proximos y encierra lo mas posible el emisor -dentro de un canutillo o similar a falta de algo mejor- o sigue el consejo de migsantiago y retiralo hasta que sepas que en el receptor no esta el problema.
para probar que el receptor me funcionaba bien conecte el tsop a una entrada del pic y dos leds a sendas salidas, y despues simplemente hice un pequeño programa -en mi caso en basic- en el cual leia el estado de la entrada y si este valor era cero encendia un led y en el caso de ser un 1 el otro. por defecto el tsop entrega un 1 si no recibe nada y un 0 cuando recibe una señal a 38khz, si diriges un mando a distancia de la tv o el video hacia el tsop y pulsas el boton de encendido deberia cambiar de estado.
la salida del tsop ademas es colector abierto y no esta de mas ponerle una resistencia a vdd de 10k (entre las patitas 2 y 3).

un saludo

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Deteccion de pulsos infrarrojos
« Respuesta #5 en: 15 de Abril de 2006, 13:03:11 »
He seguido probando y lo que pasa es que al alejar el emisor, se pone a 1 la salida como si como decis se quedara dentro del while.

Es que mi problema es que crei que el tsop reflejaba el estado de la portadora de modo transparente y no que pusiera un 1 ó un 0 en funcion de si hay o no portadora
« Última modificación: 15 de Abril de 2006, 13:07:24 por kain589 »
Saludos desde Córdoba, españa

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Deteccion de pulsos infrarrojos
« Respuesta #6 en: 15 de Abril de 2006, 13:47:53 »
Por si todavía te quedan dudas de como funciona el TSOP1738 te explico brevemente:

- Si el TSOP recibe pulsos de luz infrarroja con una frecuencia de 38kHz, su salida se pondrá a 0V mientras ese tren de pulsos exista.
- Si el TSOP no recibe pulsos a 38kHz, su salida se pondrá a 5V.

Es importante mencionar que la salida del TSOP no pulsa a 38kHz, es una salida de voltaje continua.

Te hice una imagen para que lo veas dibujado:



Y sobre lo que estás haciendo, seguramente ya visitaste estas páginas, así es como yo descubrí la existencia de esos modulos.

http://www.rentron.com/Micro-Bot/IR_Nav.htm
http://www.rentron.com/Micro-Bot/IR_Nav_Demo.htm

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Deteccion de pulsos infrarrojos
« Respuesta #7 en: 15 de Abril de 2006, 14:02:09 »
Si las conocia y muchas gracias por tu ayuda, cuando lo tenga todo terminado pondre un hilo en el subforo de robotica con mi diseño
Saludos desde Córdoba, españa


 

anything