TCS34725 problème

Bonjour,
J'ai un capteur TCS34725 qui est censé capter les couleurs avec une LED intégrée.
Seulement le problème est que les couleurs sont fausses !
J'ai présenté devant le capteur (avec LED allumée) un papier complètement blanc et le capteur m'a renvoyé le code HEX #426856, ce qui est un vert assez foncé (assez loin de la réalité !!)

le code (trouvé sur le forum arduino) :

#include <Wire.h>
#include "Adafruit_TCS34725.h"

// Pick analog outputs, for the UNO these three work well
// use ~560  ohm resistor between Red & Blue, ~1K for green (its brighter)
#define redpin 3
#define greenpin 5
#define bluepin 6
// for a common anode LED, connect the common pin to +5V
// for common cathode, connect the common to ground

// set to false if using a common cathode LED
#define commonAnode false

// our RGB -> eye-recognized gamma color
byte gammatable[256];


Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);

void setup() {
  Serial.begin(9600);
  Serial.println("Color View Test!");

  if (tcs.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1); // halt!
  }
  
  // use these three pins to drive an LED
  pinMode(redpin, OUTPUT);
  pinMode(greenpin, OUTPUT);
  pinMode(bluepin, OUTPUT);
  
  // thanks PhilB for this gamma table!
  // it helps convert RGB colors to what humans see
  for (int i=0; i<256; i++) {
    float x = i;
    x /= 255;
    x = pow(x, 2.5);
    x *= 255;
      
    if (commonAnode) {
      gammatable[i] = 255 - x;
    } else {
      gammatable[i] = x;      
    }
    //Serial.println(gammatable[i]);
  }
}


void loop() {
  uint16_t clear, red, green, blue;

  tcs.setInterrupt(false);      // turn on LED

  delay(60);  // takes 50ms to read 
  
  tcs.getRawData(&red, &green, &blue, &clear);

  tcs.setInterrupt(true);  // turn off LED
  
  Serial.print("C:\t"); Serial.print(clear);
  Serial.print("\tR:\t"); Serial.print(red);
  Serial.print("\tG:\t"); Serial.print(green);
  Serial.print("\tB:\t"); Serial.print(blue);

  // Figure out some basic hex code for visualization
  uint32_t sum = clear;
  float r, g, b;
  r = red; r /= sum;
  g = green; g /= sum;
  b = blue; b /= sum;
  r *= 256; g *= 256; b *= 256;
  Serial.print("\t");
  Serial.print((int)r, HEX); Serial.print((int)g, HEX); Serial.print((int)b, HEX);
  Serial.println();

  //Serial.print((int)r ); Serial.print(" "); Serial.print((int)g);Serial.print(" ");  Serial.println((int)b );

  analogWrite(redpin, gammatable[(int)r]);
  analogWrite(greenpin, gammatable[(int)g]);
  analogWrite(bluepin, gammatable[(int)b]);
}

Tout est bien branché, le 5V, le GND, le SCL et le SDA. Ma carte est une Arduino MEGA.

Pouvez-vous m'aider ?

  • Le capteur et le papier sont bien isolé de l'extérieur? L'ensemble dans un tube blanc par exemple.
  • Rien qui pourrait perturber la mesure? La couleur de la table sur laquelle tu fais tes essais par exemple ou une lumière parasite.

Ce capteur est un module avec une électronique. Ou l'as tu acheté ? As-tu une datasheet ?

As-tu testé les exemples de la bibliothèque avant d'écrire ce code ? Que donnent ils lorsque tu présentes ta feuille blanche ?

Tu peux aussi tester cette bibliothèque

@fdufnews, j'ai retesté dans une pièce à l'obscurité. Le résultat est le même. Je ne pense pas que d'autres lumières ou la table aient interféré dans le résultat de la mesure.

@lesept, j'ai acheté ce module sur AliExpress. Il y a des informations en descendant un peu.
J'ai cherché un peu sur Internet, et je n'ai pas bien compris, qu'est ce que le temps d'intégration (integration time) et le gain ? Peut-être c'est cela qui est mal reglé ?
J'ai testé avec la bibliothèque que tu m'a proposé, et ça donne à peu près les mêmes résultats :

Interval : 502
Color Temp : 6557.99
Lux : 3277.43
R : 7.85
G : 27.91
B : 16.81
Raw R : 292
Raw G : 485
Raw B : 396
Raw C : 1175

On est bien d'accord que ici, ce sont les 3 premières valeurs de RGB qui sont sur 255, et donc utilisables? A quoi correspondent les valeurs RGB raw en dessous ?

L'un des acheteurs dit ceci :

Le tableau que j'ai reçu avait TCS34727 monté dessus, pas TCS34725. Par conséquent, la bibliothèque TCS34725 de Arduino n'a pas pu y accéder. J'ai modifié la partie ID de la librairie, et ça a bien fonctionné.

Dans le fichier /h de la bibliothèque, il y a ces lignes :

#define TCS34725_ID                                                            \
  (0x12) /**< 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 */

Essaye en changeant 0x12 en 0x44 ou 0x4D (vérifie si une référence est inscrite sur le capteur)

Pour le temps d'intégration, un des exemples de la bibliothèque Adafruit en parle. Essaye le

Merci pour tes réponses.
J'ai essayé de changer par 0x44 ou 0x4D, mais dans les 2 cas ça ne trouvait pas le capteur, alors j'ai laissé à 0x12.

En fait, je crois que le capteur marche, mais toutes les couleurs lues sont beaucoup trop sombres. Lorsque je met du bleu clair, ça me lit du RGB(0,26,46) et lorsqu'on descend un peu sur cette page, on trouve le bon bleu (+50% de lumière)...
Pareil pour le rouge : RGB(65,7,5) qui correspond à la lumière à 40%.
Et pour le rose RGB(26,9,18)

Je pense qu'il faudrait juste trouver un moyen d'augmenter la luminosité, pourtant la led du capteur est bien éclairée à fond. Ce n'est pas normal, toutes les vidéos et tutos que je vois sur internet montrent un capteur qui capte la bonne couleur...

En même temps, à 1.30€ le capteur, il ne faut pas s'attendre à une très haute qualité. La vidéo du vendeur semble montrer que l'objet doit être placé assez près du capteur. Le résultat dépend de la distance.