そんな状況であってもクリスマスを楽しむべく、電子工作で気持ちを盛り上げてみるのはいかがでしょうか。今回はRaspberry Pi(以下ラズパイ)と照度センサーを使って、暗くなると光り始めるイルミネーションを作ってみます。
イルミネーションは100均で
今回利用したイルミネーションは100円均一で売られていたものです。電池で使えるタイプとなっています。電池は直列接続を想定していますので、1.5Vの電池を2つ、つまり3Vの電圧に対応しています。そして、ラズパイのGPIOでも3Vの電圧になっています。
他に利用したものは次の通りです。
- MCP3008(デジアナコンバーター)
- 照度センサー
- 抵抗(10KΩ)
照度センサーは光の強さによって電圧が変わる仕組みとなっています。ただし値がアナログなので、MCP3008を使ってデジタル値に変換しています。配線は次の通りです。
(編注)100均のイルミネーションの電池ボックスから電池を抜いた空の電池ボックスを接続します。電池入りの電池ボックスを接続しないように注意してください。もし接続してしまうとRaspberry Piが壊れてしまうかもしれません!
ラズパイでの設定
今回はSPIを利用しますので raspi-config
で設定をします。インタフェースの設定で、SPIを有効にすれば完了です。また、Pythonライブラリとして spidev
を追加しています。
コードについて
ではコードの解説です。ラズパイで光センサー(フォトレジスター)を使ったPythonのプログラミング | そう備忘録を参考にさせてもらいました。
まずライブラリを読み込みます。
import spidev import RPi.GPIO as GPIO from time import sleep
次にSPIの準備をします。
spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
さらにGPIOの準備をします。
LED = 25 # LEDを点灯させるピン GPIO.setmode(GPIO.BCM) GPIO.setup(LED, GPIO.OUT)
SPIの値から電圧を取得する関数 get_voltage
は次の通りです。
def get_voltage(): V_REF = 3.29476 # 入力電圧 CHN = 0 # チャンネル dout = spi.xfer2([((0b1000+CHN)>>2)+0b100,((0b1000+CHN)&0b0011)<<6,0]) # Din(RasPi→MCP3008)を指定 bit12 = ((dout[1]&0b1111) << 8) + dout[2] # Dout(MCP3008→RasPi)から12ビットを取り出す volts = round((bit12 * V_REF) / float(4095),4) # 取得した値を電圧に変換する(12bitなので4095で割る) return volts # 電圧を返す
後はこの関数を定期的に呼び出します。明るさの設定を2.3としていますが、これは暗くなるほど低い値になります。どれくらいの閾値にするかは実行しながら確認してください。
try: while True: volts = get_voltage() if volts < 2.3: GPIO.output(LED, GPIO.HIGH) else: GPIO.output(LED, GPIO.LOW) sleep(0.2) except KeyboardInterrupt: pass finally: spi.close() GPIO.cleanup()
デモ
実際に試したところです。25番ピンから電池ボックスのプラスへ、電池ボックスのマイナスからグラウンドへ接続しています。照度センサーを指で隠すと(暗くすると)イルミネーションが光り始めます。
まとめ
照度センサーはデジアナ変換を覚えれば簡単に使えるようになります。暗くなってきたら何かを動かす、外が明るくなったらイベントを実行するといった外環境をトリガーにしたIoTを実現する際にぜひ使ってみてください。
参考:ラズパイで光センサー(フォトレジスター)を使ったPythonのプログラミング | そう備忘録
Top Photo by Marina Khrapova on Unsplash
]]>