Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Capteurs de lumière > Capteur de couleur TCS230

Capteur de couleur TCS230

conversion de lumière en fréquence

jeudi 5 septembre 2013, par Julien H.

Évaluer la couleur d’un objet abordé par un robot passe par un capteur de lumière capable de différencier chacune des composantes, généralement à partir d’un filtre.

Le capteur présenté ici est une grille de 64 récepteurs miniatures avec trois filtres rouge, vert, bleu permettant de déterminer une teinte avec suffisamment de précision.

Nous avions déjà testé des photodiodes recouvertes d’un filtre coloré afin de déterminer une couleur. Cependant le montage d’amplification du courant passant dans la diode est complexe et peu fiable quand on n’a pas les connaissances requises concernant les amplificateurs opérationnels.

Le circuit présenté ici intègre beaucoup plus de récepteurs (une grille de 8 x 8) et convertit la lumière en fréquence, ce qui permet une lecture numérique directe par un micro-contrôleur ou une petite carte de prototypage comme l’Arduino.

Le montage est donc accessible au plus grand nombre. Le circuit TCS230 de Taos est assez facilement disponible, notamment déjà assemblé sur des cartes de connexion rapide ("break-out") équipées de leds éclairantes permettant une bonne réflexion de la lumière sur l’objet à mesurer et donc une détermination plus fiable de la teinte.

Datasheet du capteur Taos TCS230
Taos

Connexion

La carte dispose de deux connecteurs de quatre points pour l’alimentation, la configuration de la couleur à mesurer et la lecture de la fréquence équivalente à la quantité de lumière reçue.

Hormis la masse et la tension d’alimentation (5 volts), une patte permet d’éteindre ou d’allumer les 4 leds blanches à haute luminosité. Il faut mettre la patte à la masse pour éteindre, et à la tension nominale pour les allumer.

Premier test

On va visualiser la fréquence en sortie sur un oscilloscope. On programme a minima la carte Arduino connectée au capteur pour pouvoir faire varier l’échelle de fréquences (plus ou moins rapide) et fixer la couleur à mesurer (sans filtre ou l’une des quatre valeurs possibles).

/**
 * Test d'un capteur de couleur par conversion lumière / fréquence
 * Taos TCS230
 */ 

// les quatre entrées TOR de programmation du capteur

#define S0  4
#define S1  5
#define S2  6
#define S3  7


void setup()
{
  // deux entrées pour réduire si besoin la fréquence en sortie
  // Echelle  | S0 | S1 |
  // 0=éteint | L  | L  |
  // 2%       | L  | H  |
  // 20%      | H  | L  |
  // 100%     | H  | H  |
  pinMode(S0,OUTPUT);
  pinMode(S1,OUTPUT);
  
  // deux entrées pour choisir la couleur du filtre
  // Filtre | S2 | S3 |
  // rouge  | L  | L  |
  // bleu   | L  | H  |
  // aucun  | H  | L  |
  // vert   | H  | H  |
  
  pinMode(S2,OUTPUT);
  pinMode(S3,OUTPUT);
  
  
  // S0 et S1 niveau haut = 100% de la fréquence
  digitalWrite(4,HIGH); // S0
  digitalWrite(5,HIGH); // S1
  
  // S2 haut et S3 bas : sans filtre  
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  
}

void loop()
{
  // rien : on regarde ce qui se passe à l'oscillo
}

Lecture des trois composantes

Pour déterminer la fréquence, on va utiliser la fonction pulseIn de la bibliothèque de fonctions d’Arduino. Elle permet de lancer une mesure d’un créneau (haut ou bas selon la configuration), et elle prend même en charge l’arrêt de la mesure si un délai est dépassé - ce qu’on appelle un "time-out" - et permet de reprendre la main si le capteur ne répond pas (pas de lumière par exemple, ce que nous indique la datasheet) ou bien si on veut réagir plus rapidement.

La valeur retournée par la fonction pulseIn est la durée en micro-secondes du créneau. Pour obtenir la fréquence, il faut donc prendre l’inverse : 100 µs équivalent à une fréquence de 10 kHz.

Voici le résultat pour deux mesures :

Voici le code correspondant :

/**
 * Test d'un capteur de couleur par conversion lumière / fréquence
 * Taos TCS230
 */ 

// les quatre entrées TOR de programmation du capteur

#define S0  4
#define S1  5
#define S2  6
#define S3  7

// la sortie en fréquence 

#define OUT  9

void setup()
{
  Serial.begin(9600);
  
  // deux entrées pour réduire si besoin la fréquence en sortie
  // Echelle  | S0 | S1 |
  // 0=éteint | L  | L  |
  // 2%       | L  | H  |
  // 20%      | H  | L  |
  // 100%     | H  | H  |
  pinMode(S0,OUTPUT);
  pinMode(S1,OUTPUT);
  
  // deux entrées pour choisir la couleur du filtre
  // Filtre | S2 | S3 |
  // rouge  | L  | L  |
  // bleu   | L  | H  |
  // aucun  | H  | L  |
  // vert   | H  | H  |
  
  pinMode(S2,OUTPUT);
  pinMode(S3,OUTPUT);
  
  
  // S0 bas et S1 haut = 2% de la fréquence
  digitalWrite(S0,LOW); 
  digitalWrite(S1,HIGH);
  
  // S2 haut et S3 bas : sans filtre  
  digitalWrite(S2,HIGH);
  digitalWrite(S3,LOW);
  
}

