Tecnologia vestible

Per començar Elements d'entrada Programació CircuitPython   Recursos CITCEA
Elements no electrònics Elements de sortida Programació Arduino    
Projectes Elements de control Dades pràctiques   Inici

Sensor de color

El sensor de color TCS34725 ens permet conèixer el color de la llum que arriba al sensor sense que calgui il·luminació exterior ja que també incorpora un LED blanc. Té un diàmetre d'uns 16 mm (com una moneda d'un cèntim) i un gruix d'uns 2 mm. Això facilita el seu us incorporant-los a elements tèxtils.

Avís: En el moment d'escriure aquesta pàgina no es podien compilar les biblioteques d'aquest sensor en les plaques Gemma.

Aquest sensor es connecta amb la placa del microcontrolador fent servir una comunicació i2c que ens permet transferir la informació fent servir només dos fils (més els dos d'alimentació). Cada placa de microcontrolador només pot tenir connectat un sensor TSL2561 però sí admet altres elements i2c coexistint amb ell. Per això, la placa del sensor té duplicades les connexions i2c de manera que sigui fàcil encadenar els dispositius.

TCS34725

Per fer servir aquest sensor cal connectar el born 3V (inferior a la foto) al born 3,3 V de la placa del microcontrolador (ATENCIÓ: No al born VBATT), el born gnd (superior a la foto) al negatiu de l'alimentació i els borns SDA i SCL amb els del mateix nom de la placa del microcontrolador. A la placa del sensor aquests dos borns hi apareixen dos cops de manera que podem triar la disposició que ens sigui més còmoda.

Per fer servir el sensor ens caldrà la Adafruit TSL2561 Light Sensor Driver. Si és necessari, podeu consultar la instal·lació de biblioteques.

Un cop ja tinguem la biblioteca, podem fer els nostres programes. A la part inicial, hem de carregar les biblioteques connesponents.

#include <Wire.h>  // Per a la comunicació i2c
#include "Adafruit_TCS34725.h"

A la part de declaració de variables, hem de crear un objecte Adafruit_TCS34725. En aquest cas l'objecte s'anomena tcs.

Adafruit_TCS34725 tcs = Adafruit_TCS34725();

En la inicialització del programa, cal inicialitzar el sensor. D'aquesta manera el nostre microcontrolador hi estableix connexió i convé preveure que la connexió no sigui possible.

	tcs.begin()

Podem encendre el llum que porta incorporat el sensor amb:

	tcs.setInterrupt(false);      // Encén el LED

i apagar-lo amb:

	tcs.setInterrupt(true);      // Apaga el LED

Per llegir els valors del sensor, cal cridar a la funció tcs.getRawData posant com a paràmetres les variables on volem que ens guardi els quatre valors llegits. El signe & indica que el que posem no és un paràmetre de la funció sinó la variable on ha de guardar els resultats. Els tres primers valors són els components RGB de la llum que arriba al sensor. El quart valor inclou la lluminositat que rep el sensor en longituds d'ona no visibles a l'ull humà.

	uint16_t r, g, b, c	// Defineix les quatre variables que calen per llegir el sensor
	tcs.getRawData(&r, &g, &b, &c);	// Llegeix el sensor

La llibretia del sensor inclou també una funció que calcula la lluminositat rebuda (en lux) i una que calcula la temperatura de color de la radiació rebuda (en K).

lux = tcs.calculateLux(r, g, b);	// Calcula els lux
tempColor = tcs.calculateColorTemperature(r, g, b);	// Calcula la temperatura de color en K

Si volem llegir un color i mostrar aquest color en un LED ens trobarem que el més habitual és que les lectures del sensor siguin colors més aviat apagats, amb poca saturació, i el que es vegi al LED no sigui ben bé el que ens agradaria. Podem agafar les lectures RGB del sensor i convertir-les a components HSL. Conservant la mateixa tonalitat (H) i augmentant la saturació (S) podrem tenir un color més apropiat. Els resultats més brillants els obtindrem amb la mateixa tonalitat (H), la màxima saturació (S) i una lluminositat del 50 %. Els nous valors d'H, S i L els podem tornar a convertir a RGB per mostrar-los al LED.

A continuació hi ha un programa de prova per a l'entorn Arduino. En aquest cas, obrim també un canal sèrie que ens permeti veure si la connexió ha anat bé i les lectures del sensor al monitor sèrie. El nostre programa de prova llegirà els valors llegits pel sensor i el mostrarà. El paràmetre DEC indica que volem mostrar els resultats en format decimal.

#include <Wire.h>
#include "Adafruit_TCS34725.h"
Adafruit_TCS34725 tcs = Adafruit_TCS34725();
void setup() {
	Serial.begin(9600);
	if (!tcs.begin()) {
		Serial.println("Comprova la connexió del sensor");
		while (1);
	}
	tcs.setInterrupt(true);      // Apaga el LED
}
void loop() {
	uint16_t r, g, b, c, tempColor, lux;
	tcs.getRawData(&r, &g, &b, &c);
	tempColor = tcs.calculateColorTemperature(r, g, b);
	lux = tcs.calculateLux(r, g, b);
	Serial.print("Temperatura de color: "); Serial.print(tempColor, DEC); Serial.print(" K - ");
	Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
	Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
	Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
	Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
	Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
	Serial.println(" ");
	delay(2000);
}

El següent programa en CircuitPython també ens permet llegir el sensor:

import time
import board
import busio
import adafruit_tcs34725
i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_tcs34725.TCS34725(i2c)
while True:
    color = sensor.color_rgb_bytes
    print("")
    print("R: ", color[0], "    G: ", color[1], "    B: ", color[2])
    print("Temperatura de color: ", sensor.temperature, " K")
    print("Lux: ", sensor.lux)
    time.sleep(1.0)

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.