明るさセンサーをつかってみた
また スイッチサイエンス さんからいろいろ部品を買ってしまいました。
今回は TEMT6000明るさセンサ・モジュール を使ってちょっとしたアプリケーションを作ってみようと思います。このモジュールは SparkFun の製品で web 上でも使っているかたがたくさんいらっしゃいます。
実験してみる
リンク切れ?でデータシートを手に入れることができなかったので、ぶっつけ本番でセンサー値としてどの程度の範囲を示すのか実験してみました。回路は こちら にある図のとおりです。その結果がこちら。
- 部屋の電気のみ(蛍光灯): 30〜50くらい
- センサーを手で覆い隠す: 0〜5くらい
- 携帯電話のカメラのフラッシュをあてる: 200〜1000くらい
というわけで、0〜1023 の 10bit の範囲の値として取り扱うとうまくいきそうです。
processing と arduino をコラボる
実験結果をふまえて、簡単なアプリを作ってみます。アプリケーションの構成はこんな感じにしました。
つぎに、arduino と明るさセンサのつなぎ方です。これは完全に こちらの回路 をパクりました。ちがいは wiring か arduino かだけです。
それでは実装を見ていきます。
まずは arduino 側です。このアプリケーションにおける arduino の役割は、明るさセンサのセンサ値を読み取って PC へシリアル経由で送信する、100msec 間隔で、というシンプルな内容になっています。
int val;
void setup() {
Serial.begin(9600);
}
void loop() {
val = analogRead(0);
Serial.print(val, DEC);
Serial.println();
delay(100);
}
PC 上のユーザインターフェイスとしては Processing で作った小さなアプリケーションを用意しました。やってることは
- arduino から送信されてきた明るさセンサ値を受信
- 受信したセンサ値(文字列)を数値へ変換
- 表示している画面の背景色をセンサ値をもとにして変化させる
といった感じです。明るさセンサが明るいと思えばアプリケーションの画面が白に近づき、暗いと思えば黒に近づくというシンプルな内容になっています。
import processing.serial.*;
int LF = 10;
Serial port;
int value = 0;
void setup() {
println(Serial.list());
port = new Serial(this, Serial.list()[1], 9600);
port.bufferUntil(LF);
colorMode(HSB, 1023);
size(200, 200);
background(value);
}
void draw() {
background(value);
}
void serialEvent(Serial p) {
String s = trim(p.readString());
println(s);
value = int(s);
}
Processing 側のコードのポイントとしては、arduino の明るさセンサ値の幅が 10bit であることを考慮して、background() メソッドに与える引数値の幅も 10bit に変更している点です。colorMode(HSB, 1023) によって 10bit 幅へ変更しています。くわしくは Processing のマニュアルをみてください。