TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: camilo1 en 24 de Abril de 2017, 17:37:13

Título: Calibración de sensor de color TCS3200 (arduino)
Publicado por: camilo1 en 24 de Abril de 2017, 17:37:13
Un saludo. Me gustaría saber como modificar el siguiente código para que el sensor de color TCS3200 detecte también el color amarillo y no genere ningún tipo de señal con cualquier otro color que no sea el amarillo, el azul, el rojo y el verde.
también agradecería si alguien me puede explicar como calibrar este sensor. Gracias


const int s0 = 1; 
const int s1 = 2; 
const int s2 = 3; 
const int s3 = 4; 
const int out = 5;   
int rojo = 0; 
int verde = 0; 
int azul = 0; 
 
void setup(){ 
  Serial.begin(9600);
  pinMode(s0,OUTPUT); 
  pinMode(s1,OUTPUT); 
  pinMode(s2,OUTPUT); 
  pinMode(s3,OUTPUT); 
  pinMode(out,INPUT);   
  digitalWrite(s0,HIGH); 
  digitalWrite(s1,HIGH); 

 
   
void loop(){ 
  color();
  Serial.print("   "); 
  Serial.print(rojo, DEC); 
  Serial.print("   "); 
  Serial.print(verde, DEC); 
  Serial.print("   "); 
  Serial.print(azul, DEC); 
 
  if (rojo < azul $$ verde > azul && rojo < 35)
  { 
   Serial.println("   Rojo");   
  }   
  else if (azul < rojo $$ azul < verde $$ verde < rojo) 
  { 
   Serial.println("   Azul");       
  } 
 
  else if (rojo > verde $$ azul > verde ) 
  { 
   Serial.println("   Verde");       
  } 
  else{
  Serial.println("  "); 
  }
  delay(900);     
  } 
     
void color() 
{   
  digitalWrite(s2, LOW); 
  digitalWrite(s3, LOW);   
  rojo = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); 
  digitalWrite(s3, HIGH);   
  azul = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); 
  digitalWrite(s2, HIGH);   
  verde = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); 
}
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: xocas en 26 de Abril de 2017, 12:57:55

No indicas si tu intención es detectar el color procedente de una fuente de luz directa o el color reflejado por un objeto iluminado con luz blanca. Si es el primer caso puedes manejar directamente los valores RGB dados por los sensores y en el segundo tendrás un mejor resultado si usas el modo HSL.

El TCS3200 consta de una matriz de 64 fotodiodos filtrados por color en tres grupos de 16 (R, G, B) + un cuarto grupo sin filtro. No se puede realizar la lectura de más de un grupo de cada vez, de manera que para determinar un color tenemos que indicar en el programa que vaya leyendo uno a uno y a partir de ahí, y en base a los valores obtenidos, determinar el color.
Siempre obtendrás un valor de respuesta, siempre 'genera algún tipo de señal', así que tendrás que configurar el programa para que actúe solamente en los casos que te interesan.

El color amarillo es (en RGB) la combinación de luz roja y verde (R=255, G=255, B=0) y esto se aplicaría también a la lectura de dichos grupos en el sensor. Es decir, podrás determinar que un color es amarillo a partir de los valores leídos en los grupos RGB.

Estuve jugando hace tiempo con este sensor y por lo general da buen resultado con una fuente de luz u objetos de colores primarios y a corta distancia, pero tiene sus 'cosillas' y no sería mi elección para un trabajo serio.

Dale un ojo a este vídeo y comenta acerca del uso que piensas darle para concretar un poco más.


un saludo
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: camilo1 en 26 de Abril de 2017, 21:52:42
mi intención es utilizar este sensor para detectar el color de objetos sólidos (color reflejado por un objeto iluminado con luz blanca). ¿que otro sensor o que otro método podría utilizar para para identificar los colores de estos objetos?.
Gracias
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: xocas en 27 de Abril de 2017, 13:12:37
Le daré un ojo a los backups a ver si hay suerte y encuentro el código que usé en su día, pero no te garantizo nada porque era más un juego que otra cosa.

Recuerdo que para obtener buenos resultados la distancia al objeto tiene que ser muy corta y hay que evitar otra luz sobre el sensor que no sea la rebotada por el objeto.

