おもちゃラボ

Unityで遊びを作ってます

【Arduino】カラーセンサ(TCS230 / TCS3200)を使って色を調べる

Arduinoとカラーセンサを使って色を調べる方法を紹介します。カラーセンサはAmazonで販売されているTCS230 TCS3200を使用しました。

f:id:nn_hokuson:20170403192557j:plain

カラーセンサの仕組み

カラーセンサは赤色を検知するセンサと緑色を検知するセンサと青色を検知するセンサの3つから構成されています。この3つのセンサを順番に調べることで、RGBの値を取得します。

f:id:nn_hokuson:20170401215154p:plain:w500

RGBのセンサのうちどのセンサを有効にするかは、S2とS3のピンの組み合わせで指定します。

S2 S3 Color
L L Red
L H Blue
H H Green

センサから得られるRGBデータはOUTピンから出力され、そのデータは周波数として取得できます。ArduinoではpulseIn関数を使って簡単に周波数を調べることができます。

S0とS1ピンは色情報を周波数に変換するときのスケーリングの割合を指定するのに使用します。下のプログラムでは2%の変調をしています。

S0 S1 Scaling
L L Power Down
L H 2%
H L 20%
H H 100%

カラーセンサとArduinoをつなぐ回路図

カラーセンサとArduinoを接続する回路図は次のようになります。特に注意することはありませんが、S0〜S4をArduinoのポート4〜7、OUTピンをポート8に接続しています。

f:id:nn_hokuson:20170402165213p:plain:w400

Arduinoのプログラム

カラーセンサからの値を取得してRGBの情報を表示するプログラムは次のとおりです。

#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

int whiteR = 180;
int whiteG = 240;
int whiteB = 170;
int blackR = 20;
int blackG = 20;
int blackB = 16;

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);
  int r = pulseIn(sensorOut, LOW);
  //r = map(r, whiteR, blackR,0,255);
  delay(100); 

  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  int g = pulseIn(sensorOut, LOW);
  //g = map(g, whiteG, blackG,0,255);
  delay(100);
  
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  int b = pulseIn(sensorOut, LOW);
  //b = map(b, whiteB, blackB,0,255);
  delay(100);

  Serial.println(String(r) + "," + String(g) + "," + String(b) );
}

このプログラムではS2/S3でRGBのセンサを切り替えながら、各センサから得られる周波数をRGBの輝度に変換しています。

Arduinoで周波数を調べるにはplusIn関数を使います。plusIn関数はピンに入力されるパルスの時間を計測する関数で、入力がHIGHに変わると同時に時間の計測を始め、LOWに戻るまでの時間をマイクロ秒単位で返します。

pulseIn() - Arduino Reference

f:id:nn_hokuson:20170401230231p:plain:w250

キャリブレーション

センサから得られる値はお使いの環境で多少変化すると思うので、キャリブレーションする必要があります。

白色の紙をセンシングした時のRGB値と、黒色の紙をセンシングした時のRGB値を調べて、whiteRGB、blackRGBの値に代入して下さい。

キャリブレーション値が得られたら、上のプログラムでコメントアウトしているmap関数の行のコメントを外して下さい。map関数はキャリブレーションした値を使って、センサからの値を0〜255の輝度値に変換します。

参考

カラーセンサTCS230 TCS3200の使い方に関しては、こちらのサイトを参考にさせていただきました。
howtomechatronics.com
circuitdigest.com