対象物の色を判別するRGBカラーセンサ TCS34725を使ってみました。
読み取った色情報をシリアル出力します。
色情報を使ってRGB LED(WS2812)を光らせます。
今回紹介するもの
RGBカラーセンサー(TCS34725)
特徴
電源電圧 | 3.3 ~ 5V |
通信 | I2C (Address 0x29) |
ライブラリにはAdafruit製を使用しています。
I2Cアドレスの指定はデフォルトで、29(h)なので明示的に指定しなくても使うことができます。
ピン配置
外観
使用感
対象物をセンサーの前に持ってくるとカラー情報をRGBで出力してくれます。
Adafruit製のライブラリを使用しましたが、とても簡単に使うことができました。
基板のLEDの反射加減では正しく色が読み取れないことがあり、センサー側に正しく色を読み取らせるためには距離や角度などの工夫が必要です。
被写体との距離が2cm未満では白っぽくなり、4cm以上では反射光がなくなってしまいます。
少し扱いが難しいです。
基板のLEDはGNDにつなぐことで消灯できます。
発光したLEDの光を当てることで色情報を読み取ることができます。
後日追記することにします。
準備
使うもの
画像 | 名称、型番 | 用途 |
---|---|---|
RGBカラーセンサ TCS34725 | 対象物の温度を8×8の平面に測定し、 配列に保存します。 | |
RP2040-Zero | TCS34725から色情報を読み取り 基板上のWS2812に読み取った情報で発光させます。 | |
ブレッドボード | 配線します | |
– | ジャンパワイヤ数本 | 配線します |
ライブラリ
ライブラリマネージャから以下2件のライブラリをインストールします。
SPI、I2Cのどちらで通信する場合も同じライブラリを使用します。
ライブラリ名 | 検索 | 確認時のバージョン |
---|---|---|
Adafruit TCS34725 by Adafruit | TCS34725 | 1.4.2 |
動作
説明
TCS34725で読み取った色情報を使って、RP2040-ZeroのWS2812で表現します。
シリアル出力にも色情報を出力しています。
色情報は各色16bit情報で読み取ります。
WS2812で使用するために8ビットの右シフト(1/256)にリスケーリングしています。
配線
RP2040-Zero | 配線 | TCS34725 |
---|---|---|
3V3 | 赤 | VIN |
GND | 黒 | GND |
GPIO0(I2C0 SDA) | 青 | SDA |
GPIO1(I2C0 SCL) | 黄 | SCL |
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【マイコン基板】
RP2040-Zero
【スケッチの説明】
TCS34725 から読み取った温度アレイ情報をWS2812(8x8 Matrix)に表示します。
温度ごとに表現する色はスケッチの後半で設定しています。
【ライブラリ】
Raspberry Pi Pico / RP2040 > Generic RP2040 または、Waveshare RP2040 Zero
Adafruit TCS34725 by Adafruit 1.4.2
Adafruit NeoPixel by Adafruit 1.11.0
【準備】
Raspberry Pi Pico <-> TCS34725
3V3 <-> VIN
GND <-> GND
GPIO0(I2C0 SDA) <-> SDA
GPIO1(I2C0 SCL) <-> SCL
WS2812 はRP2040上の実装WS2812を使用します。
【バージョン情報】
2023/10/20 : 新規
**********************************************************************/
#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <Adafruit_NeoPixel.h>
#define DIN_PIN 16 // NeoPixel の出力ピン番号はGP16
#define LED_COUNT 1 // LEDの連結数
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
/* Initialise with specific int time and gain values */
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_614MS, TCS34725_GAIN_1X);
void setup(void)
{
Serial.begin(115200);
//I2Cピン設定 I2C0を使用する
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(); //NeoPixel制御開始
}
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(" ");
//TCS34725の色情報をWS2812で使用できるビット数にリスケーリング
r = r >> 8;
g = g >> 8;
b = b >> 8;
pixels.setPixelColor(0, pixels.Color(r, g, b));
pixels.show();
}
結果
結果を撮影しました。
判別の色サンプルにフィルム付箋を使用しています。
TCS34725で読み取った色情報を RP2040-Zeroの WS2812で表現しています。
蛍光色のため全般的に白みを帯びた色判別がされているようです。
読み取りの周期と応答速度は600mSec程度です。
コメント