Si encuentro algo te comento...
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: camilo1 en 27 de Abril de 2017, 16:17:43
ya logre solucionar el problema, después de muchas pruebas y unas cuantas horas de lectura, logre comprender por completo el funcionamiento de este sensor, puedo decir que este sensor da buenos resultados si el objeto esta a una distancia de aproximadamente un centímetro, si se mantiene siempre la misma distancia entre el sensor y el objeto y si se reduce al mínimo la luz externa. Gracias por atender este tema.
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: manwenwe en 27 de Abril de 2017, 16:24:07
Disculpad la intromisión. Ni papa de Arduino...

else if (rojo > verde $$ azul > verde ) 

$$ es un OR? (|| en c)?

rojo = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); 

Eso es una comparación en los argumentos de la llamada a una función?
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: camilo1 en 27 de Abril de 2017, 17:34:02
hola. Es un error que seguramente se produjo al copiar y pegar el código, realmente es && (AND), que en arduino se puede escribir solo como & y funciona igual (por lo que estuve probando), en cuanto a la comparación pues para ser sincero es un código que no entiendo por completo, no lo hice yo, por eso acudí a este foro por ayuda, ademas ese código tiene varios errores de los que no me había percatado.
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: KILLERJC en 27 de Abril de 2017, 18:49:47
El codigo:

Código: C
  1. rojo = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);

Hay que entender que a ese pin le debe llegar la frecuencia de salida.
Es por que el pulseIn espera hasta que este la entrada en el estado correcto para capturar el tiempo.

https://www.arduino.cc/en/Reference/PulseIn

Entonces gracias a como esta, si la lectura del pin esta en alto, hace que el pulseIn espere el primer 0 en el estado para comenzar a contar. Y viceversa, esto es porque si esta en alto, y uno selecciona alto debe esperar  un nuevo flanco alto ( de bajo a alto ). Basicamente sin esto estarias "esperando" un ciclo de la frecuencia de salida del sensor mas.

Solo aclarar que :

Citar
Works on pulses from 10 microseconds to 3 minutes in length.
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: manwenwe en 28 de Abril de 2017, 02:24:09
Qué cosas más raras :p tenía entendido que arduino triunfaba porque el lenguaje era muy sencillo y yo lo veo bastante "marciano"...
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: fuente en 28 de Abril de 2017, 06:41:21
Arduino utiliza los compiladores de C, así que & y && no son iguales.
"&&" es el operador lógico AND a nivel de expresiones y "&" es a nivel de bits. Cuidado con esto porque no son iguales.
Ejemplos:
if (Expresion1 && Expresion2)  => Si ambas expresiones tienen un valor distinto de 0 entonces....

if chVal1 & chVal2 => hace un AND bit a bit de ambas variables. Si el resultado es mayor que 0 entonces...
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: KILLERJC en 28 de Abril de 2017, 08:59:40
Qué cosas más raras :p tenía entendido que arduino triunfaba porque el lenguaje era muy sencillo y yo lo veo bastante "marciano"...

Es sencillo, Como harias para saber el tamaño de un pulso?
En la solucion mas sencilla un contador + un delay.
En la solucion mas compleja, un timer + interrupcion + contador.
O tambien interrupcion por deteccion de flanco + timer.

Pensa en hacer cualquiera de esas. Y luego en Arduino sin saber NADA de lo de arriba poner la funcion:

rojo = pulseIn(out,HIGH);

Y ya en rojo te guarda el tiempo del pin out, desde el flanco ascendente al descente. Y vos ni idea de todo lo que hable antes.
No es marciano, es como CCS, la idea es tener una funcion para todo, entonces el usuario en ves de saber el micro, solo debe buscar la funcion correcta y ya esta.
Es todo hermoso hasta que los tiempos son ajustados y si no conocen correctamente las funciones o el impacto sobre el micro, pueden fallar miserablemente. Pero lo mismo ocurre con PICs cuando la gente mete funciones/delays en donde no debe ( interrupciones )

O otro ejemplo, el programa puede fallar miserablemente si es que en ese pin No hay una entrada correcta. y va a fallar por 3 minutos

Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: manwenwe en 28 de Abril de 2017, 09:22:55
Tienes razón es más sencillo. Ya decía yo que se parecía a CCS con las funciones pre-compiladas. Bueno será más sencillo pero no me atrae: me gusta poder "pinchar" en las funciones y saber que hacen por dentro... Si no pasa lo que comentas: una función no funciona bien porque le pasaste mal un parámetro y como no sabes lo que hace por dentro te vuelves loco: te tienes que saber de memoria toda la documentación o buscar en foros lo que le pasó a otras personas...

