LDR + Led RGB = Sensor de color. ¿Cómo calibrarlo?

1 $ sensor de color.

Mis aventuras en la electrónica continúan. Mientras hablaba con un amigo sobre los colores, me habló de los sensores de color. Más tarde me acordé del video donde ordenan los smarties y por eso quise saber más. Viendo unos videos encontré uno con un led LDR y uno RGB. Dicen que no es preciso. Mirando las diversas versiones de esos sensores, supongo que parte de los problemas son el caso que mantiene todo unido. La mayoría tienen mucho espacio entre el LDR y la superficie de color, algunos tienen los leds delante del LDR... que no pueden funcionar.

  1. No debe haber otra fuente de luz que el led RGB. Coloque el LED LDR y RGB dentro de un tubo pequeño, el interior debe ser negro. No pude encontrar un tubo hecho de este material . así que tomé una pluma gruesa.
  2. Se debe evitar la iluminación directa del rgb. Para obtener un buen color homogéneo, coloco una pieza de plástico blanco semitransparente frente al Led.

  3. El LDR solo debe recibir la luz reflejada. Coloque el sensor encima del plástico blanco. ¡La luz debe estar detrás del LDR!.

  4. No puede funcionar para todo. Puede usarlo solo para superficies específicas. Por ejemplo, uso papel fotográfico brillante. Opaco probablemente sería mejor. pero tenía algo de papel fotográfico en la impresora, así que imprimí una paleta de colores y una paleta en blanco y negro.

  5. Necesita saber más sobre Led y LDR. Ese es básicamente el problema. El rojo, el verde y el azul que emite el led no son 100% rojo, verde y azul. El LDR no puede absorber todos los colores a la perfección.

Sin buscar otros códigos, conecté este lápiz con sensor de color al arduino... y medí cuánto tiempo necesita para encender los distintos colores. Terminé con 50 ms para cada color. Hecho eso, solo dejo que el LDR imprima algunos valores en la pantalla. Blanco y negro... ¿cuánto rango tengo de negro a blanco? Escribí un código donde autocalibra el blanco y negro. Básicamente, medí la absorción de luz en el papel fotográfico en blanco y negro previamente impreso. De hecho, me impresionó cuánto alcance podría tener. Del rango total de 1023 disponibles en el arduino, elegí un negro de alrededor de 30-50 en todos los colores y un blanco de alrededor de 700. Eso significa que el sensor de color tiene una precisión teórica de, digamos un rango promedio de 650 en cada color, 650*650*650 =274.625.000, alrededor de 270 millones de colores. Eso es mucho...rgb tiene 16 millones de colores. Personalmente conozco unos 5-6 colores. En ese momento comencé a probar. para que sea sencillo coloqué otro led rgb en la placa y una caseta de plástico blanco en el led. Los colores aparecían ya similares pero con mucha luminosidad. También en superficies oscuras encendí el led. Luego reduje el rango a aproximadamente un 10 % en la parte inferior y un 10 % en la parte superior. Y guau... el color se ve igual. Pero veamos los números. Imprimir los valores rgb en la pantalla dio números diferentes a los que medí... pero abrir un selector de color rgb en la pantalla y mostrarlo... mostró aproximadamente el color correcto... así que en realidad fue muy correcto. Incluso si mi impresora es una fotoimpresora no significa que los colores se impriman correctamente. Nunca calibré una impresora o un monitor... Entonces puede haber una gran diferencia. Así que traté de calibrar los distintos colores según la paleta impresa. Encendí la luz roja y disminuí el rango de verde y azul a 0 mientras estaba en rojo... lo mismo para verde y azul. Finalmente encontré los problemas reales. El rojo es casi perfecto. El azul está ligeramente desplazado hacia el rojo. ¿El green no tiene suficiente luz? Cuando estoy en verde, necesito poner los niveles de rojo y azul muy bajos. Pero hacer eso reduce mucho la precisión. Obtengo rojo perfecto (255,0,0), azul (0,0,255), verde (0,255,0), amarillo (255,255,0), fucsia (255,0,255), aguamarina (0,255,255). el rango de cada color se reduce tanto que al final probablemente solo pueda medir alrededor de 10-15 colores principales. ¿El green no tiene suficiente luz? Cuando estoy en verde, necesito poner los niveles de rojo y azul muy bajos. Pero hacer eso reduce mucho la precisión. Obtengo rojo perfecto (255,0,0), azul (0,0,255), verde (0,255,0), amarillo (255,255,0), fucsia (255,0,255), aguamarina (0,255,255). el rango de cada color se reduce tanto que al final probablemente solo pueda medir alrededor de 10-15 colores principales. ¿El green no tiene suficiente luz? Cuando estoy en verde, necesito poner los niveles de rojo y azul muy bajos. Pero hacer eso reduce mucho la precisión. Obtengo rojo perfecto (255,0,0), azul (0,0,255), verde (0,255,0), amarillo (255,255,0), fucsia (255,0,255), aguamarina (0,255,255). el rango de cada color se reduce tanto que al final probablemente solo pueda medir alrededor de 10-15 colores principales.

