mardi 22 décembre 2020

Capteur de couleurs TCS3200 (GY-31) et Raspberry Pi

Dans cet article, nous allons piloter un module GY-31, qui comporte un capteur de couleurs TCS3200,  au moyen d'un Raspberry Pi programmé en Python.

Comme je l'avais mentionné lorsque j'en ai fait l'essai avec un Arduino, le capteur de couleur TCS3200 est constitué d'une matrice de minuscules photodiodes. Certaines de ces photodiodes sont munies d'un filtre qui laisse passer la lumière rouge, alors que d'autres ne captent que la lumière bleue ou la lumière verte. Ces photodiodes peuvent être activées tour à tour de façon à connaître la quantité de rouge, de bleu et de vert qui se trouve dans la lumière qui atteint le capteur.

En plus du capteur TCS3200, le module GY-31 comporte 4 LEDs blanches qui assurent un éclairage adéquat de la cible dont on désire déterminer la couleur.

Les connecteurs du module GY-31 sont les suivants:

  • VCC: Alimentation située entre 2,7 et 5,5 V
  • GND: La masse
  • S0 et S1: Sélection de l'échelle de fréquence à la sortie
  • S2 et S3: Sélection des photodiodes actives
  • OUT: signal de sortie
  • LED: contrôle des 4 LEDs

L'état logique des entrées S2 et S3 détermine les photodiodes actives:

  • Si S2 = 0 et S3 = 0 : photodiodes avec filtre rouge
  • Si S2 = 0 et S3 = 1:  photodiodes avec filtre bleu
  • Si S2 = 1 et S3 = 1: photodiodes avec filtre vert
  • Si S2 = 1 et S3 = 0: photodiodes sans filtre

Le signal de sortie est un peu inhabituel: il s'agit d'une onde carrée dont la fréquence dépend de l'intensité lumineuse (plus l'intensité lumineuse captée es grande, plus le signal de sortie oscille rapidement)­.  Pour faciliter la mesure de cette fréquence, les entrées S0 et S1 permettent, si on le désire, de la diviser par 5 ou par 50:

  • Si S0 =1 et S1 = 1: 100% de la fréquence (environ 600 kHz)
  • Si S0 = 1 et S1 = 0: 20% de la fréquence (environ 120 kHz)
  • Si S0 = 0 et S1 = 1: 2% de la fréquence (environ 12 kHz)
  • Si S0 = 0 et S1 = 0: capteur inactif

Quant aux LEDs, elles sont allumées par défaut. Si vous désirez qu'elles demeurent éteintes, vous reliez l'entrée LED du module GY-31 à la masse, pour que sa tension soit nulle.

Connexions du module GY-31 au Rasperry Pi

Voici comment j'ai branché le module GY-31 à mon Raspberry Pi:

  • Broche GND du module GY-31: Broche GND (#6) du Raspberry Pi
  • Broche VCC du module GY-31: Sortie 3,3 V (#1) du Raspberry Pi
  • Broche S0 du module GY-31: Broche GPIO 27 (#13) du Raspberry Pi
  • Broche S1 du module GY-31: Broche GPIO 22 (#15) du Raspberry Pi
  • Broche S2 du module GY-31: Broche GPIO 23 (#16) du Raspberry Pi
  • Broche S3 du module GY-31: Broche GPIO 24 (#18) du Raspberry Pi
  • Broche OUT du module GY-31: broche GPIO 25 (#22) du Raspberry Pi
  • Broche LED du module GY-31: pas branchée
Script en Python:

Le script ci-dessous affiche tour à tour la valeur mesurée pour le rouge, le vert, le bleu et la totalité de la lumière captée.

Aux lignes 31 et 32, je règle le module pour que la fréquence du signal de sortie ne soit que 2% de la valeur maximale possible, en suivant l'hypothèse qu'un signal lent sera plus facile à mesurer avec une bonne précision. Les résultats semblent quand même très bons si vous réglez le capteur à 100% de la fréquence. 

Aux lignes 37 et 38, j'utilise la fonction GPIO.wait_for_edge afin de chronométrer le temps nécessaire pour que le signal de sortie du module effectue 10 oscillations. C'est ce temps qui est affichée comme résultat: une petite valeur correspond à une forte intensité lumineuse.

- -

Les résultats obtenus dépendent de la lumière ambiante et de la distance entre le capteur et la surface dont on désire connaître la couleur. Pour minimiser les perturbations, j'ai placé le capteur au fond d'un récipient sombre qui bloque la lumière ambiante et maintient une distance constante entre le capteur et la surface colorée.


J'ai effectué des tests avec des cartons de couleur vive. En utilisant les mesures des différents paramètres pour chaque carton, on peut faire en sorte que le programme reconnaît le carton rouge, le carton vert, etc. (j'ai laissé un exemple aux lignes 66 et 67 du script).




Sources: je me suis inspiré de ce projet publié sur Electronics Hub.


À lire également:

Yves Pelletier (TwitterFacebook

1 commentaire:

  1. Ce code ne peut qu'être appliqué a Raspberry pi. Moi je veux l'appliqué a esp8266.
    Voici le code :

    from machine import Pin
    from time import sleep
    import utime

    s0 = Pin(12, Pin.OUT)
    s1 = Pin(13, Pin.OUT)
    s2 = Pin(00, Pin.OUT)
    s3 = Pin(02, Pin.OUT)
    ouT = Pin(14, Pin.IN)
    frequency = 0
    # reglage de la frequence de sortie du capteur (2% du maximum)
    s0.on()
    s1.on()


    def get_frequency():
    frequency = machine.time_pulse_us(ouT,0)
    utime.sleep_ms(20)
    return frequency

    while(1):
    s2.value(0) # s2.off()
    s3.value(0)
    red = get_frequency()


    s2.value(1) # s2.on()
    s3.value(1)
    green = get_frequency()


    s2.value(0)
    s3.value(1)
    blue = get_frequency()
    #frequency= machine.freq(ouT,0)
    print('R= ', red,"G= ", green, "B= ", blue)
    print(" ")
    #time.sleep(5)
    utime.sleep_ms(100)

    RépondreSupprimer