\【期間限定】キーボード付き Surface Pro 8 特別版がお買い得 ~9/30(金) /

Arduino 入門 Lesson 67 【カラーセンサ】

arduino-lesson66-00Arduino入門編
スポンサーリンク
子供と一緒に始める マイコンプログラム
Arduino 入門
Lesson 67
【カラーセンサ】

こにんちは、管理人のomoroyaです。

センサーの使い方の基本を学習する入門編。

久しぶりに、入門編更新・・・。

※補足情報
スケッチの一部が誤記となっていたため修正しました。

 

世の中には、まだまだ色々なセンサーがあります。

これからも、色々なセンサーで遊んでいきます。

本記事はLesson 67 【カラーセンサ】です。

名前の通り色を判別できるセンサ。

カラー光周波数コンバータチップTCS3200D(TCS230)を搭載したセンサモジュールとなります。

 

カラーセンサ」は8×8からなるフォトダイオードのアレイが組み込まれたチップにて光を検知。

フォトダイオードで得られたRGBデータは周波数に変換されて出力されます。

その周波数の違いによって色を識別するセンサとなります。

 

以下が同等品。
※prime対応品ではありません

カラーセンサはAmazonでは購入しずらいかもしれません。

 

Arduino入門編の解説にて使用しているArduinoは互換品です。

互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

正規品の本体単品がほしい方はこちらとなります。

 

スポンサーリンク

はじめに

本Lessonで使用する「カラーセンサ」は「カラー光周波数コンバータチップTCS3200D(TCS230)」が実装されたモジュール。

TCS3200、TCS230にて検索すればデータシートはすぐに見つけることができると思います。

使用用途としては、自動で色分けするために使うなどに使えそうです。

 

Lesson 67 目標

本Lessonの目標は以下です。

1.カラーセンサの使い方を学習する
2.カラーセンサの仕組みを理解する(理解しなくてもOKです)
3.カラーセンサを動かすスケッチを描く
4.カラーセンサを動かして遊ぶ

いつものように、遊ぶことが重要です。

 

カラーセンサ」ですが、Arduinoでの制御はそれほど難しくなりません。

周波数をArduinoで取得すればよいので、「pulseIn()関数」利用できます。

 

準備

ではLessonの準備に取り掛かりましょう。

電子部品はカラーセンサのみ。

Processingと組み合わせて検出した色をパソコン画面に視覚的に表示するのも面白いかもと思います。

 

必要なもの

※ブレッドボードはセンサとUNOを直接つなぐ場合不要です。
※ジャンパワイヤーは「M-M」「M-F」を必要に応じて使い分けてください。

 

Jumper wire、抵抗は今後も頻繁に利用します。

Jumper wireはできれば、「オス-メス オス-オス メス –メス」の3種類を揃えておくことをお勧めします。

短めが使いやすい場合も。

 

抵抗も単品で揃えるよりはセットをおすすめします。

 

使用部品説明

カラーセンサについて説明していきます。

 

カラーセンサ 実物写真

下の写真がカラーセンサモジュールの実物写真です。

本Lessonで使用するものは、TCS3200のチップが実装されたモジュール。

はずれを引いたのか?

信号ピンの名前が印字されていません・・・。

上側(左から):GND、OE、S1、S0
下側(左から):VCC、OUT、S2、S3

だと思います。

arduino-lesson66-01

 

カラーセンサ 回路図

カラーセンサの回路図を示します。

回路に興味がないかたは必ず飛ばし読みしてください。

原理
8×8のアレイで構成されたフォトダイオードにて光を検知。
検知した光を周波数に変換して出力。
8×8のアレイで構成されたフォトダイオードには3つのカラーフィルタを搭載。
64個のフォトダイオードの内訳は
16個:R用フィルタ
16個:G用フィルタ
16個:B用フィルタ
16個:フィルターなし
フィルタ処理することで、高いRGB分光特性と色判別を可能としている。制御としては
S2とS3の制御ピンにてRGBに対応したフォトダイオードを選択読むことが可能

 

■アレイ構成

下図に示すようにTCS3200のチップに64個のフォトダイオードがアレイとして実装されています。

R、G、B、クリアが、それぞれ16個×4の64個構成のアレイとなっています。

arduino-lesson66-02

 

■ブロックダイアグラム

フォトダイオードの電流を周波数に変換して出力します。

arduino-lesson66-03

 

■詳細回路図

気が向いたらおっかけて掲載予定。

回路図作成中

 

カラーセンサ 仕様

遊び、学習で使う分には気にする特性はとくにありません。

■仕様抜粋(一例:ものによります・・・)