Aunque lo respeto: para gustos los colores :-)
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: Picuino en 28 de Abril de 2017, 10:06:33
El lenguaje de Arduino es C++, ni más ni menos.

El compilador es AVR-GCC, es decir el compilador GCC de GNU, adaptado a los procesadores de Atmel.
Este compilador es independiente de Arduino. Arduino simplemente lo integra en su entorno para poder utilizarlo.


El entorno Arduino añade al C++ algunas librerías. Si quieres las usas y si no quieres no las usas.
Como el entorno es opensource y hay una gran comunidad, resulta muy sencillo leer el código y preguntar para saber qué hacen las funciones y librerías añadidas (por otro lado muy bien documentadas).

pulsein()
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_pulse.c
Código: C
  1. /*
  2.   wiring_pulse.c - pulseIn() function
  3.   Part of Arduino - http://www.arduino.cc/
  4.   Copyright (c) 2005-2006 David A. Mellis
  5.   This library is free software; you can redistribute it and/or
  6.   modify it under the terms of the GNU Lesser General Public
  7.   License as published by the Free Software Foundation; either
  8.   version 2.1 of the License, or (at your option) any later version.
  9.   This library is distributed in the hope that it will be useful,
  10.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.   Lesser General Public License for more details.
  13.   You should have received a copy of the GNU Lesser General
  14.   Public License along with this library; if not, write to the
  15.   Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  16.   Boston, MA  02111-1307  USA
  17. */
  18.  
  19. #include "wiring_private.h"
  20. #include "pins_arduino.h"
  21.  
  22. /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH
  23.  * or LOW, the type of pulse to measure.  Works on pulses from 2-3 microseconds
  24.  * to 3 minutes in length, but must be called at least a few dozen microseconds
  25.  * before the start of the pulse.
  26.  *
  27.  * This function performs better with short pulses in noInterrupt() context
  28.  */
  29. unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
  30. {
  31.         // cache the port and bit of the pin in order to speed up the
  32.         // pulse width measuring loop and achieve finer resolution.  calling
  33.         // digitalRead() instead yields much coarser resolution.
  34.         uint8_t bit = digitalPinToBitMask(pin);
  35.         uint8_t port = digitalPinToPort(pin);
  36.         uint8_t stateMask = (state ? bit : 0);
  37.  
  38.         // convert the timeout from microseconds to a number of times through
  39.         // the initial loop; it takes approximately 16 clock cycles per iteration
  40.         unsigned long maxloops = microsecondsToClockCycles(timeout)/16;
  41.  
  42.         unsigned long width = countPulseASM(portInputRegister(port), bit, stateMask, maxloops);
  43.  
  44.         // prevent clockCyclesToMicroseconds to return bogus values if countPulseASM timed out
  45.         if (width)
  46.                 return clockCyclesToMicroseconds(width * 16 + 16);
  47.         else
  48.                 return 0;
  49. }
  50.  
  51. /* Measures the length (in microseconds) of a pulse on the pin; state is HIGH
  52.  * or LOW, the type of pulse to measure.  Works on pulses from 2-3 microseconds
  53.  * to 3 minutes in length, but must be called at least a few dozen microseconds
  54.  * before the start of the pulse.
  55.  *
  56.  * ATTENTION:
  57.  * this function relies on micros() so cannot be used in noInterrupt() context
  58.  */
  59. unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout)
  60. {
  61.         // cache the port and bit of the pin in order to speed up the
  62.         // pulse width measuring loop and achieve finer resolution.  calling
  63.         // digitalRead() instead yields much coarser resolution.
  64.         uint8_t bit = digitalPinToBitMask(pin);
  65.         uint8_t port = digitalPinToPort(pin);
  66.         uint8_t stateMask = (state ? bit : 0);
  67.  
  68.         unsigned long startMicros = micros();
  69.  
  70.         // wait for any previous pulse to end
  71.         while ((*portInputRegister(port) & bit) == stateMask) {
  72.                 if (micros() - startMicros > timeout)
  73.                         return 0;
  74.         }
  75.  
  76.         // wait for the pulse to start
  77.         while ((*portInputRegister(port) & bit) != stateMask) {
  78.                 if (micros() - startMicros > timeout)
  79.                         return 0;
  80.         }
  81.  
  82.         unsigned long start = micros();
  83.         // wait for the pulse to stop
  84.         while ((*portInputRegister(port) & bit) == stateMask) {
  85.                 if (micros() - startMicros > timeout)
  86.                         return 0;
  87.         }
  88.         return micros() - start;
  89. }

