MicroPython - capter les couleurs avec le TCS34725

Cela faisait un moment qu'il n'avait plus été question de pilote pour MicroPython... commençons avec un capteur plutôt insolite, le TCS34725 qui permet de capturer "des couleurs".... sur que ce n'est pas commun!
Capteur TCS34725 (sur Arduino dans le cas présent)

Nous avons donc un nouveau pilote MicroPython tcs34725 (GitHub, backport CircuitPython) est maintenant disponible vos cartes MicroPython.

A brancher très simplement sur le port I2C de votre PyBoard (ou autre carte MicroPython).
Source: pilote MicroPython tcs34725
Le code est assez simple à mettre en oeuvre

Lecture en Kelvin

import time
from machine import I2C
from tcs34725 import TCS34725

# Pyboard - SDA=Y10, SCL=Y9
i2c = I2C(2)
# ESP8266 sous MicroPython
# i2c = I2C(scl=Pin(5), sda=Pin(4))

sensor = TCS34725(i2c)

# boucle principale lisant les ° Kelvin et les imprimants toutes les secondes.
while True:
    # Lire la température de la couleur et luminosité en lux.
    temp = sensor.color_temperature
    lux = sensor.lux
    print('Temperature: {0}K Lux: {1}'.format(temp, lux) )
    time.sleep(1)

Il faut savoir qu'une couleur à aussi une température s'exprimant en degrés Kelvin, c'est par ailleurs l'unité exploitée sur pour les phares Xenon des voitures pour indiquer la couleurs du feux (sachant que les jeunes apprécient le blanc froid... avec une nette tendance vers le bleu).
Il existe par ailleurs des tableaux de conversions Kelvin <-> RGB comme ici

Lecture de la couleur en RGB
Une lecture en Kelvin, ce n'est pas très pratique... surtout pour nous les Makers qui avons l'habitude de travailler en RGB888 (avec des valeurs de 0 à 255 pour chaque couleur).

Voici donc un autre script permettant d'obtenir la valeur en RGB.
import time
from machine import I2C
from tcs34725 import TCS34725

# Pyboard - SDA=Y10, SCL=Y9
i2c = I2C(2)
# ESP8266 sous MicroPython
# i2c = I2C(scl=Pin(5), sda=Pin(4))

sensor = TCS34725(i2c)
sensor.integration_time = 200 # Temps d'intégration plus grand = plus d'information collectée

def gamma_255( x ):
    """ Appliquer une correction gamma sur une valeur entre 0 - 255 """
    x /= 255
    x = pow(x, 2.5)
    x *= 255
    return int(x) if x < 255 else 255

def gamma_color( color ):
    """ Appliquer la correction gamma à un tuple de couleur rgb. """
    return gamma_255(color[0]), gamma_255(color[1]), gamma_255(color[2])


while True:
    # Lecture de la couleur sur le capteur
    rgb = sensor.color_rgb_bytes    # color_rgb_bytes
    gamma_rgb = gamma_color( rgb )  # Appliquer correction Gamma
    print( "rgb : %s   gamma_rgb : %s" % (rgb, gamma_rgb) )
    time.sleep(1)

Alors il y a quelques petites choses à savoir:
  • Position de l'objet: Il faut bien positionner l'objet pour renvoyer de la lumière colorée vers le capteur. C'est vraiment un point très sensible.
  • Temps d'intégration: J'ai augmenter le temps d'intégration (pour collecter plus de donnée avec le capteur)... sans cela, les couleurs sont assez fade... je pense qu'il faudrait encore essayer des temps d'intégration plus important.
  • Le gain: Modifier le gain n'a pas vraiment apporter de changement au résultat.
  • Correction Gamma: enfin, l'oeil ne percevant pas la lumière de façon linéaire, la fonction gamma a été ajoutée pour corriger chacune des couleurs de base.
Où acheter

Aucun commentaire