明るさセンサーをつかってみた
また スイッチサイエンス さんからいろいろ部品を買ってしまいました。
今回は 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 のマニュアルをみてください。