¿Por qué hay tan mala opinión sobre las librerías de Arduino? Me encuentro con esa mala opinión sobre Arduino por todas partes y no lo entiendo. Nadie critica de esa forma las funciones de CCS o las librerías de Microchip que no son ni siquiera opensource.

Un saludo.

Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: manwenwe en 28 de Abril de 2017, 10:39:41
Pues si las funciones están "abiertas" (no lo sabía) rectifico. Pensaba que era como CCS. Y sí, hay gente que no puede con CCS: yo por ejemplo jeje. Hace 10 años o por ahí lo probé durante un tiempo y cuando ví que todas las funciones de LCD de segmentos estaban precompiladas y que sólo se podían usar con los parámetros que ellos te permitían cuando con el código fuente te podrías haber adaptado la librería en un rato... pues lo siento pero le cogí mania y dejé de usarlo.

¿qué código de Microchip no está abierto?, ¿algún decodificador de audio o por el estilo?. Ojo! que soy consciente que las librerías de Microchip son una m. en comparación con las de NXP por ejemplo. Pero al menos lo intentan. Por ejemplo, tienen una librería gráfica que se ha ido mejorando poquito a poquito durante los últimos 10 años y aunque no es la leche es la única libre de todos los fabricantes que te deja hacer widgets "decentitos"; el resto casi no pasan de de circulos y cuadrados...

Particularmente Arduino me parece una idea fantástica que se está aplicando mal por alguna gente. Es decir: genial para hobbystas y estudiantes jovencitos: ayuda a que la gente se interese por electrónica/programación. Sin embargo cuando veo trabajos fin de grado con arduino me dan nauseas. ¿Si eres ingeniero y no eres capaz de aprender a diseñar un circuito sencillo y programar en C sin que te lo den todo hecho... dónde piensas trabajar?. De RPI pienso similar...

Sólo mi opinión. Me callo ya que estoy troleando el hilo del pobre camilo1 sin aportar nada a resolver su problema.

Saludos!
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: Picuino en 28 de Abril de 2017, 11:15:42
Hay trabajos de fin de grado con Arduino que alcanzan niveles muy respetables.
Estas son algunas tesis doctorales con Arduino:
http://oa.upm.es/14776/1/MARIA_ALEJANDRA_URDANETA_LIMA.pdf
http://oa.upm.es/39410/1/FRANCISCO_CEREZO_COCA.pdf

Utilizar librerías no hace que tu trabajo sea malo.
Utilizar una placa de desarrollo en vez de hacértela tú mismo no hace que tu trabajo sea malo.

Un saludo.
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: KILLERJC en 28 de Abril de 2017, 14:47:13
No Picuino, es cierto que existe muy buenos trabajos realizados con Arduino. Pero si observas la mayoria lo unico que hace es servir de intermedio entre la PC y aquello a comandar. Enviar/Recibir + como maximo un poco mas de codigo para el Arduino. Si te fijas hay mas tiempo de diseño en 3D, software de PC que la parte de electronica, aunque la hubieras realizado con un micro comun.

Pero adivina... Eso lo puede hacer cualquiera, cualquier programador. Solo sabiendo como conectarlo.
Pero que un Ingeniero en Electronica no sepa ubicar componentes, o que no sepa crear una una linea de transmision para su cablecito de ethernet es el problema. Por que esa persona luego lo unico que sabe es programar. Y tal ves se pueda dedicar enteramente a ello y jamas tocar el Hardware. Pero para un trabajo de final de grado donde se le pide que debe demostrar los conocimientos adquiridos en la carrera, ir y llevar una Placa NO realizada por vos, con modulos comprados NO realizados por vos. Y simplemente lo unico que hiciste ( ya que encima tenes las librerias para todos los sensores - que me parece genial -) es programar lo tuyo.

Tu segundo link es un "laboratorio" para enseñanza, genial enseñas mas que nada a programar y como esta realizado, pero nada mas.

