Skip to main content

Práctica 5: Cómo percibir el color con Arduino

Para percibir un determinado color, vamos a utilizar uno de los sensores que vienen en nuestro kit, el TCS34725, al que por comodidad denominaremos 'sensor de color'.

En uno de sus lados, como ves en la primera foto, puedes ver 4 pines, que son los que conectaremos a nuestra protoboard y de esta a nuestro Arduino.

En el otro lado, como se muestra en la segunda foto, puedes ver el sensor que, rodeado de cuatro LED blancos se encarga de determinar la cantidad de rojo, verde y azul que contiene el objeto que le coloquemos delante.

image-1668193257466.jpg


¿Cómo funciona?

Este sensor óptico consta de una matriz de 3x4 fotodiodos filtrados para rojo, verde, azul, y sin filtro (clear). También cuenta con 4 conversores analógico digital de 16bits (ADC) que realizan la medición de los fotodiodos:

image-1668201837749.15.35.png

image-1668201850014.15.43.pngFuente: https://www.luisllamas.es/arduino-sensor-color-rgb-tcs34725/

Los conversores ADC integran la medición de los fotodiodos, que es transferida a los registros internos del TCS34725. La conexión de los módulos que integran el TCS34725 es sencilla, ya que la comunicación se realiza a través de I2C.


Comunicación I2C

Aunque no vamos a entrar a explicar cómo funciona la comunicación I2C (inter integrated circuits), debemos saber que se trata de un protocolo basado en la existencia de dos líneas de comunicación, una de ellas lleva la señal de reloj y es conocida como (SCL), y la otra linea lleva los datos y es conocida como (SDA).

Los Pines SDA y SLC se encuentran especificados en todos los componentes que usan este tipo de protocolo de comunicación, como podemos ver si volvemos a la primera foto de arriba.

Por tanto, para hacer funcionar nuestro sensor, alimentamos nuestro sensor de color desde Arduino mediante los pines G y 5V y conectamos el pin SDA y SCL del sensor a los 2 pines de nuestro UNO SCL y SDA:

image-1668252879858.jpg


¿Cómo conectamos el sensor a nuestro Arduino?

Para conectarlo, necesitaremos la protoboard, como ya hemos dicho al principio. Es muy importante realizar las conexiones como te indico en la imagen de abajo:

image-1668253680737.jpg

Nuestro sensor ha de estar paralelo a las líneas azul y rojo, no perpendicular. ¿Por qué? Porque la protoboard internamente está conectada de la siguiente forma:

image-1668253913399.51.11.png

Si conectamos nuestro sensor con sus pines perpendiculare a las líneas azuly rojo, lo que estamos haciendo es cortociruitar el sensor y conectar todos los pines entre sí, lo que provocará que lo rompamos y probablemente salga humo... cosa que, obviamente, queremos evitar.

Colocaremos nuestro sensor de la manera correcta y posteriormente usaremos 4 cables para conectar cada uno de los pines de la protoboard con nuestro Arduino UNO:

El pin SCL con SCL
El pin SDA con SDA
El pin G con el GND
El pin 5V con el 5V

Quedando de la siguiente manera:

image-1668254357115.jpg

Ahora, pasaremos a ver el código necesario para identificar colores dependiendo de la cantidad de rojo, verde y azul que detecta el sensor.


Identificamos colores

Lo primero que haremos será descargar una librería, siguiendo el procedimiento que ya realizamos cuando instalamos la librería PulseSensor Playground. En este caso, buscaremos en el gestor de librerías de nuestro Arduino una llamada Adafruit TCS34725:image-1668254738281.21.29.png

Cuando la instalemos, probablemente nos aparecerá el siguiente aviso: image-1668255184401.21.40.png

Haremos clic sobre el botón Install All y así ya tendremos instaladas todas las librerías necesarias para que funcione el código siguiente:

#include <Wire.h>
#include "Adafruit_TCS34725.h"
   
/* Initialise with default values (int time = 2.4ms, gain = 1x) */
 Adafruit_TCS34725 tcs = Adafruit_TCS34725();


void setup(void) {
  Serial.begin(9600);
  
  if (!tcs.begin()) 
  {
    Serial.println("Error al iniciar TCS34725");
    while (1) delay(1000);
  }

}

void loop(void) {
  uint16_t r, g, b, c, colorTemp, lux;
  
  tcs.getRawData(&r, &g, &b, &c);
  colorTemp = tcs.calculateColorTemperature(r, g, b);
  lux = tcs.calculateLux(r, g, b);
  
  Serial.print("Temperatura color: "); Serial.print(colorTemp, DEC); Serial.println(" K");
  Serial.print("Lux : "); Serial.println(lux, DEC);
  Serial.print("Rojo: "); Serial.println(r, DEC);
  Serial.print("Verde: "); Serial.println(g, DEC);
  Serial.print("Azul: "); Serial.println(b, DEC);
  Serial.print("Clear: "); Serial.println(c, DEC);
  Serial.println(" ");
  delay(1000);
}


Desmenuzando el código

Lo primero que nos encontramos es dos sentencias que comienzan con # seguido de la palabra include. Como ya hemos visto en prácticas anteriores, esto se utiliza para importar librerías. En este caso importaremos las dos librerías que acabamos de instalar.

A continuación, lo que hacemos es crear un objeto sensor de color, de la misma manera que hicimos cuando creamos un objeto para nuestro pulsómetro.

#include <Wire.h>
#include "Adafruit_TCS34725.h"
   
/* Initialise with default values (int time = 2.4ms, gain = 1x) */
 Adafruit_TCS34725 tcs = Adafruit_TCS34725();

A continuación, encontramos la función void setup()

void setup() {
  Serial.begin(9600);
  
  if (!tcs.begin()) 
  {
    Serial.println("Error al iniciar TCS34725");
    while (1) delay(1000);
  }

}

Web en la que introducimos los valores RGB y sabemos qué color es: https://www.rapidtables.com/web/color/RGB_Color.html

¿Qué tenemos que presentar?


REFERENCIAS:

Imagen protoboard conexiones: https://2.bp.blogspot.com/-VL06n9GES1w/U3wniqqJoJI/AAAAAAAAACA/rbZNM-qF9lE/s1600/protoboard+(2).jpg

Sensor TCS34725: https://www.luisllamas.es/arduino-sensor-color-rgb-tcs34725/