Arduino NanoとTCS3200センサーによる物体の色検出
必要な部品と用品
| Arduino Nano R3 | ×1 |
| TCS3200 カラーセンサーモジュール | ×1 |
| I2C接続 16x2 LCDディスプレイ(青バックライト) | ×1 |
| ブレッドボード | ×1 |
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
このチュートリアルでは、ArduinoとTCS3200センサーを使用して色を読み取る方法を解説します。物体の色を検出し、その結果をLCDに表示します。このプロジェクトは、物体の色に基づいて適切なアクションを選択するロボットアームの構成要素として位置づけられます。
Step 1: 部品表 (BoM)
以下の価格とリンクは参考用です。
- Arduino Nano(約8ドル)
- TCS3200カラーセンサーモジュール(約9ドル)
- I2C/TWI 1602シリアル青バックライトLCDモジュール(約8ドル)
- ブレッドボード(約2ドル)
- ジャンパーケーブル類
Step 2: TCS3200カラーセンサーの仕組み
データシートによると、TCS3200は設定可能なシリコンフォトダイオードと電流-周波数変換器を単一のモノリシックCMOS集積回路上に組み合わせた、プログラマブルなカラー光-周波数コンバーターです。
出力は50%デューティサイクルの方形波で、周波数が光強度(照度)に直接比例します。フルスケール出力周波数は、2つの制御入力ピン(S0、S1)を介して3つのプリセット値のいずれかにスケーリング可能です。デジタル入出力により、マイクロコントローラやその他のロジック回路との直接インターフェースが可能です。
TCS3200では、光-周波数コンバーターが8×8のフォトダイオードアレイを読み取ります:
- 16個のフォトダイオードにブルーフィルター
- 16個のフォトダイオードにグリーンフィルター
- 16個のフォトダイオードにレッドフィルター
- 16個のフォトダイオードはクリア(フィルターなし)
ピンS2とS3で、どのグループのフォトダイオード(赤、緑、青、クリア)をアクティブにするかを選択します。フォトダイオードのサイズは110μm×110μm、中心間隔は134μmです。
OE(出力イネーブル)ピンはGND(LOW)に接続しておく必要があります。センサーは2.7〜5.5V DCで動作し、ここではArduinoの5V出力を使用します。横方向からの光を遮断するため、センサーの周囲に小さなゴムリングを取り付け、ホットグルーで固定すると精度が向上します。
Step 3: ハードウェア接続
TCS3200センサーの接続
- S0 → NanoピンD4
- S1 → NanoピンD5
- S2 → NanoピンD6
- S3 → NanoピンD7
- OUT → NanoピンD8
- EN → GND
- VCC → +5V
- GND → GND
I2C LCD(16x2)の接続
- SDA → NanoピンA4
- SCL → NanoピンA5
Arduino Nanoをブレッドボードに取り付け、5V出力とGNDを両方の電源レールに接続します。
Step 4: Arduinoコード
周波数スケーリングの設定
S0とS1ピンで出力周波数のスケーリングを設定します。ここでは両方をHIGH(100%)に設定:
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
色成分の読み取り
S2とS3の組み合わせで読み取る色成分を切り替えます:
// 赤成分
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = pulseIn(outPin, LOW);
// 緑成分
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
grn = pulseIn(outPin, LOW);
// 青成分
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
blu = pulseIn(outPin, LOW);
実際のコードでは、各RGB成分を複数回読み取って平均化し、ノイズの影響を軽減します。
色の判定(キャリブレーション)
既知の色のテスト用紙や物体を使って、各色のRGB値の範囲を事前に調べます。以下は一例です(環境光によって値は変化します):
void getColor() {
readRGB();
if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16)
color = "WHITE";
else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125)
color = "BLACK";
else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70)
color = "RED";
else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85)
color = "GREEN";
else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38)
color = "YELLOW";
else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65)
color = "BLUE";
else
color = "NO_COLOR";
}
ここでは白、黒、赤、緑、黄、青の6色を定義しています。環境光が暗くなると、パラメータの値は大きくなる傾向があります。loop()内では、1秒ごとにLCDへ判定結果を表示します。完全なコードはGitHubで公開されています。
Step 5: まとめ
このプロジェクトが、電子工作、ロボティクス、IoTのエキサイティングな世界への一助となれば幸いです!
- 最新ファイル:GitHub - Color Detector
- その他のプロジェクト:MJRoBot.org
南の世界からサルードス!
次回のチュートリアルでお会いしましょう。
Thank you,
Marcelo
製造プロセス
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduino UNOとOLEDディスプレイでクラシックPongゲームを自作:ステップバイステップチュートリアル
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- Arduinoで作る自作デジタルペット「Tamaguino」─ 3Dプリンター製ケース付き完全ガイド
- スマートワイヤレス照明スイッチコントローラー:Arduinoで物理スイッチを遠隔操作
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- Arduino Nanoで作るスマートな動体検知水鉄砲
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト
- Arduino向日葵:太陽を追尾する電子ヒマワリの製作
- Arduinoで自作RCポルシェカー:ステップバイステップガイド