¿Te parece que eso es lo que necesitas para evaluar a la persona?

Citar
¿Por qué hay tan mala opinión sobre las librerías de Arduino? Me encuentro con esa mala opinión sobre Arduino por todas partes y no lo entiendo. Nadie critica de esa forma las funciones de CCS o las librerías de Microchip que no son ni siquiera opensource.

Parece que nunca me leiste cuando hablo de CCS, Mirochip no me quejo porque son pocas las librerias que uso, se que PIC16 posee librerias y que no encontras el codigo lo cual eso si me quejo, pero PIC18 y lo demas esta todo, la mayoria de las funciones built in del compilador son delays o alguno que te facilita no tener que escribir 3 instrucciones en ves llamo a una funcion ( siempre son de proteccion de escritura ). Y lo otro es que no posee directivas fuera de lugar como CCS.

Mi unico problema con Arduino es eso, acepto peores trabajos de final de grado pero sin una placa Arduino encima.
Y siempre pensando en un producto final.

Y una cosa mas...

tesis doctorales, aca exigen mucho mas para alcanzar el titulo de doctor tengo entendido, eso parece mas un trabajo de final de grado. ( Obviamente el del medidor de caño es muy bueno)
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: manwenwe en 28 de Abril de 2017, 17:57:42
Tesis doctoral con arduino? Sin palabras :?
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: Picuino en 29 de Abril de 2017, 04:11:57
Si alguien hace un mal trabajo con Arduino, el problema es del que hace el trabajo mal, no del entorno Arduino, que no tiene la culpa.
Lo mismo vale para CCS, XC o cualquier otro compilador, placa de desarrollo o shield.

En una cosa estoy de acuerdo. Si presentas una placa de desarrollo (Arduino o cualquier otra) y no fabricas ningún shield propio, no estás demostrando que sepas hacer un circuito con PCB.
Pero eso tampoco me parece motivo de crítica. No es tan difícil diseñar y hacer un PCB con un Atmel, no son muchos los trabajos donde tengas que hacerleo y hay muchos otros conocimientos que demostrar en la carrera.
Si te centras por ejemplo en un sistema de identificación de parámetros de máquinas eléctricas y no utilizas Arduino, todo va bien. Pero si se te ocurre añadir un arduino... ya piensan que el trabajo no vale nada.
Creo que hay un problema de prejuicios contra Arduino que no existe en otros entornos de desarrollo.

Un saludo.
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: xocas en 29 de Abril de 2017, 10:10:55
ya logre solucionar el problema, después de muchas pruebas y unas cuantas horas de lectura, logre comprender por completo el funcionamiento de este sensor, puedo decir que este sensor da buenos resultados si el objeto esta a una distancia de aproximadamente un centímetro, si se mantiene siempre la misma distancia entre el sensor y el objeto y si se reduce al mínimo la luz externa. Gracias por atender este tema.
Una vez entendido el proceso se avanza bastante rápido...

La incidencia de luz externa es importante porque su componente de color será detectada también por el sensor. La luz de fluorescentes tiene una fuerte dominante verdosa, amarillo-naranja la luz de tungsteno y azul la luz solar (por la radiación UV).

Recuerdo tener buenos resultados a ~3cm con colores primarios y buena iluminación. En mi caso usé una guía de color Kodak con su respectiva carta de grises para la calibración, pero puedes partir de una cartulina blanca y ajustar sobre los colores que se vayan a usar.
Ten en cuenta que los colores de los objetos (cartulina, plástico, etc) se basan en tintas y no siguen el patrón RGB. El color amarillo del modelo RGB (R:255, G:255, B:0) es imposible conseguir mediante tintas. Haciendo la conversión en Photoshop al amarillo más próximo mediante tintas (CMYK) tengo R:240, G:222, B:33.

No sé que punto de precisión necesitas y no descarto que esta información te sobre, si te lo comento es porque en un principio te decía que este sensor tiene sus 'cosillas' y una de ellas es la falta de precisión.
El TCS34725 (del mismo fabricante) es más moderno, incorpora filtrado IR y hay una librería bastante completa para su uso con Arduino.