¿Cómo podría calibrar un sensor de color de 1 $?

  1. Cada color de LED se desplaza ligeramente.

  2. El verde no emite suficiente luz.

  3. Mi impresora no imprimió los colores correctos.

  4. El LDR no lee todos los colores correctamente (longitud de onda, luz...)

Creo que en algún lugar hay un cálculo matemático que permite el cambio virtual de cada color.

Publiqué esto aquí porque es una gran pregunta que necesita los conceptos básicos de ingeniería electrónica. Si bien creo que la mayoría de los problemas podrían resolverse con una función matemática compleja, podría estar equivocado y resolver el problema con una simple atenuación del LED, agregando más LED, tal vez filtrando la fuente de luz o simplemente moviendo el sensor hacia arriba o hacia abajo dentro del tubo. que tal solo cambiando las resistencias?. En todos los casos se necesita un ingeniero electrónico. La forma en que los LED emiten la luz y el sensor la absorbe tiene que ver con la longitud de onda individual... no soy ingeniero electrónico.

Creo que también vale la pena preguntar por el hecho de que los sensores de color normalmente no son tan baratos.

LED RGB: LL0548RGB

LDR: FW300

Clip corto que muestra el sensor

¿Puedes hacer tu pregunta más concisa? Por cierto, ¿ha mirado la hoja de datos de LED y LDR? La hoja de datos de LED tendrá la longitud de onda de cada componente R, G y B y la hoja de datos de LDR tendrá su respuesta espectral.
si exactamente eso!! No sé cómo aplicar esos valores.
en los leds solo necesito el nm... verdad? no el mcd. Por otro lado, el LDR no tiene mucha información en la hoja de datos
además, los leds no tienen la mejor información... por ejemplo, ¿cuál es el mejor voltaje para cada color? dice solo 2.1 a 3.2. por lo que también es difícil decidir cuál es la resistencia adecuada... normalmente r = 2,1 g= 3,1 b= 3,2
Para no arruinar su desfile, pero los sensores de color se han vuelto muy baratos en estos días.
@Spehro Pefhany, lol seguro... siempre depende de qué tan precisos sean y qué tan fácil puedas calibrarlos
Un sensor de color que compre casi automáticamente será mejor que cualquier cosa que improvisa.

Respuestas (2)

Está intentando asignar un triplete de valores (las respuestas del LDR a sus LED RGB) a otro triplete (los valores RGB que usó para imprimir los colores en el papel). Hay muchos valores ambientales que influirán en este mapeo. En mi opinión, lo mejor que puedes hacer es

  • Asegúrese de que cada LED proporcione un efecto decente y comparable. Dependiendo de sus LED y la sensibilidad de su LDR a los distintos colores, esto podría significar que debe usar diferentes corrientes (resistencias en serie) para los LED.

  • Establezca los valores de calibración para sus colores (como lo ha hecho) y utilícelos para 'linealizar' los valores R, G y B.

  • Limite los efectos externos al mínimo. (Parece que has hecho esto)

Yo uso exactamente esto como un ejercicio para mis alumnos. Tengo reputación de no ser fácil con mis alumnos. Aprueban cuando pueden distinguir de manera confiable 3 colores :) Una hoja de esa tarea:

ingrese la descripción de la imagen aquí

