Autor Tema: Calibración de sensor de color TCS3200 (arduino)  (Leído 12498 veces)

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

Desconectado camilo1

  • PIC10
  • *
  • Mensajes: 13
Calibración de sensor de color TCS3200 (arduino)
« 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); 
}

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #1 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

Desconectado camilo1

  • PIC10
  • *
  • Mensajes: 13
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #2 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

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #3 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...

Desconectado camilo1

  • PIC10
  • *
  • Mensajes: 13
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #4 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.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #5 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?
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado camilo1

  • PIC10
  • *
  • Mensajes: 13
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #6 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #7 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.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #8 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"...
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado fuente

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 573
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #9 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...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #10 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

« Última modificación: 28 de Abril de 2017, 09:01:46 por KILLERJC »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #11 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 :-)
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #12 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.

« Última modificación: 28 de Abril de 2017, 10:10:42 por Picuino »

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #13 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!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Calibración de sensor de color TCS3200 (arduino)
« Respuesta #14 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.