void loop()
{
  
  Serial.print("Sans filtre : ");  
  digitalWrite(S2,HIGH);
  digitalWrite(S3,LOW);
  Serial.println(pulseIn(OUT,HIGH));
  
  Serial.print("Rouge       : ");  
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  Serial.println(pulseIn(OUT,HIGH));
  
  Serial.print("Vert        : ");  
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  Serial.println(pulseIn(OUT,HIGH));
  
  Serial.print("Bleu        : ");  
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  Serial.println(pulseIn(OUT,HIGH));
  
  
  // pause de deux secondes
  delay(2000);
   
}

Bien entendu il serait plus pratique d’avoir une teinte : ce sera l’objet d’un prochain atelier.

Vos commentaires

  • Le 21 janvier 2017 à 14:47, par domi24 En réponse à : Capteur de couleur TCS230

    Bonjour
    Je voudrais savoir s’il est possible de réaliser un détecteur changement de couleur à base de : carte méga 2560, carte data loger et carte tcs3200 détecteur de couleur.
    Le but est de détecté la couleur et daté l’heure la durée et le jour de cette détection, j’ai un peu de mal à partir sur de bonne base pour compilé un programme, si quelqu’un a était confronté ou a réaliser un projet identique ou similaires, je serais preneur de bonne infos, merci.

    • Le 17 février 2017 à 14:44, par Eric P. En réponse à : Capteur de couleur TCS230

      Bonjour,
      C’est tout à fait possible, vu qu’on ne va pas demander grand-chose à l’Arduino si ce n’est d’analyser les sorties du détecteur de couleur.
      Si vous avez des difficultés à compiler un programme c’est probablement que vous n’avez pas encore étudié avec soin la documentation et les exemples fournis avec l’environnement Arduino. Je vous conseille de commencer par là.
      Cordialement.

    Répondre à ce message

  • Le 9 décembre 2013 à 23:34, par Franck En réponse à : Capteur de couleur TCS230

    Bonjour,

    Très bon article, petite question, savez vous pourquoi j’ai toujours le rouge à zéro ?
    Est il possible que ce soit le sensor qui soit défectueux ?
    Autre question peut-on simplement convertir la sortie sur une valeur en lumens par exemple.

    • Le 10 décembre 2013 à 00:06, par Julien H. En réponse à : Capteur de couleur TCS230

      Bonsoir. Pour le rouge à zéro, à moins d’un problème dans l’affichage des valeurs (mauvaise variable), je ne vois pas.

      Pour les lumen, j’en doute.

    Répondre à ce message

  • Le 23 septembre 2013 à 13:23, par Jacen En réponse à : Capteur de couleur TCS230

    Salut,

    Est ce que vous avez testé le capteur de couleurs avec d’autres couleurs que RGB ? Du jaune (genre chess’up), du orange (temple of atlantis), du brun (les palmiers de treasure island), ...

    L’idée n’étant pas forcément de repérer la couleur dans l’absolu, mais de différencier 2 couleurs. Par exemple, les palets rouges de Atlantis par rapport à l’orange, de mémoire, le orange, c’est du rouge et du vert (avec plus de rouge) du coup on doit pouvoir discriminer sur le niveau de vert, non ?

    • Le 23 septembre 2013 à 15:50, par Eric P. En réponse à : Capteur de couleur TCS230

      Oui, et je laisse mes camarades de jeu répondre plus en détail. Un démonstrateur est d’ailleurs en cours de développement pour la (toute prochaine) Fête de la Science.

      La discrimination de couleur est plus simple (et plus fiable) en passant en HSV ou HSB à partir du RGB.

      Dans ce modèle, la teinte est codée par une seule composante (le H), et donc la différenciation quasiment directe. Le passage RGB->HSV ou HSB s’obtient par quelques expressions arithmétiques sans complexité particulière, et disponibles sur le net assez largement

      Il faut cependant savoir que HSV, HSB,... présentent néanmoins des défauts, notamment au niveau de la traduction de la perception de la luminosité. On trouve pas mal d’articles sur le net là-dessus, et la page Wikipédia en Anglais (attention, celle en Français n’en est pas la traduction fidèle et prend quelques raccourcis douteux) est assez bien renseignée.

      Nous avons fait des expérimentations en vision dès la coupe 2005 (analyse d’image d’une webcam embarquée dans le robot) et c’est l’approche décrite plus haut qui s’est révélée de loin la plus efficace. Nous avions au préalable fait des expérimentations avec des caméras comme la CMUCam, qui travaillent en RGB, et avions récupéré le lot habituel de problèmes liés à la configuration des couleurs à reconnaitre, qui est assez délicate dès lors que l’ambiance lumineuse est changeante.

    Répondre à ce message

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.