HeTPro-Tutoriales

Creamos tutoriales de electrónica digital para estudiantes, profesionistasy hoobistas de la electrónica, robótica o mecatronica. Tenemos tutoriales de Arduino, QT-Creator, OpenCV, Electrónica analógica y digital, entre otros temas.

Sensor de color TCS3200 con Arduino

El sensor de color  TCS3200 de la arca LC Tech es un convertidor de luz a frecuencia que combina fotodiodos de silicio reconfigurables y una corriente de frecuencia en un solo circuito integrado. La salida es una onda cuadrada (ciclo de trabajo 50%) con una frecuencia directamente proporcional a la intensidad de luz. Las entradas y salidas digitales permiten una interfaz directa con un microcontrolador u otro conjunto de circuitos lógicos, por esta razón el sensor TCS3200 es ideal para líneas de producción, domótica, robótica, etc.

El sensor es un convertidor de luz a frecuencia que lee una matriz de 8×8 fotodiodos , de tal manera que 16 fotodiodos tienen filtro azul, 16 fotodiodos tienen filtro verde, 16 fotodiodos tienen filtro rojo y 16 fotodiodos son sin filtro.

sensor
sensor TCS3200

Especificaciones del sensor de color TCS3200

  • Alta resolución de conversión de luz a frecuencia.
  • Frecuencia de salida Programable en color y escala completa.
  • Se comunica directamente con un microcontrolador.
  • Voltaje de funcionamiento: 2.7-5.5 V.
  • Rango de error típicamente de 0,2% a 50 kHz.
  • Coeficiente de temperatura 200 ppm/°C .

Bueno en este tutorial  aprenderemos a utilizar el sensor de color RGB TCS3200 LC Tech con Arduino. El TCS3200  va detectar colores rojo, verde y azul en el monitor serial se mostrara la cantidad de color y que color es si rojo, azul o verde.

Material necesario

 

Función de terminales

sensor de color TCS3200
Función de terminales del sensor

 

Opciones seleccionables

Capturaaa
Tipo de fotodiodo

 

Capturaa
Escala de frecuencia de salida

 

 

Conexión con Arduino UNO

La tabla siguiente muestra hacia como se deben hacer las conexiones del sensor hacia un Arduino UNO.

conexiones1
tabla de conexiones del sensor de color con Arduino UNO

 

conexiones
Diagrama de conexiones

 

 Programación y código del sensor de color con Arduino

En la programación se abre el monitor serial y se muestra los valores de rojo, verde y azul, también se muestra cuando detecta el color rojo verde o azul, puedes modificar.

Se compila el programa y se carga al Arduino UNO, después abrimos el monitor serial donde se muestran los datos obtenidos, cada vez que el sensor detecte un color ya sea rojo, verde o azul indicará que color es el que detecta a continuación se muestran las imágenes de los resultados.

monitor serial
monitor serial
sensor detectando color azul
sensor detectando color

 

Enlaces de interés:

 

 

 

