Arduinoカラー検出
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
<図>
プロジェクト
これは簡単なチュートリアルで、ArduinoとTCS 3200などのセンサーを使用して色を読み取る方法を探ります。アイデアは、オブジェクトの色を検出し、それをLCDに表示することです。このプロジェクトは、オブジェクトの色に基づいて適切なアクションを選択するロボットアームとなる、より大きなプロジェクトのコンポーネントです。上のブロック図は主要なコンポーネントを示しています。
以下のビデオは、最終的なプロジェクトが機能していることを示しています。
ステップ1:BoM
以下のリンクと価格は参考用です。
- Arduino Nano(US $ 8.00)
- TCS3200カラーセンサーモジュール(US $ 9.00)
- IIC / I2C / TWI 1602シリアルブルーバックライトLCDモジュール(US $ 8.00)
- ブレッドボード(2.00米ドル)
- ケーブル
ステップ2:TSC3200カラーセンサー <図>
データセットに記載されているように、TCS3200は、構成可能なシリコンフォトダイオードと単一のモノリシックCMOS集積回路上の電流-周波数変換器を組み合わせたプログラム可能な色光-周波数変換器です。
出力は方形波(50%デューティサイクル)で、周波数は光の強度(放射照度)に正比例します。フルスケール出力周波数は、2つの制御入力ピン(S0およびS1)を介して3つのプリセット値の1つでスケーリングできます。デジタル入力とデジタル出力により、マイクロコントローラーやその他の論理回路への直接インターフェースが可能になります。
<図>出力イネーブル(OE)は、マイクロコントローラー入力ラインの複数ユニット共有のために、出力をハイインピーダンス状態にします。 TCS3200では、光-周波数変換器が8 x8アレイのフォトダイオードを読み取ります。
- 16個のフォトダイオードには青いフィルターがあります
- 16個のフォトダイオードには緑色のフィルターがあります
- 16個のフォトダイオードには赤いフィルターが付いています
- 16個のフォトダイオードはフィルターなしでクリアです。
ピンS2とS3は、アクティブなフォトダイオードのグループ(赤、緑、青、透明)を選択するために使用されます。フォトダイオードのサイズは110μmx110μmで、中心は134μmです。
OE(有効)はGND(低)に接続する必要があります。
センサーはカプセル化されており、2.7〜5.5VDCで電力を供給される必要があります。 5VArduino出力を使用してセンサーに電力を供給します。センサーを適切に使用するために、センサーを横方向の光から隔離するための小さなゴム製リングを取り付けます。ホットグルーを使って固定しました。
<図>
ステップ3:ハードウェアを接続する <図>
TSC3200センサーを次のように接続します:
- S0 ==>ナノピンD4
- S1 ==>ナノピンD5
- S2 ==>ナノピンD6
- S3 ==>ナノピンD7
- OUT ==>ナノピンD8
- EN ==> GND
- VCC ==> + 5V
- GND ==> GND
I2C LCD 2/16シリアルディスプレイを接続します:
- SDA ==>ナノピンA4
- SCL ==>ナノピンA5
BreadBoardにArduinoNanoをインストールします。 Nano5V出力とGNDを両方の電源レールに接続します。
ステップ4:Arduinoコード <図>
最初に定義するのは、上記の表で定義されている周波数スケーリングです。そのためにピンS0とS1が使用されます。出力周波数のスケーリングは、さまざまな周波数カウンターまたはマイクロコントローラーのセンサー読み取り値を最適化するのに役立ちます。 S0とS1を両方ともHIGH(100%)に設定します:
digitalWrite(s0、HIGH); digitalWrite(s1、HIGH);
次に行うことは、フォトダイオードが読み取る色(赤、緑、または青)を選択することです。そのために、制御ピンS2とS3を使用します。フォトダイオードは並列に接続されているため、S2とS3をLOWとHIGHに異なる組み合わせで設定すると、上の表に示すように、異なるフォトダイオードを選択できます。
digitalWrite(s2、LOW); digitalWrite(s3、LOW);赤=pulseIn(outPin、LOW); //色のREDコンポーネントを読み取るdigitalWrite(s2、HIGH); digitalWrite(s3、HIGH); grn =pulseIn(outPin、LOW); //カラーdigitalWrite(s2、LOW);のGREENコンポーネントを読み取りますdigitalWrite(s3、HIGH); blu =pulseIn(outPin、LOW); //色の青のコンポーネントを読み取る
最終的なコードでは、RGBコンポーネントのそれぞれを数回読み取り、平均をとるため、読み取り値の1つが不良である場合にエラーを減らすことができます。
3つのコンポーネント(RGB)を取得したら、それを定義する必要があります。以前にプロジェクトを調整するためにそれを行う方法。既知の色のテスト用紙またはオブジェクトを使用して、生成された3つのコンポーネントを読み取ることができます。
あなたは私のものから始めて、あなたの光のレベルのパラメータを変えることができます:
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()内で、LCDでの表示読み取り値を1秒ごとに定義します。
完全なコードは私のGitHubにあります。
ステップ5:結論 <図>
いつものように、このプロジェクトが、他の人がエレクトロニクス、ロボット工学、IoTのエキサイティングな世界で自分の道を見つけるのに役立つことを願っています!
更新されたファイルについては、GitHubにアクセスしてください:Color Detector
その他のプロジェクトについては、私のブログMJRoBot.org
をご覧ください。世界の南からのサルド!
次のチュートリアルでお会いしましょう!
ありがとう、
マルセロ
コード
- コードスニペット#2
- コードスニペット#3
コードスニペット#2 プレーンテキスト
digitalWrite(s2、LOW); digitalWrite(s3、LOW);赤=pulseIn(outPin、LOW); //色のREDコンポーネントを読み取るdigitalWrite(s2、HIGH); digitalWrite(s3、HIGH); grn =pulseIn(outPin、LOW); //カラーdigitalWrite(s2、LOW);のGREENコンポーネントを読み取りますdigitalWrite(s3、HIGH); blu =pulseIn(outPin、LOW); //色の青のコンポーネントを読み取る
コードスニペット#3 プレーンテキスト
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";}
Github
https://github.com/Mjrovai/Color-Detectorhttps://github.com/Mjrovai/Color-Detector 回路図
Hw
https://github.com/Mjrovai/Color-Detector/blob/master/Color%20Detector.fzz製造プロセス