Arduinoとカラーセンサを使って色を調べる方法を紹介します。カラーセンサはAmazonで販売されているTCS230 TCS3200を使用しました。
カラーセンサの仕組み
カラーセンサは赤色を検知するセンサと緑色を検知するセンサと青色を検知するセンサの3つから構成されています。この3つのセンサを順番に調べることで、RGBの値を取得します。
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に接続しています。
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に戻るまでの時間をマイクロ秒単位で返します。
キャリブレーション
センサから得られる値はお使いの環境で多少変化すると思うので、キャリブレーションする必要があります。
白色の紙をセンシングした時のRGB値と、黒色の紙をセンシングした時のRGB値を調べて、whiteRGB、blackRGBの値に代入して下さい。
キャリブレーション値が得られたら、上のプログラムでコメントアウトしているmap関数の行のコメントを外して下さい。map関数はキャリブレーションした値を使って、センサからの値を0〜255の輝度値に変換します。
参考
カラーセンサTCS230 TCS3200の使い方に関しては、こちらのサイトを参考にさせていただきました。
howtomechatronics.com
circuitdigest.com