37 comentarios en «Sensor de color TCS3200 con Arduino»

  1. Muy bueno el diseño en arduino Uno, lo probare para verificar y entender su función en sistemas de maquinas selladoras automáticas. Los felicito por estos diseños en este programa. Hasta ahora estoy conociendo el lenguaje arduino y lo he ido estudiando con paciencia.

  2. De qué manera podría hacer que el sensor de color deje de detectar los colores. Es decir, programamos el sensor de color de manera que al detectar un color (por ejemplo, rojo) arduino manda una señal a un actuador para que este haga su función, pero necesitamos que al momento de que funciona el actuador, el sensor de color deje de mandar qué colores ha encontrado.

    1. Alejandro, eso mediante lógica de tu programa. Por ejemplo pones una condición antes de leer el sensor que sea if(colorok==0) y dentro de la condición lees el sensor. Si el sensor encuentra el color deseado entonces pones la condición de que cambie la variable colorok a 1. Ya con esto la siguiente vez que pase por esa parte de código brincara la instrucción de lectura del sensor. OJO la variable colorok déjala como bool inicializada en cero.

  3. Tengo un problema con el código, cada vez que lo hago funcionar, tira lecturas de color rojo, solo cambia cuando le pongo algo azul o verde delante, en cualquier otro caso tira lecturas de color rojo

    1. Sebastian, esto es por que el ambiente tienen carga de rojo. Podrías poner un umbral para todos los valores y si baja de un determinado nivel que diga «no color» de esa manera evitas ese «ruido». Saludos.

    1. Jo, en donde esta la función «Serial.println(» XXXX»);», en donde las Xs son el colo, ahi puedes asignar el valor a una variable, por ejemplo «color=»rojo»;» solo que toma en cuneta que tienes que crear la variable color como string. Aunque yo te recomiendo mejor crear un entero y darle valores 1, 2 y 3 y tu defines cual es cada color.

    1. Hola, primero tendrías que calibrar los colores que quieres detectar. Agregar una bilioteca para los servomotores. Y sería algo como:
      if(colorDetectado) { activarMotor(x Grados); }
      else if(color2Detectato) { activarMotor(x+y Grados); }

        1. John, el sensor ya viene calibrado para detectar longitudes de onda determinadas. Si lo que requieres es parametrizar un programa para los colores que vas a usar te recomiendo lo siguiente. Lee los 4 canales posicionando el color que quieres reconocer y guarda esa información, lo haces con los 2 colores. Después simplemente comparas y das un rango mas/menos para cada canal del color, si es o si la diferencia es pequeña activas el servomotor.

    1. Hola Jesus, para ese proyecto te recomendaría mejor una Raspberry PI 3 y con visión artificial (opencv + una cámara). Podrías hacer un entrenamiento para detectar a esos insectos y clasificaros o detectar el color con la cámara. Tenemos el plan de comenzar a subir tutoriales de visión artificial, Saludos.

    1. Hola una disculpa, acabamos de corregir el código. Ya si lo copias, no te pasará ese error. Tenia a los caracteres $$ de mas, que deberían decir &&. Saludos.

  4. oye, disculpa, para que sirve la función:
    pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
    ley un poco y decía q sirve para leer la frecuencia, pero cada cuantos segundos la lee?

    estoy exportando el proyecto a una FPGA y ocupo saber cada cuantos segundos lee la frecuencia

    1. Chamin, es una instrucción compuesta. Primero el operador ternario, es una condición que si la igualdad de «digitalRead(out)==HIGH» se cumple, entonces se toma LOW y si no, se toma HIGH para el segundo parámetro de la función pulseln. La función pulseln cuenta el tiempo que tarda una entrada (en este caso out) para cambiar de estado. Entonces básicamente lo que lees es tiempo en alto ó tiempo en bajo de una señal cuadrada. No tanto frecuencia, la cual se puede determinar de manera indirecta. Si te fijas además esta instrucción esta en la función «color()» que esta al inicio de «loop()», el delay es de 900 ms, pero este tiempo no es critico para la aplicación.

    1. Noel, recuerda que en el espectro de luz no existen los colores blanca y negro. Además, como tal, no se consideran colores. Pero si podemos detectar estos eventos. Primero que nada su definición seria que el blanco es la combinación de los colores y el negro es la ausencia de los mismos. Por lo tanto, podemos crear una función que con una condición if compare si los 3 valores son mayor a un umbral (digamos el 80% del valor máximo) entonces es blanco, y si los 3 valores son menores a otro umbral (digamos el 20% del rango) entonces es negro.

  5. Quiero que por favor me expliques esta parte del código que función cumple.
    «digital Read(out) == HIGH ? LOW : HIGH».
    El código va de maravilla.

    1. Hola, es la forma mas abstracta de hacer un if. If(digitalRead(out) == HIGH) entonces LOW, me imagino que parte del codigo imprime ese LOW(0) ELSE HIGH

  6. **UNA IDEA PARA LOS QUE QUIERAN DETECTAR OTROS COLORES**

    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 5)) && ((verde > azul) && (verde > 7)) && rojo < 16)
    {
    Serial.println(" Rojo");
    }
    else if (azul < rojo && azul < verde && verde verde && azul > verde )
    {
    Serial.println(» Verde»);
    }
    else if (((verde > 9) && (verde 12) && (azul < 16)) && rojo < 10 )
    {
    Serial.println(" Amarillo ");
    }
    else if (verde <= 6 && azul <= 7 && rojo 32 && azul > 24 && rojo > 24 )
    {
    Serial.println(» Negro»);
    }
    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);
    }

  7. Disculpe dos dudas, la primera seria ¿Cual es la distancia util que tiene el sensor? y la segunda la luz ambiental hace que tenga que calibrar los parametros en cada momento es normal?

  8. Cada vez que lo hago funcionar, funciona con su respectivo color, pero luego cunado lo pongo en cualquier otro color q no sea ni rojo, verrde o azul tira lecturas de color rojo, solo cambia cuando le pongo algo azul o verde delante, en cualquier otro caso tira lecturas de color rojo, como lo podria solucionar?

    1. Alexa, esto es por que el sistema solo esta evaluando para esos 3 colores. Tendrías que hacer una tabala de los nuevos colores que vas a introducir y revisar los valores que da para dicho color que estan en la parte de la izquierda. Una vez tengas tu tabla puedes hacer un sistema de if else donde evaĺue ya por rangos por ejemplo el naranja te dio (ojo, son datos de ejemplo) 220 10 30 entonces puedes hacer una condición compuesta donde diga que if(230>dato1>210 && 20>dato2>0 && 40>dato3>20 ) entonces imprime «Naranja» y asi con los demás colores. Recuerda que los colores no son más que combinaciones del RGB.

  9. Buenos dias:
    Estoy haciendo pruebas con el detector de color y me salen valores altos, del orden de 1500 de los distintos colores, ¿Haria falta que pasase esos valores a RGB de 0 a 255 para que fueran mas bajos?
    Un saludo y gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *