明るさセンサーをつかってみた

また スイッチサイエンス さんからいろいろ部品を買ってしまいました。

今回は 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 のマニュアルをみてください。