Gracias por su respuesta, ¿entonces dice que si cambio las resistencias obtengo diferentes tonalidades rgb? eso es un comienzo Por lo demás, creo que la construcción que se muestra en la imagen tiene muchos más problemas ambientales que el tubo que uso. Por cierto, como dije, no soy ingeniero electrónico. Y al decirme que 'linealice' los valores R, G y B, los problemas no se resuelven. "Asegúrese de que cada LED proporcione un efecto decente y comparable" igual que el anterior ... ¿CÓMO?
como dije obtuve muy buenos resultados de negro a blanco 60-70 % del máximo. el rojo, el verde y el azul no están calibrados... también creo que al final se necesita usar una curva para mezclar los colores perfectamente... así que nada lineal hasta que no haya un rojo, verde y azul perfectos.
@geometrikal habló sobre la respuesta espectral y la longitud de onda de los colores individuales... eso es algo que hablando de manera más realista podría marcar la diferencia.

1) En realidad, no necesita saber los voltajes exactos para cada color. Simplemente elija un conjunto práctico de números y quédese con él. Lo más probable es que esté utilizando un solo voltaje para los 3 LED, con una resistencia diferente para cada color. No tienes que usar la misma resistencia para cada LED. En particular, puede usar una resistencia más pequeña en el verde para obtener más brillo. ¿Cuán pequeño? Eso dependerá del LED, y DEBE aprender a calcular la relación entre voltaje, corriente y resistencia. Se llama Ley de Ohm, y esta respuesta no es el lugar para comenzar a enseñarla.

2) Tampoco necesita saber la respuesta exacta para el LDR. Todo lo que necesita saber es la respuesta relativa para diferentes niveles de luz de cada color. Puedes hacer esto calibrando tus respuestas. Ya que estás usando un Arduino, no solo enciendas y apagues los 3 LED, como lo estás haciendo ahora. En su lugar, PWM para obtener diferentes niveles de luz y use un objetivo blanco "estándar" (es estándar porque usted dice que lo es, es SU estándar). Conduzca los LED con diferentes niveles de luz, igual al ciclo de trabajo PWM, y registre la salida LDR. Los LDR son bastante lentos. Recomiendo aumentar el tiempo de encendido para cada color a 0,1 segundo y tomar la lectura de LDR al final de ese tiempo. A partir de esto, puede configurar una tabla de cuánta luz en un color dado corresponde a cada lectura de LDR.

3) Puede usar su LDR para calibrar sus LED de salida. Encienda el LED de salida en su LDR (asegurándose de mantener la luz ambiental fuera con una funda alrededor de ellos). Lleve los LED de salida a diferentes niveles y registre la salida LDR. Puede usar esto para compensar la salida de modo que para una lectura de LDR de sensor dada, obtenga la misma lectura cuando el LDR está mirando la salida.

4) Finalmente, nunca puede obtener una respuesta perfecta en el mundo real, especialmente con su configuración. Considere lo que sucedería si su muestra de color fuera un amarillo puro. Refleja solo amarillo, por lo que no responderá a ninguno de sus tres LED y el sensor informará que es negro. En este caso, es bueno que sus LED no sean de colores puros y que muy pocos materiales reales tengan una reflectancia de color súper pura. Por lo que vale, el ojo humano tampoco tiene receptores de color extremadamente selectivos. Desde http://en.wikipedia.org/wiki/Color_visioningrese la descripción de la imagen aquí puede ver que hay mucha superposición de color entre los tres tipos de receptores. Y para hacer la vida más interesante, hay algunos colores que simplemente no se pueden reproducir con LED de 3 colores, por ejemplo, marrón.