項目仕様
供給電圧2.7V ~ 5.5V(normal 5.0V)
動作電流TYP:1.4mA(power on) / MAX:0.1μA(power down)
応答に対する温度係数λ ≦ 700nm , -25℃ ≦ Ta ≦ 70℃
動作温度-40℃ ~ 70℃

 

■Terminal Function

arduino-lesson66-04

Terminal NameI/ODescription
GNDGND
OEIEnable (Active Low)
OUTO出力
S1、S2I出力周波数のスケーリング割合設定
S3、S4Iフォトダイオードの選択設定
VDDVDD

 

■S0、S1 出力の接続先(マイクロコントローラなど)にあわせて最適化

S0S1出力周波数スケーリング
LLPower down
LH2%
HL20%
HH100%

 

■S2、S3 フォトダイオードの選択

S2S3選択されるフォトダイオード
LLRed
LHBlue
HLClear(no filter)
HHGreen

 

TCS3200TCS230にて検索すればデータシートはすぐに見つけることができると思います。

本Lessonは遊び、学習を想定しています。

Arduinoの仕様範囲内で使用していれば問題になることもありません。

遊び、学習以外での使用用途をお考えの場合はデータシートを必ず確認しましょう。

 

実践 回路作成とコード作成

最初に回路図を確認してください。

次に、回路図に合わせて部品を接続します。

最後にコードを書いて、カラーセンサを動かしていきましょう。

 

Arduinoのピン配置を確認したい方は番外編02を参照してください。

 

回路図

Arduinoの使用ピンは以下。

  • デジタル入力:11
  • デジタル出力:3、5、7、8
  • 5V、GND

 

回路図がこちら。

カラーセンサ」のFriztingパーツがないので自作予定です。

自作の過程を記事にしようかと思案中!

 

こちらがブレッドボード図。

補足情報
OEはActive LowのためVSSに接続しています。

arduino-lesson66-05

 

回路図は「fritzing」を利用しています。

「fritzing」の使い方は下記を参照してください。

 

接続

下図に示すように、用意した部品を使用して接続しましょう。

部品はカラーセンサ」のみとなります。

部品はわずかであるため接続は簡単です。

カラーセンサ」が少々大きいため、ブレッドボードを2つ使いました。

 

使用するポートは

  • デジタル入力:11
  • デジタル出力:3、5、7、8
  • 5V、GND

穴に挿入しづらいときは、ラジオペンチなどを使用してください。

arduino-lesson66-06

 

コードの書き込み

接続が終わったら、USBケーブルを使用してUNOにプログラムを書き込んで行きましょう。

コードを書き終えたら、いつでも利用できるように「ファイル」⇒「名前を付けて保存」で保存しておきましょう。

 

本LesssonのpulseIn()で値を取得するというのは下記を参考にしています。

https://create.arduino.cc/projecthub/SurtrTech/color-detection-using-tcs3200-230-84a663

コマンド説明

本Lessonでは、pulseIn()関数を使用します。

念のため、復習しておきましょう。

関数名
pulseIn(pin, value, timeout)pin:パルスを入力するピンの番号
value:測定するパルスの種類(High/Low)
timeout:タイムアウトまでの時間(単位:μs)省略可
戻り値:パルスの長さ(μs)例 パルスのH期間取得
xxx = pulseIN(pin, HIGH);

 

サンプルコード

本LessonのスケッチはpulseIn()とmap関数が重要。

カラーセンサの範囲が0~255とぴったりにはなりませんので、キャリブレーションする必要があります。

 

まず、初めに下記の部分はコメントアウトしておきます。

コメントアウトした状態で、実行。

白色と、黒色をかざしてRGBのminとmaxの値を取得してください。

//r = map(r, maxR, minR, 0, 255); //RGBをマッピングしなおし
//b = map(r, maxR, minR, 0, 255); //RGBをマッピングしなおし
//g = map(r, maxR, minR, 0, 255); //RGBをマッピングしなおし

 

minとmaxを取得できたら下記の部分を設定してください。

//RGBのminとMaxの設定
//一回目の測定で下記を設定後map関数でRGBを設定しなおし
//White setting
int minR = 0;
int minG = 0;
int minB = 0;
//Black setting
int maxR = 255;
int maxG = 255;
int maxB = 255;

 

上記の設定が終わったら下記のコメントアウトを削除して再実行。

上記過程にてRGBの範囲をキャリブレーションしています。

r = map(r, maxR, minR, 0, 255); //RGBをマッピングしなおし
g = map(r, maxG, minG, 0, 255); //RGBをマッピングしなおし
b = map(r, maxB, minB, 0, 255); //RGBをマッピングしなおし

 

