S9706というカラーセンサをArduinoで使ってみます。
S9706とは
浜松ホトニクス製のカラーセンサです。
12bitでRGBの値が読めます。
秋月電子のリンク
浜松ホトニクスのリンク
配線
S9706はI2Cなどではないため普通のデジタル入出力ピンで使えます。
S9706のピン配置は以下のようになっています。(データシートより)
1,4,5,6をデジタルピンに、2を5Vまたは3.3Vに、3をGNDに接続してください。
表面実装部品ですが、1.27mmのSOP変換基板などを使えばブレッドボード上で使えます。
S9706の上下に気を付けてください。二本線のようなものが見える方が上です。
プログラム
以下のようなプログラムを書きます。
データの読み取りの仕組みについてはデータシートの「タイミングチャート」というところをご確認ください。
S9706.ino
#define RANGE 2
#define GATE 3
#define CK 4
#define DOUT 5
int red, green, blue; // RGB値を格納する変数
int tg = 50; // 積分時間
void setup() {
pinMode(RANGE, OUTPUT);
pinMode(GATE, OUTPUT);
pinMode(CK, OUTPUT);
pinMode(DOUT, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(GATE, LOW);
digitalWrite(CK, LOW);
delayMicroseconds(2000);
// 感度設定
digitalWrite(RANGE, HIGH);
// 光量の積算を開始
digitalWrite(GATE, HIGH);
delay(tg + 1); // 積分時間だけ待つ
// 光量の積算を終了
digitalWrite(GATE, LOW);
delayMicroseconds(4);
// 測光データを取得
red = readColor();
green = readColor();
blue = readColor();
digitalWrite(GATE, HIGH);
Serial.print(red);
Serial.print(" ");
Serial.print(green);
Serial.print(" ");
Serial.println(blue);
}
// 12ビットのデータを読み取る
int readColor() {
int result = 0;
for (int i = 0; i < 12; i++) {
digitalWrite(CK, HIGH);
delayMicroseconds(1);
result |= (digitalRead(DOUT) << i);
digitalWrite(CK, LOW);
delayMicroseconds(1);
}
delayMicroseconds(3);
return result;
}
これでRGB値を取得することができました!
適切な積分時間・感度を探してみてください!