un saludo
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: camilo1 en 29 de Abril de 2017, 15:45:26
toda la razón, es bastante impreciso, por suerte en mi caso solo necesito que detecte 4 colores, mas precisamente necesito detectar el color de tapas plásticas que serán transportadas por una banda y para este fin el sensor funciona bien con la calibración necesaria y por algún motivo los resultados que obtuve a corta distancia fuera mas precisos con los valores RGB de los colores en las tapas
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: Picuino en 30 de Abril de 2017, 05:37:12
A la hora de identificar tonos, como te comento xocas, es más útil utilizar el modelo HSL:
https://es.wikipedia.org/wiki/Modelo_de_color_HSL

Aquí tienes cómo realizar la conversión RGB a HSL:
https://es.wikipedia.org/wiki/Modelo_de_color_HSL#Conversi.C3.B3n_desde_RGB_a_HSL

La variable H (Hue) en castellano es Matiz o Tono de color, que es lo que tú buscas identificar. Es un solo valor real que puedes comparar con un pequeño rango de valores para decidir si se trata del color que quieres.

Aquí una librería Arduino para realizar la conversión:
https://github.com/ratkins/RGBConverter/blob/master/RGBConverter.cpp


Código: C
  1. void RGBConverter::rgbToHsl(byte r, byte g, byte b, double hsl[]) {
  2.     double rd = (double) r/255;
  3.     double gd = (double) g/255;
  4.     double bd = (double) b/255;
  5.     double max = threeway_max(rd, gd, bd);
  6.     double min = threeway_min(rd, gd, bd);
  7.     double h, s, l = (max + min) / 2;
  8.  
  9.     if (max == min) {
  10.         h = s = 0; // achromatic
  11.     } else {
  12.         double d = max - min;
  13.         s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
  14.         if (max == rd) {
  15.             h = (gd - bd) / d + (gd < bd ? 6 : 0);
  16.         } else if (max == gd) {
  17.             h = (bd - rd) / d + 2;
  18.         } else if (max == bd) {
  19.             h = (rd - gd) / d + 4;
  20.         }
  21.         h /= 6;
  22.     }
  23.     hsl[0] = h;
  24.     hsl[1] = s;
  25.     hsl[2] = l;
  26. }

Un saludo.
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: xocas en 02 de Mayo de 2017, 11:11:24
Le daré un ojo a los backups a ver si hay suerte y encuentro el código que usé en su día, pero no te garantizo nada porque era más un juego que otra cosa.

Recuerdo que para obtener buenos resultados la distancia al objeto tiene que ser muy corta y hay que evitar otra luz sobre el sensor que no sea la rebotada por el objeto.

Si encuentro algo te comento...

Bueno, no conseguí localizar el código, pero ya metido en faena busqué el sensor y estuve probando el código utilizado en el vídeo que puse en un mensaje anterior(*).

Me encontré el sensor con una arandela de goma (que seguramente usé para reducir la incidencia de luz ambiental), la típica junta de goma usada por fontaneros y que se puede localizar sin problemas en cualquier ferretería. No recuerdo si llegué a sacarle partido, ni siquiera recordaba su existencia...

Supongo que la idea la tomé de un módulo de TAOS:
(http://www.todopic.com.ar/foros/imgxocas/tcs3200.jpg)

He visto una idea parecida en módulos con TCS230 pero dudo que sean una buena solución. Al estar tan separados los leds, en distancias cortas el centro será una zona de sombra. No lo sé, me lo parece.
(http://www.todopic.com.ar/foros/imgxocas/tcs230.jpg)

camilo1, ¿Quieres que haga algunas pruebas o ya lo das por solucionado?

un saludo

(*) pdf con código en este enlace (https://drive.google.com/file/d/0BzqJvO2vV6zVYVZJbDJCY3ZpbVk/view).
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: xocas en 02 de Mayo de 2017, 11:20:06
A la hora de identificar tonos, como te comento xocas, es más útil utilizar el modelo HSL:

Eso creo pero, en un caso como éste, si los colores están lo bastante separados, el resultado será prácticamente el mismo. No merece la pena complicar más el código.

saludo
Título: Re:Calibración de sensor de color TCS3200 (arduino)
Publicado por: camilo1 en 04 de Mayo de 2017, 02:36:55
problema solucionado, basto con calibrar el sensor bajo las condiciones que debe trabajar y funciona bien, no es un sensor que utilizaría para el proyecto de algún cliente pero para lo que estoy haciendo es mas que suficiente, les agradezco la ayuda.