暗くなるとチカチカ点滅 LED (照度測定器)
簡単な説明
フォトトランジスタに流れる電流の大きさはほぼ照度に比例して変化します。抵抗で電流を電圧に変換して A/D 変換しても照度の測定はできますが、分解能が 10 ビット程度では照度の小さな変化を検知できません。そこで、タイマ IC を利用して電流を周波数に変換します。これをカウントすることで照度の測定ができますが、単純に LED やモーターを駆動させるだけでもちょっとした面白さがあります。
作り方 1ページ目 (全 1 ページ)

必要なパーツ

以下のパーツが必要になります。LED を点滅させるだけであれば Arduino は不要です。単三乾電池 4 本を直列にして 6V 電源にすれば動作します。照度測定のためにパルスの周波数を計測する目的で Arduino を利用しています。

回路図

タイマ IC として有名な 555 を利用すると、無安定マルチバイブレータ回路をトランジスタやオペアンプを別途用意することなく設計できます。この発振回路の周波数は接続するコンデンサおよび抵抗の値で決まります。データシート等に記載されている回路例の抵抗一つをフォトトランジスタに置き換えると、照度の変化が抵抗値の変化に相当し、周波数が照度に応じて決まることになります。通常のトランジスタではベース電流に応じて流れる電流の大きさが決まりましたが、フォトトランジスタでは照度に応じて決まるためです。

Uploaded Image

http://schematics.com/project/flickering-led-48812/

制御プログラム

pulseIn 関数で周波数を計算しています。照度センサの出力をタイマ IC でパルスに変換することで、今回場合においては Arduino の 10 ビット A/D 変換で直接読み取る場合と比較して精度よく照度の変化を測定できます。

Uploaded Image

#define PULSE_INPUT_PIN 2

void setup() {
  pinMode(PULSE_INPUT_PIN, INPUT);
  Serial.begin(9600);
}

void loop() {

  // 第二引数で指定した状態 (HIGH/LOW) が継続したマイクロ秒数を計測します。
  // https://www.arduino.cc/en/Reference/pulseIn
  unsigned long T_H = pulseIn(PULSE_INPUT_PIN, HIGH);
  unsigned long T_L = pulseIn(PULSE_INPUT_PIN, LOW);

  // 周期と周波数
  double T = T_H + T_L; // μ秒
  double f = 1000000 / T; // Hz

  // シリアルモニタに送信
  Serial.print(f);
  Serial.print(" Hz\n");
  delay(500);
}