# pic y lector codigo de barras



## SannMi (Ene 22, 2008)

Hola a todos

mi problema es el siguiente:
me gustaria hacer un lector de codigos de barras tipo pluma, con un sensor CNY70, controlado por un pic 16f84 o 16f876 (que no se si se podra hacer con estos pic´s ), y que despues me ataque a un lcd para que se pueda visualizar la información leida en vez de ir a un PC. 
Agradeceria algun tipo de ayuda porque estoy muy perdido gracias 

Salu2

PD. el codigo de barras es EAN-13 (30 barras negras y 29 blancas)


----------



## Saint_ (Ene 22, 2008)

hola que tal, seguro que se puede, pero lo importante es saber bien como funciona el sensor, el reto es sensillo. si das un poco mas de detalle del funcionamiento del sensor, te ayudaremos con gusto...


----------



## SannMi (Ene 23, 2008)

Saint_ dijo:
			
		

> ...si das un poco mas de detalle del funcionamiento del sensor...



No se si es esto a lo que te refiers pero intentare explicartelo lo mejor que pueda y que sé  

http://img165.imageshack.us/my.php?image=esquemacyn70zy8.png
este es el esquema del circuito con el sensor

al regular el sensor, R1 regula la radiacion infraroja que emite el fotodiodo. el problema es R2, ya que se trata de usar unvalor de R2 para leer un barra y otro para un espacio (R2 grande  para barras negras y R2 pequeña para los espacios Blancos) y esto se puede hacer con 2 R en paralelo y que ataque al pic.


----------



## Saint_ (Ene 23, 2008)

se que el sensor es un emisor y reseptor de luz y que cuando aparesen lineas blancas y lineas negras deberia tener 1 y 0 y eso entraria como datos al microcontrolador.

la pregunta del millones  es como piensas interpretar estos valores, como capturarlos 
ya que las lineas o barras son de distinto "grosor".
como distinguir de que grasor es la lines y luego como obtener su balor.

ademas esto de los codigos de barras estan normados y por lo que vi , el EAN 13, tiene 13 barras...  12 de uso para uso general y 1 como valor de validacion.


Saludos  

PD. Las preguntas que te hago  son para saber cuanto de dominio tiemes en lo que refiere a tu proyecto y cuales las ideas que tienes para realizarlo.


----------



## basanta79 (Ene 23, 2008)

No acabo de entender exactamente por que quieres cambiar de resistencia si lees espacios o si lees barras. La teoria dice que si hay una barra, ésta no refleja luz y por lo tanto el fototransistor no recibe luz, mientras que en un espacio se refleja luz por lo que es transistor estará en saturación. Si pones una resistencia de pull-down bien dimensionada el mismo transistor te varia.

Por otro lado lo de las dos resistencias en paralelo no lo veo claro y creo que te estas haciendo un lio. 

Por lo que respecta a los PIC's, en principio te sirve qualquiera que tenga un ADC y memoria sufieinte para tratar la señal.

Saludos


----------



## herlozano (Ene 23, 2008)

Tendrías que usar interrupción por flancos y detectar así el ancho de cada barra y al procesar vas a tener el código completo, esto suponiendo que la velocidad de desplazamiento de la pluma sea lo más constante posible. Espero que sirva.


----------



## heli (Ene 23, 2008)

El proceso se puede hacer así:
Una barra ancha o estrecha no refleja luz al fotodiodo, da un 0 (o un 1 al invertir).
Un espacio refleja luz al fotodiodo, da un 1 (un 0 al invertir).
Si el micro no tiene hardware específico para medir tiempos (capture-compare o similar) se usan las interrupciones.
Esta señal del fotodiodo se introduce en el micro por una pata que genera una interrupción.
Al saltar la interrupción el micro mide el tiempo que está la señal a nivel 1 y a nivel 0. Estos datos se almacenan en la memoria del micro sucesivamente, una pareja de datos por cada pareja barra-espacio. 
Suponiendo que la velocidad de escaneo ha sido homogénea en todo el código de barras se normalizan los datos, es decir se busca el más pequeño y se dividen todos los valores entre él.
Después de hacer esto los valores serán 1 para una barra estrecha, 2 para una el doble de ancha, 3 para una el triple etc. Ya solo falta decodificar estos valores según el tipo de código de barras que se quiere leer.
Por supuesto faltan cosas como la detección de lecturas espúreas o ruidos, detectcción del comienzo y final de lectura etc


----------



## basanta79 (Ene 24, 2008)

No es tan simple como parece. De hecho la senyal que sale del CNY70 no es discreta, si no que es continua. No tienes un tren de pulsos como te puedes imaginar.  Por lo tanto no te sirve lo de contar el tiempo a uno y el tiempo a 0.

Los códigos de barras normalemtne no son muy grandes por lo que puedes considerar la velocidad siempre igual.

Por lo tanto sigo recomendando ADC.


----------



## heli (Ene 24, 2008)