bueno... obtenga +1 por la buena respuesta larga... 1. led.linear1.org/1led.wiz Lo usé e hice otro para calcular los ohmios con mayor precisión para poder mezclar varias resistencias para obtener el máximo... yo mida esos valores con mi multimeter.2.pwm sí, podría usar los pines de 980 hz en el verde y el azul para tener más juegos. pero esto también implica más lecturas. Con simple alto bajo obtengo un valor muy estable después de 3 lecturas. con pwm... no sé... vale la pena intentarlo te lo diré los próximos días.3. el tubo es bastante insensible a los ambientes externos. la luz está bien atenuada y los valores se mantienen precisos.
Calibre la luminosidad con el ldr... pero como saben la tonalidad es incorrecta. 4. Naturalmente, no puede ser perfecto, pero creo que teniendo en cuenta el rango alto dado de negro a blanco, tengo buenas posibilidades de generar miles de colores si puedo calibrar el rojo, el verde y el azul correctamente. Pruebo esto en los próximos días... con pwm y resistencias. luego le doy un vistazo a esas curvas de espectro...
@cocco "sí, podría usar los pines de 980 Hz en el verde y el azul para tener más juegos, pero esto también implica más lecturas". Primero, debe hacerlo en los 3 LED. En segundo lugar, sí, toma más lecturas, pero solo debe tomarlas una vez, durante la calibración. De hecho, podrías escribir un programa para hacerlo automáticamente mientras haces otra cosa.
arduino tiene solo 2 pines de 980 hz ... podría multiplicar los 480 hz, pero el rojo ya parece ser el más correcto. 50 ms para encender el LED por completo, también 50 Hz serían suficientes para obtener una luz atenuada legible. los pines usan diferentes temporizadores... ¡y algunos de ellos se usan para medir el tiempo! milis(); es mejor dejarlos como están.
"ya que se necesitan 50 ms para encender completamente el led, también 50 hz serían suficientes". Equivocado en varios puntos. El LED se encenderá en un microsegundo o menos. 50 mseg es equivalente a 20 Hz. Y es la respuesta LDR la que es el limitador. Si está midiendo la resistencia a más del 1% del rango disponible, 50 milisegundos es casi seguro que no es suficiente tiempo.
correcto.. de todos modos leyendo el LDR 100 veces o 10 obtengo valores estables (más de 700) solo si enciendo el led y espero 50ms... incluso si espero 300ms 1000ms no obtengo más... estoy obteniendo 700 de 1023 max y eso ya es alto considerando el plástico blanco que atenúa el led. si apunto el sensor a una superficie negra obtengo alrededor de 40... así que tengo un rango del 63% de los valores máximos. Y todo ello con un color fuerte... no sólo brillo. Pero dame algo de tiempo para probar el PWM y las distintas resistencias. Espero poder de alguna manera cambiar un poco las tonalidades.
convertir la respuesta LDR individual a hsb/hsl permitiría cambiar fácilmente el color simplemente cambiando el tono. Pero creo que sería demasiado fácil ¿cómo lo creo? siempre está invertida. Rojo sobre rojo debe ser blanco. Eso significa que necesito cambiar el azul y el verde para obtener un rojo correcto...
"Considere lo que sucedería si su muestra de color fuera un amarillo puro" el punto que está invertido es exactamente por qué el amarillo funciona muy bien... incluso con el rango más alto, tanto el rojo como el verde me dan altos niveles de blanco. Mientras que el azul devuelve básicamente un reflejo de luz muy bajo. Y eso es bueno. Esto en el otro lado me hace pensar que probablemente necesito más leds atenuados para obtener un color aún más fuerte para el led verde ... Dicho esto, el rojo da valores ligeramente más bajos antes de calibrar (es el más tenue) ... es el más fuerte color.
teniendo la autocalibración (alta/baja) configurada en Rojo l:177 h:539 Verde l:265 h:637 Azul l:272 h:613 , por lo que al agregar el 10% del rango en ambos lados... si pongo el LDR en el amarillo obtengo rgb (255,255,3); los otros colores, especialmente las tonalidades verdes, dan valores más altos de rojo y azul como deberían... en parte, también podría ser un problema para la impresora, ya que la parte verde de la paleta en realidad no se ve tan diferente en cada cuadrado... tal vez. El azul también me da valores ligeramente más bajos con solo equilibrar el negro con el blanco. debería ser (0,0,255) pero me da (0,50,190).
disminuir esto aún más significa más precisión en una paleta más pequeña pero detecta menos colores. es por eso que necesito cambiar de alguna manera los colores. Y tal vez eso solo sea posible virtualmente. saber más sobre la respuesta espectral y la longitud de onda ayudaría mucho. Además, una paleta de colores impresa por un estudio fotográfico profesional facilitaría las cosas.
así que ** eliminando el 10% del rango en ambos lados