//Lesson 67 Color Sensor
//Color Sensorで色を識別
//https://omoroya.com/

const int S0 = 3;      //S0変数に3を設定
const int S1 = 5;      //S1変数に5を設定
const int S2 = 8;      //S2変数に8を設定
const int S3 = 7;      //S3変数に7を設定
const int OutPut = 11; //OutPut変数に11を設定

//RGBのminとMaxの設定
//一回目の測定で下記を設定後map関数でRGBを設定しなおし
//White setting
int minR = 21;
int minG = 21;
int minB = 18;
//Black setting
int maxR = 196;
int maxG = 210;
int maxB = 163;


void setup() {
  pinMode(S0, OUTPUT);    //S0をOUTPUT指定
  pinMode(S1, OUTPUT);    //S1をOUTPUT指定
  pinMode(S2, OUTPUT);    //S2をOUTPUT指定
  pinMode(S3, OUTPUT);    //S3をOUTPUT指定
  pinMode(OutPut, INPUT); //OutPutをINPUT指定

  //初期値はClear(no filter設定)
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  
  //シリアル通信のデータ転送レートを9600bpsで指定
  Serial.begin(9600);
}

void loop() {

  //Red取得 S2S3:LL
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  int r = pulseIn(OutPut, LOW);     //REDのLowのパルス幅取得
  //r = map(r, maxR, minR, 0, 255); //RGBをマッピングしなおし
  delay(100); 
  
  //Green取得 S2S3:HH
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  int g = pulseIn(OutPut, LOW);     //BLUEのLowのパルス幅取得
  //g = map(g, maxG, minG, 0, 255); //RGBをマッピングしなおし
  delay(100);
  
  //Blue取得 S2S3:LH
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  int b = pulseIn(OutPut, LOW);     //BLUEのLowのパルス幅取得
  //b = map(b, maxB, minB, 0, 255); //RGBをマッピングしなおし
  delay(100);
  
  //シリアルモニタ表示
  Serial.print("R=");
  Serial.print(r);
  Serial.print(",G=");
  Serial.print(g);
  Serial.print(",B=");
  Serial.println(b);
}

 

動作確認

では、さっそく動作を確認していきます。

 

カラーセンサ」のセンサ部分に遮蔽物を置いてみてください。

 

■色とシリアルモニタとカラーセンサの状態

シリアルモニタカラーセンサの状態
arduino-lesson66-07arduino-lesson66-10
arduino-lesson66-08arduino-lesson66-11
arduino-lesson66-09arduino-lesson66-12

 

色紙を使っているので、はっきりとした色を出しにくいですが・・・
それぞれの色の数値が高くなっており
色を検出できていることがわかります!
色紙の赤は認識しやすいようです。

 

まとめ

本Lessonは、以下を目標としました。

1.カラーセンサの使い方を学習する
2.カラーセンサの仕組みを理解する(理解しなくてもOKです)
3.カラーセンサを動かすスケッチを描く
4.カラーセンサを動かして遊ぶ

 

カラーセンサは色を検出できるセンサ。

工夫次第では色々と遊ぶことができるセンサかなと思います。

 

Lesson 67 【カラーセンサ】 はここまで。

疑問点、質問などありましたら気軽にコメントください。

 

次回、Lesson 68は【GPSモジュール】です。

Arduino 入門 Lesson 68 【GPSモジュール】
本記事はLesson 68 【GPSモジュール】です。センサーの使い方の基本を学習する入門編。今回は、ちょっと古い型番ですがGPSモジュールを入手したのでさっそく遊んでみました。名前のとおりGPS衛星を補足し、衛星から色々な情報を取得できる…

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れ、間違いなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

 

Amazonでお得に買う方法

Amazonでお得に購入するなら、Amazonギフト券がおすすめです。

現金でチャージするたびに、チャージ額に応じたポイントが付与されます。

最大2.5%!!!(Amazonプライム会員ならさらにお得)

チャージ額(一回分)一般プライム会員
5,000円~19,999円0.5%1.0%
2,0000円~39,999円1.0%1.5%
40,000円~89,999円1.5%2.0%
90,000円~2.0%2.5%

さらに、初回チャージで1000ポイントもらえるキャンペーンも実施中!

\Amazonギフト券 1000ポイントキャンペーン/
Amazonチャージ 初回購入で1000ポイントキャンペーン

 

補足情報
コンビニ・ATM・ネットバンクが対象
購入は1円単位で可能

コメント

タイトルとURLをコピーしました