El CNY70 se conecta a un comparador analógico y un a un Smith-Trigger para escuadrar la señal, de forma que de un nivel determinado de luz para abajo es 0 y de otro nivel para arriba es 1.
Otra forma es usar un diferenciador para ver los flancos de la señal en los cambios claro-oscuro y oscuro-claro.


----------



## basanta79 (Ene 24, 2008)

El comparador y el Schmitt trigger no funcionará, no se puede establecer un nivel de tensión que sirva de referencia y trataré de explicarme:

Imaginate barras muy gordas entre espacios muy estrechos, esto provoca que el nivel de tensión sea muy pequeño y los espacios se convierten en pequeñas montañitas con picos muy bajos por que en general hay mas negro que blanco. Ahora imaginate espacios muy grandes con barras muy estrechas, esto provoca un nivel alto con valles muy altos, si lo pones dentro de un mismo código de barras obtienes como resultado que no puedes establecer un nivel de corte.

Personalmente creo que el comparador y el Schmitt trigger no funcionará, pero estaré encantadisimo de rectificar si se postea un esquema y unas gráficas de un código de barras a la entrada y a la salida de la etapa de adaptación.

En cambio la idea de un derivador que detecta los flancos es muy interesante, puede funcionar acompañada de un filtro y un amplificador. Personalmente, aunque es una solucion que funcionaria , no me convence por que acabas ajustando valores de condensadores y resistencias para unos determinados códigos de barras, es mas flexible un tratamiento digital.

SannMi. Yo montaria el esquema que has mandado en tu segundo post y pincharia un osciloscópio a ver que se vé. y si puedes postear las imágenes te lo agradeceria mucho asi todos aprenderiamos un poco sobre el tema el cual desconozco completamente. Asi podriamos opinar cada uno como trataria la imagen para obtener una señal legible de alguna forma.

Saludos


----------



## heli (Ene 25, 2008)

Error mío: supuse que el fotodiodo llebaba un sistema óptico que hacía que la luz recibida en el fotodiodo fuera SOLO una franja estrecha, de un ancho inferior a una línea de las mas finas que hubiera en el código de barras.
El área de detección de un CNY70 es demasiado ancha para un código de barras normal, se producirá el efecto que dice basanta79: el fotodiodo "verá" varias líneas a la vez. Es necesario usar un sistema óptico sobre el CNY70, una máscara de ranura o algo similar para que pueda trabajar correctamente con el Schmitt trigger.


----------



## SannMi (Ene 25, 2008)

Bueno ante todo muchas gracias por sus coments 
estuve investigando por google y encontre una pag bastant interesante
http://img525.imageshack.us/my.php?image=97290849dh1.png

cuando el lector lee una barra, el microcontroladorpone a nivel alto el pin24(entrada/salida) y deja en cortocircuito el transistor.R2 y R3 seconfiguran en paralelo, su valor disminuye y hace que el fototransistor del CNY70 trabaje en la zona lineal y diferencie los grosores de los espacios en blanco.
y cuando lee un espacio pasa  lo contrario, el microcontrolador pone el pin24 a nivel bajo y actua solo R2 que como es grande diferencia bien los grosores de las barras.

que opinan?

de todas formas voi a empezar a probar como medice basanta79 haber que sale  

PD. lo malo es que ese pic que utiliza ni le conozco ni le puedo usar pero creoque el 16F876 tiene  una conversor A/D


----------



## basanta79 (Ene 25, 2008)

SannMi dijo:
			
		

> Bueno ante todo muchas gracias por sus coments
> estuve investigando por google y encontre una pag bastant interesante
> 
> cuando el lector lee una barra, el microcontroladorpone a nivel alto el pin24(entrada/salida) [..]



Tengo una duda: ¿como le dices que estas leyendo una barra? ¿como lo detecta?. 




			
				SannMi dijo:
			
		

> [..] y deja en cortocircuito el transistor.R2 y R3 seconfiguran en paralelo, su valor disminuye y hace que el fototransistor del CNY70 trabaje en la zona lineal y diferencie los grosores de los espacios en blanco.[..]



Pero no estabas leyendo barras?



			
				SannMi dijo:
			
		

> [..] y cuando lee un espacio pasa  lo contrario, el microcontrolador pone el pin24 a nivel bajo y actua solo R2 que como es grande diferencia bien los grosores de las barras. [..]



Es muy probable que yo no acabe de entender lo que dices, pero estas hablado que cuando lees barras o espacios pones pines a nivel alto y a nivel bajo para leer los siguentes espacios o barras. Pero creo que te estas haciendo un lio.



			
				SannMi dijo:
			
		

> [..]de todas formas voi a empezar a probar como medice basanta79 haber que sale



Postea aqui la senyal que obtengas que tengo curiosidad y supongo que heli también, la solucion mecánica que planteas tiene buena pinta, ¿Crees que se tendria que amplificar la señal después del filtro mecánico?. 


Saludos


----------



## bondadoso (Oct 15, 2010)

que onda este proyecto esta chido, siempre se hizo o que onda?


----------

