ArduinoでTCS230/TCS3200カラーセンサを使った色検出 - 完全ガイド
このArduinoチュートリアルでは、TCS230 / TCS3200カラーセンサを使用してArduinoで色を検出する方法を学びます。詳細については、以下のビデオまたは文章チュートリアルをご覧ください。 TCS230は8×8のフォトダイオードアレイで色光を検知します。電流-周波数変換器により、フォトダイオードからの読み取り値が、光強度に比例した周波数の矩形波に変換されます。Arduinoでこの矩形波出力を読み取ることで色情報を得られます。 64個のフォトダイオードには3種類のカラーフィルタがあります: 各16個のフォトダイオードは並列接続されており、2つの制御ピンS2, S3でどのグループを読み取るか選択します(下表参照)。例えば赤を検出したい場合はS2, S3を両方Lowに設定します。 さらにS0, S1ピンで出力周波数のスケーリング(100%, 20%, 2%)が可能です。これにより様々な周波数カウンタやマイクロコントローラに最適化できます。 説明: 4つの制御ピンを出力、センサ出力を入力に設定。周波数スケーリングを20%に設定(S0=High, S1=Low)。ループ内でS2, S3を切り替えてR, G, B各フィルタ群の周波数を シリアルモニタを実行すると周波数値が表示されます。値は周波数スケーリング設定と周囲光に依存します。各色の感度差により3値は異なります(データシートのスペクトル応答特性参照)。 色のついた物体をセンサにかざすと値が変化します。例えば赤い物体を近づけると、赤チャンネルの値が(私の環境では)70前後から25前後に低下します。 検出値を一般的なRGBモデル(0-255)に変換するには 緑と青についても同様に、各色の最小・最大値を測定してマッピング範囲を決定します。 色精度は簡易的なプロジェクト向けですが十分実用的です。次の応用例として、Arduino自動色選別機の作成チュートリアルも公開予定です。 ご質問はコメント欄でお気軽にどうぞ。私のArduinoプロジェクトコレクションもぜひチェックしてください。概要
TCS230/TCS3200カラーセンサの仕組み

色フィルタの仕組み


Arduinoへの接続

必要なコンポーネント
TCS230カラーセンサ ソースコード
基本版: 周波数値の取得
pulseIn()で測定し、シリアルモニタに出力します。/* Arduino Color Sensing Tutorial
* by Dejan Nedelkovski, www.HowToMechatronics.com */
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// 周波数スケーリング 20%
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
Serial.begin(9600);
}
void loop() {
// 赤フィルタ選択
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
frequency = pulseIn(sensorOut, LOW);
Serial.print("R= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 緑フィルタ選択
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
Serial.print("G= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 青フィルタ選択
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
Serial.print("B= ");
Serial.print(frequency);
Serial.println(" ");
delay(100);
}

RGBモデル(0-255)への変換
map()関数を使用します。環境に合わせてキャリブレーションが必要です。// 周波数値をRGB 0-255にマッピング
// 例: 赤の場合、周波数70→0, 25→255 にマッピング
frequency = map(frequency, 25, 70, 255, 0);
最終版: RGB値出力コード
/* Arduino Color Sensing Tutorial
* by Dejan Nedelkovski, www.HowToMechatronics.com */
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
Serial.begin(9600);
}
void loop() {
// 赤
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 25, 72, 255, 0);
Serial.print("R= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 緑
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 30, 90, 255, 0);
Serial.print("G= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 青
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 25, 70, 255, 0);
Serial.print("B= ");
Serial.print(frequency);
Serial.println(" ");
delay(100);
}
製造プロセス
- Raspberry Pi光センサーチュートリアル - LDRを配線してPythonで光量を読み取る
- Arduinoで作るセキュアなRFIDロック – ステップバイステップガイド
- K30 CO2センサで室内空気質をリアルタイム監視する
- デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
- Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト
- Arduino RGBカラーミキサーの製作 - ステップバイステップチュートリアル
- 音楽同期LEDイルミネーションで新年を盛り上げよう – Arduino Nano + NeoPixel
- Arduino Nanoと指紋センサーで作るバイオメトリクス認証システム – 完全チュートリアル
- Arduino初心者チュートリアル01: 最初のプロジェクトを始めよう