Autor Tema: Matriz de LED como sensor táctil  (Leído 87108 veces)

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

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Matriz de LED como sensor táctil
« Respuesta #165 en: 28 de Abril de 2009, 15:33:53 »
simplemente IMPRESIONANTE!!! Me desperto muchisima curiosidad jeje. Q bueno q esta re  bien documentado :D en cuanto pueda me voy a poner a leer.
Muchas gracias por compartirlo jfmateos!!  :-/

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Matriz de LED como sensor táctil
« Respuesta #166 en: 28 de Abril de 2009, 17:16:08 »
Me encantó el Arcanoid, exelente  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Matriz de LED como sensor táctil
« Respuesta #167 en: 29 de Abril de 2009, 02:17:21 »
Por lo que se ve, este método es mucho más eficaz que el anterior, aunque he mirado el documento por encima y no me entero ni papa.
Además, no necesita que el led de al lado esté iluminado para detectar la presencia de la mano.

¿Son leds normales?

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Matriz de LED como sensor táctil
« Respuesta #168 en: 29 de Abril de 2009, 02:19:43 »
Sí es una matriz de LEDs normal y corriente, pues la detección no la hacen los LEDs, sino cuatro sensores de proximidad que hay debajo.
El problema de este sistema es, por un lado la complejidad, y por otro el espacio/volumen.

Desconectado Papalote

  • PIC10
  • *
  • Mensajes: 11
Re: Matriz de LED como sensor táctil
« Respuesta #169 en: 29 de Abril de 2009, 03:37:33 »
Mmm has probado usar solo un led comun y una rutina algo aso..

Prender el led por ej 100ms
Poner pin como entrada y medir la tension
y bueno mandar el dato al lcd a ver si funciona si llego a medir, para que esto funcione el pic y el conversor adc del pic deberian ir mas rapido que lo que tarda la lu en llegar al objeto (mano) y volver, por lo cual no creo que funcione pero kien sabe ejej


OTRA OPCION
Que pasa si como emisor de luz usamos u nled infrarrojo... asi no habria que tener nada prendido (a simple vista)
« Última modificación: 29 de Abril de 2009, 05:48:24 por Papalote »

Desconectado gomdryyy

  • PIC10
  • *
  • Mensajes: 15
Re: Matriz de LED como sensor táctil
« Respuesta #170 en: 12 de Mayo de 2009, 21:05:52 »
Buenas amigos!!! Disculpen q me retrotraiga tanto, es q recien tengo tiempo a ponerme a armar esto y me pasaron un par de cosas algo
extrañas. Arme el ejemplo q dio gomdryyy una pagina antes.
La primera cosa rara q paso es q el ejemplo no anduvo usando el puerto B del pic16f84a, pero cuando use el puerto A si anduvo. Lo segundo es q la sensibilidad del "sensor" aumenta notablemente cuando el circuito esta conectado al programador. Y por ultimo... sin querer quite el led q hace de sensor, y el circuito seguia funcionando!!! Cuando le acerco el dedo a la resistencia q va en serie con el led, en circuito sensa. Debe ser q hay un ruido barbaro, y entre capacidades y todo eso...
En fin, es muy raro, aunq no es el comportamiento q me gustaria q tenga. Sugerencias?
Gracias!!!
[/glow]


Estimado gera disculpa por el retrazo, pues como ya dije programo solo de vez en cuando, bueno en base a lo que mencionas es cierto despues de probar el circuito, conclui que recibe un ruido extraordinario, pues como tu mencionas al quitar el led-sensor sigue funcionando, e incluso en la oscuridad, sensa hasta un metro a la redonda sea que si por error acercar la mano la detecta. asi que deseche esta forma de programacion, pues cambie el tiempo de encendido y nada aun sigue con mucho ruido, te agradesco por tomar en cuenta este aporte.





por otra parte estaba revisando el post y me di cuenta que al igual que ami a muchos de nosotros dejamos o quitamos los componentes y precisamente los colocamos al revez  enfin, asi que tambien me di cuenta de que  la luz que incidia en el led sin polarizarlo genera un milivoltaje  y dije hoooo, creo que esto se puede utilizar.

despues de ver lo que proponia ekud, pues me puse a trabajar y bueno efectivamente es mas estable en cuanto a las variaciones ya no las tengo, y funciona de maravilla.

solo que me paso otro proble, ya saben que en la noche es mas inestable, pues para que viera el comportamiento abilite la cominucacion rs232, para verlo en la compu, me preguntaran por que , simplemente por que no tenia una lcd,  bueno en fin sucede que en la noche en lugar de incrementar decrementa la deteccion como lo leen decrementaaa, asi que bueno lo unico que hice fue poner esa variacion tambien y asunto arreglado ya funciona en el dia y en la oscuridad total, 100% comprobado.

 gracias a todos los que aportan pues uno se da mas ideaaaaaaaa, luego cuelgo el codigo, por que ahora estoy en eltrabajo, 
