対象物の色を判別するRGBカラーセンサ TCS34725を使ってみました。
認識した色情報をI2Cから読み出します。
色情報を使ってRGB LED(WS2812)を光らせます。
記事の概要
TCS34725 RGBカラーセンサを使った内容を記事にしました。
TCS34725についての簡単な機能説明、使った時の使用感を記載しています。
Arduino環境で作業するための必要なものと環境作成について記載しています。
読み取った色情報をWS2812を使って色コピーをするサンプルスケッチを紹介しています。
RGBカラーセンサ (TCS34725)
簡単紹介

対象物の色を読み取ります。
I2Cからカラーコードで読み取ることができます。
◆関連記事
ピン配置

外観

使ってみた
◆開発
Arduino製のライブラリを使用しました。
モジュールとはI2Cで通信をします。
I2Cアドレスは29(h)ですが、ライブラリ内で29(h)固定で接続するためにアドレスを意識する必要はありません。
◆色の読み取り
対象物をセンサーの前にかざすとカラー情報を読み取ることができます。
光の3原色(赤、緑、青)を各16bit, 65536階調で読み取ります。
モジュールには白色LEDが実装されていて対象物に反射した光を読み取ります。
色の読み取りは距離が重要で、2~3cm付近が読み取りの精度が高まります。
近いと誤認識が多く遠いと読み取りができません。
正確な色を読み取るために適度な距離を保つことが難しいモジュールです。
読み取った色情報をWS2812を使い色再現をしている様子です。
うまく撮影できていませんが、主観では何となく読み取れている感じです。

自発色するLEDなどは、モジュールのLEDを消灯して読み取ります。
LEDテープの読み取りをした様子です。
自発色するLEDなどの方が色誤差は小さいように思います。
感覚的には青系の読み取りは精度が高めに思います。

読み取りのビット長は大きいですが、実際の読み取りでは各色10~12bit(約4000)程度までで、この値を超えるくらいの値を読み取ったときは色の誤認識でした。
今回はWS2812で色比較しながら距離の調整をしていましたが、対象物とWS2812の比較をしない状態では読み取った値の正誤の判断は難しいです。
mm単位の距離調整が必要で気難しいモジュールでした。
準備
◆使うもの
画像 | 名称、型番 | 用途 |
---|---|---|
![]() | RGBカラーセンサ TCS34725 | 対象物から色情報を読み取ります |
![]() | Raspberry Pi Pico | TCS34725から色情報を読み取り 基板上のWS2812に読み取った情報で発光させます |
![]() | WS2812 | 読み取った色の再現に使います |
![]() | ブレッドボード | 配線します |
– | ジャンパワイヤ数本 | 配線します |
ライブラリ
ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|
Adafruit TCS34725 by Adafruit | TCS34725 | 1.4.2 |
Adafruit NeoPixel by Adafruit | nexpixel | 1.12.3 |
動作
説明
TCS34725で読み取った色情報を使って、WS2812 LEDモジュールを点灯させます。
シリアル出力にも色情報を出力しています。
色情報は各色16bit情報で読み取ります。
WS2812の色表現は各色8bitなので、読み取った情報を8ビットの右シフト(1/256)にリスケーリングしています。
配線

TCS34725のLED照明を消灯する場合は、LEDピンとRaspberry Pi PicoのGNDを接続します。
スケッチ
#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <Adafruit_NeoPixel.h>
#define DIN_PIN (16)
#define LED_COUNT (1)
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);
void setup(void)
{
Serial.begin(115200);
Wire.setSDA(0);
Wire.setSCL(1);
if (tcs.begin())
{
Serial.println("Found sensor");
}
else
{
Serial.println("No TCS34725 found ... check your connections");
while (1);
}
pixels.begin();
}
void loop(void)
{
uint16_t r, g, b, c;
tcs.getRawData(&r, &g, &b, &c);
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.println(" ");
r = r >> 8;
g = g >> 8;
b = b >> 8;
pixels.setPixelColor(0, pixels.Color(r, g, b));
pixels.show();
}
結果
結果を撮影しました。
フィルム付箋の色を読み取りました。
黄、橙、桃、水色ですが、水色の読み取りは誤認識少い印象です。

自発色するテープLEDの色を読み取りました。
TCS34725の照明用LEDはOFFにしています。
(LEDピンをRaspberry Pi PicoのGNDに接続します)
読み取り誤差はあまりないように思いますが、こちらも正確に読み取るための距離間はシビアです。

コメント