5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (29) 光センサ1 LLS05-A

CdSに置き換わる光ダイオード

 CdSは硫化カドミウムが材料の安価な光センサです。LLS05-Aは微弱な光ダイオードの電流を増幅する回路が内蔵された製品で、光強度に比例した扱いやすいuAの電流出力が得られます。

LLS05-Aのスペック

  •  0~160luxの光入力で0~180uAの出力電流
  •  光感知中心波長 500nm
  •  電源電圧 -0.5~7.0V

基本回路

 データシートによれば、LLS05-Aの出力VoutとGNDとの間に負荷抵抗10kΩを入れ、電圧出力を得ます。

 入力光に比例した出力電圧を得られますが、0~200luxまでの明るさがデータシートに書かれています。200luxは少し暗めの机の上の明るさです。室内の明るさを測る測定器のような用途に向いていないと思えます。

 明るさが一定以下になると、ラズパイのGPIOポートをONするという利用を考えます。

コンパレータによる判別回路

 電圧を判定するのにコンパレータ回路が使われます。コンパレータは専用のデバイスがありますが、ここではOPアンプを使います。OPアンプLM358は単電源3V以上で動作します。電源電圧3.3Vで使用したとき、出力は3.3Vまでふれません。下のオシロスコープの青色のスケールを読むと、約2.1Vが出力されています。3.3Vで動作するI/Oの入力Vihは0.7*3.3V=2.3Vなので、少し足りません。Vilは0.3*3.3=0.99V以下なので、ラズパイがLowと判断する条件を満たしています。

 今回の用途ではLowになったらという条件で使用するので、High側の電圧が不足していても問題ないと考えます。

 この回路には大きな欠点があります。それは、判断するレベル付近の明るさだと、ばたばたと出力が変化してしまうことです。はっきり明るさが変化すればよいのですが、曇りの日のように、雲の厚さで明るさが微妙に変化するようなときには落ち着きのない動作になります。

 そのようなときは、ヒステリシスをもった回路に変更します。

 出力が変化するのは、3ピンと2ピンの電圧が一致したときです。Vccが3.3Vのとき、2ピンの電圧は、

  3.3 * R3 / (R2 + R3) = 3.3 * 22k / 202k = 0.36[V]

です。

 3ピンに0から4Vへ電圧を徐々に増加するのこぎり波(オレンジ色の波形)を加えて、コンパレータの出力(青色の波形)を観測しました。0Vから0.36Vの間で出力がLowになっているのが確認できました。

 照度計を使って、明るさとLLS05-Aの出力を比較しました(負荷抵抗は33kΩ)。ほとんど真っ暗な状態で0.36Vを下回りました。

照度計の読み[lux] LLS05-Aの出力[V]
101 2.04
99 1.1
22 0.91
9 0.53
5 0.26

 この結果を見れば、LLS05-Aの出力をラズパイのGPIOに直接つないでもよいように見えます。LLS05-Aから流れ出す電流は大変少ないので、バッファが必要になるかもしれません。そうすると、コンパレータを入れるほうが明るさレベルの違いにもR2とR3で対応できるので、この回路は有用だと思えます。

 今回使用したLM359は古い設計で、出力電圧が電源電圧までふれません。レール-ツー-レールのOPアンプであれば、Highレベルが確保できます。

プログラム

 gpiozeroライブラリのButtonとLEDを使います。Buttonの検出は非同期で行われます。メインはずっとnをインクリメントしてプリントしています。

 LLS05-Aの出力は、机の上の約200lux以上ではHIGHです。手のひらでセンサを覆うと数lux以下になり、コンパレータ出力はLOWになります。タクト・スイッチなどを使ったときと同じ動作になるので、Buttonライブラリを利用しました。

 LLS05-Aの出力はGPIO5へ、LEDはGPIO26につなぎました。LEDには直列に電流制限抵抗1kΩを入れています。アノード側がGPIO26でカソードはGNDにつなぎました。

#!/usr/bin/env python
from gpiozero import LED,Button
import time

led = LED(26)
button = Button(5)
led.off()
print ("start")

def message():
print("dark")
led.on()

button.when_pressed = lambda:message()
button.when_released = led.off

#main
n=0
while 1:
print (n)
n=n+1
time.sleep(0.1)


 実行結果です。

※プログラムを仮にlls05.pyと/home/piに保存すると、sudo chmod 755 lls05.py で実行権を付け、ターミナルから、python lls05.pyで実行します。
 プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、リターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで改行してください。