saludos y hasta la proximaaaaaa

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Matriz de LED como sensor táctil
« Respuesta #171 en: 12 de Mayo de 2009, 22:04:26 »
Grande gomdryyy!! :-/
Q buena noticia, porq me habia resignado con este tema jaja. Espero ansioso el codigo a ver q tal.
saludos y gracias por el aporte!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado gomdryyy

  • PIC10
  • *
  • Mensajes: 15
Re: Matriz de LED como sensor táctil
« Respuesta #172 en: 13 de Mayo de 2009, 12:19:37 »

ok camaradas, pues lo prometido es deuda el codigo que realize en base al codigo que proporciono ekud, pues como les comentaba encontre que en la noche la deteccion decrementa en vez de incrementar, bueno lo pongo a su consideracion y sugerencias, cabe mencionar que este programa es para una alarma de fallo de energia, la cual se puede apagar con la deteccion de nuestro dedo.

Código: [Seleccionar]
#include <12F675.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                        //Resistor/Capacitor Osc with CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPUT                    //No Power Up Timer
#FUSES BROWNOUT                 //Reset when brownout detected

#use delay(clock=4000000,RESTART_WDT)
#use rs232(baud=9600,xmit=pin_A4)
#byte TRISIO = 0x85
#bit sali = 05.5
int i,j,t,promedio;
int contador = 0;
byte flag=0,var1=3;         //variables para menu configurar
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER1
void interrupcion()
{
   if(flag>var1){      //¿ya es 130ms aprox?
      var1--;         //SI -> decremento var...       
      if(var1==0)
         var1=2;      //...ajuste fino de 130ms aprox
      flag=0;         //reset flag para contar 130ms aprox             
      sali=!sali;
      contador = contador +1;
   }       
   set_timer1(0);      //reset TMR0
   flag++;            //incremento variable flag
}
void main()

   setup_port_a(AN1_ANALOG);
   SETUP_ADC(ADC_CLOCK_DIV_16);
   set_adc_channel(1);
   enable_interrupts(INT_TIMER1);            //interrupcion TIMER0 activada
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(0);                        //carga TMR0
   enable_interrupts(GLOBAL);               //activadas interrupciones   

   // TODO: USER CODE!!
output_low(PIN_A5);
output_high(PIN_A2);
printf("\fEstabilizando...");
delay_ms(1000);
promedio = j = 0;
    for (i=1;i<=10;++i){
        promedio = promedio+read_adc();
        Delay_ms(20);
        }
    promedio = promedio / 10;
Delay_ms(50);
   while(true)
    {
    t = i = 0;
    for (i=1;i<=10;++i){
        t = t+read_adc();
        Delay_ms(20);
        }
    t = t/10;   
    Delay_ms(10);   
    printf("\fPROMEDIO= %d   Detectado= %d",promedio,t); 
    if (t >= (promedio + 7)){ ///Respues a deteccion en el dia   
          output_high(PIN_A0);
          output_low(PIN_A1);
          output_low(PIN_A2);
          output_low(PIN_A4);
          output_low(PIN_A5);
       delay_cycles(1);//nop
       sleep();       
       delay_cycles(1);//nop
         }
   else if (t <= (promedio - 7)){ ///Respuesta a deteccion en oscuridad     
          output_high(PIN_A0);
          output_low(PIN_A1);
          output_low(PIN_A2);
          output_low(PIN_A4);
          output_low(PIN_A5);
       delay_cycles(1);//nop
       sleep();       
       delay_cycles(1);//nop 
         }
    else  {output_low(PIN_A0);}
       if (contador == 150){// Fin de la alarmaaaaaaaaaaaa
       output_high(PIN_A0);
       output_low(PIN_A1);
       output_low(PIN_A2);
       output_low(PIN_A4);
       output_low(PIN_A5);
       delay_cycles(1);//nop
       sleep();       
       delay_cycles(1);//nop   
       }
       t =0;
       Delay_ms(5);
}//fin infinito
}//fin de main

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Matriz de LED como sensor táctil
« Respuesta #173 en: 05 de Junio de 2009, 01:49:49 »
En este otro proyecto (http://www.xelapond.com/blog/?p=323) utilizan fotodiodos, pero lo más curioso es que los acompañan de LEDs IR, de modo que en cada fotodiodo se toman dos medidas, una con el LED IR encendido y otra con él apagado, se restan ambas para eliminar la contribución IR y parece que esto logra que el sistema sea inmune al estado de iluminación ambiental.


También tiene muy buena pinta el libro gratuito que ofrece el Nui group sobre sistemas multi-táctiles: http://nuicode.com/projects/wiki-book/files

« Última modificación: 05 de Junio de 2009, 01:56:43 por jfmateos2 »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Matriz de LED como sensor táctil
« Respuesta #174 en: 25 de Septiembre de 2009, 14:08:40 »
Ando peleando con un par de leds buscando hacer un sensor con led, pero no consigo ningún resultado.

Básicamente estoy probando con el método que se ha descrito más abajo:
- polarizo ánodo=1 y cátodo=0
- espero
- polarizo ánodo=0 y cátodo=1
- espero
- pongo el cátodo como entrada
- y mientras sea 1 incremento un contador

Pero no consigo ningún resultado porque el cátodo se mantiene a 1 durante todo el tiempo y no se descarga.

¿Sabéis dónde estoy fallando?, ¿hay que poner resistencias limitadoras o el led va directo a los pines?

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Matriz de LED como sensor táctil
« Respuesta #175 en: 25 de Septiembre de 2009, 15:33:59 »
¡Qué raro!
Yo sí uso una resistencia limitadora en el ánodo, y el cátodo lo leo directamente con el conversor ADC del PIC.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Matriz de LED como sensor táctil
« Respuesta #176 en: 26 de Septiembre de 2009, 03:29:45 »
Pues ahora lo he intentado con el ADC y tampoco consigo que funcione bien. Las lecturas del ADC son aleatorias, unas veces muy altas y otras veces muy bajas. :(

Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Matriz de LED como sensor táctil
« Respuesta #177 en: 26 de Septiembre de 2009, 04:41:17 »
A mí me funcionaba tanto con el ADC como poniendo el pin del cátodo en entrada y midiendo cuánto tiempo permanecía en alto.

¿Qué tipo de LED estás usando? En mis pruebas obtuve los mejores resultados con LEDs rojos de alta luminosidad.

Revisando mi código (que utiliza el ADC pero en el que también está comentada/deshabilitada al final del código la sección que usaba el pin como entrada) he visto que hice pruebas tomando 15 medidas consecutivas del ADC y calculando la media o simplemente quedándome con el valor mínimo de todas ellas (creo recordar que hice esto porque había fluctuaciones en la lectura del ADC), y finalmente me quedé con el valor mínimo.

Código: [Seleccionar]
//// ledSensor.c                                                     ////
////                                                                 ////
//// Autor: jfmateos2                                                ////
//// Contacto: jfmateos@lycos.es                                     ////
//// Madrid, febrero 2008                                            ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN, CCP2C1
#device ADC=10
#use delay(clock=48000000)
#include ".\include\usb_cdc.h"



#define catodo0 PIN_A0
#define catodo1 PIN_A1
#define catodo2 PIN_A2
#define catodo3 PIN_A3
#define catodo4 PIN_A4
#define anodo0 PIN_B4
#define anodo1 PIN_B3
#define anodo2 PIN_B2
#define anodo3 PIN_B1
#define anodo4 PIN_B0

int1 conversorOcupado=0;

#INT_AD
void ad_handler(){
   conversorOcupado=0;
}
//ADC
void main(){
   int  i,maximo,intervalo,umbral,cuantizado;
   int32 lecturas, minimo, media;
   int32 valor, lectura[20];   
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}

   setup_adc(ADC_CLOCK_DIV_64 );   
   set_adc_channel(0);   
   setup_adc_ports(AN0); 
   enable_interrupts(INT_AD);   
   clear_interrupt(INT_AD);   
   output_bit(catodo0,1);   
   output_bit(anodo0,0);
   output_bit(anodo1,0);
   output_bit(anodo2,0);
   output_bit(anodo3,0);
   output_bit(anodo4,0);
   umbral=120;
   intervalo=19;
   do{
      set_tris_b(27);
      set_tris_a(1);
           
      minimo=1024;
      media=0;
      //maximo=0;     
      for(i=0;i<15;i++){
         conversorOcupado=1;
         read_adc(ADC_START_ONLY);   
         while(conversorOcupado){
         }         
         valor = read_adc(ADC_READ_ONLY);
         if(valor<minimo){
            minimo=valor;
         }           
      }
      cuantizado=0;
      for(i=1;i<=18;i++){
         if(minimo>((int32)((int32)intervalo*(int32)i))){
            cuantizado=i;           
         }
      }
      output_bit(catodo0,0);     
      output_bit(anodo0,1);
      output_bit(anodo1,1);
      output_bit(anodo2,1);
      output_bit(anodo3,1);
      output_bit(anodo4,1);   
     
      usb_task();
      if (usb_enumerated()) {                 
            //printf(usb_cdc_putc, "%u %Lu", cuantizado, minimo);       
            printf(usb_cdc_putc, " %c",cuantizado);       
            //printf(usb_cdc_putc, "\n\r");       
         
      }
      delay_ms(20);
      output_bit(catodo0,1);     
      output_bit(anodo0,0);
      output_bit(anodo1,0);
      output_bit(anodo2,0);
      output_bit(anodo3,0);
      output_bit(anodo4,0);
   }while(true);
}
/*
//Contabilizar estado alto
void main(){
   int32 lecturas;
   usb_cdc_init();
   usb_init();
   while(!usb_cdc_connected()) {}
      output_bit(catodo0,1);
      output_bit(catodo1,1);
      output_bit(catodo2,1);
      output_bit(catodo3,1);
      output_bit(catodo4,1);
      output_bit(anodo0,0);
      output_bit(anodo1,0);
      output_bit(anodo2,0);
      output_bit(anodo3,0);
      output_bit(anodo4,0);
   do{
      lecturas=0;
      set_tris_b(27);
      set_tris_a(31);
      while (input(catodo2)){
         lecturas++;
      }
      usb_task();
      if (usb_enumerated()) {                 
               printf(usb_cdc_putc, "Lecturas= %Lu ", lecturas);       
               printf(usb_cdc_putc, "\n\r");         
      }   
      output_bit(catodo0,1);
      output_bit(catodo1,1);
      output_bit(catodo2,1);
      output_bit(catodo3,1);
      output_bit(catodo4,1);
      output_bit(anodo0,0);
      output_bit(anodo1,0);
      output_bit(anodo2,0);
      output_bit(anodo3,0);
      output_bit(anodo4,0);
      delay_ms(100);
   } while(true);
}*/


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18269
    • MicroPIC
Re: Matriz de LED como sensor táctil
« Respuesta #178 en: 26 de Septiembre de 2009, 08:32:21 »
Al final resultó que el PIC tenía jodido el ADC, caguen la puta.

He cambiado de micro y ya veo cómo el led va respondiendo a la luz. Lo que pasa es que no consigo un resultado muy satisfactorio: poniéndole al lado un led blanco de alta luminosidad de esos que te deja ciego, la diferencia entre la lectura con el dedo y la lectura si en el dedo es de 2, teniendo el ADC configurado a 8 bits.

He probado a cambiar los delays, a leer el mínimo o la media, y hasta distintos tipos de leds, pero no consigo el resultado que he visto en vuestros vídeos.

Dejo el código por si veis algo raro; he fusilado el tuyo Juanfe.

Código: C
  1. while (TRUE) {
  2.       output_high(anodo);   output_low(catodo);
  3.       delay_us(1000);
  4.       output_high(catodo);   output_low(anodo);
  5.       delay_us(1000);
  6.       output_float(catodo);
  7.  
  8.       contador=255;
  9.       for (i=0;i<16;i++) {
  10.          conversorOcupado=1;
  11.          read_adc(ADC_START_ONLY);
  12.          while(conversorOcupado);
  13.          
  14.          valor= read_adc(ADC_READ_ONLY);
  15.          if (valor<contador) contador=valor;
  16.          
  17.       }
  18.       usb_task();  
  19.       if (usb_enumerated())
  20.          printf(usb_cdc_putc, " %Lu",contador);
  21.       delay_ms(100);
  22.      
  23.    }


Desconectado jfmateos2

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3145
Re: Matriz de LED como sensor táctil
« Respuesta #179 en: 26 de Septiembre de 2009, 09:37:57 »
Algunas consideraciones:

1. El LED que ilumina y el que "siente" deben ser idénticos. Este fenómeno es más sensible a la misma longitud de onda. Si usas LEDs distintos apenas verás diferencias, que es lo que te ocurre a ti, pero en este caso la lectura con el dedo debería ser menor que la lectura con el dedo.

2. Si pones el dedo muy cerca del LED (o pegado a él) es posible que no se reciba luz del LED iluminador y que la diferencia entre poner el dedo y no hacerlo sea muy baja, como te está ocurriendo a ti, pero si éste fuera tu caso la lectura con el dedo puesto debería ser mayor que la lectura sin el dedo. En tu mensaje no indicas si te sale mayor o menor.

3. Es posible que tus LEDs sean muy sensibles... prueba a tomar 8 medidas consecutivas del ADC en lugar de 16.

¿La lectura con el dedo puesto te sale mayor o menor que sin él puesto?