ラズパイで光センサー(フォトレジスター)を使ったPythonのプログラミング | そう備忘録

ラズパイで光センサー(フォトレジスター)を使ったPythonのプログラミング

暗くなるとLED点灯

光センサーを使って暗くなるとLEDを点灯させるプログラムを作成した時の備忘録。

フォトレジスターで暗くなるとLEDを点灯させる

回路は金丸隆志さんの「Raspberry Piで学ぶ電子工作」を参考にさせて貰っている。

尚、上記の書籍はRaspberry Pi 3をベースに書かれている。

今回の回路図ではRaspberry Pi 3、4の違いは無いのだが4対応の書籍も出版されていたので載せておく。

光センサー

フォトレジスタ(光センサー)は秋月電子の「Raspberry Piで学ぶ電子工作 パーツセット」に入っていたCdSセル 5mmタイプを使用してる。

CdS(硫化カドニウム)セルは光が当たると電子が発生して電流の流れが変化して抵抗値が下がり、逆に暗くなると抵抗値が上がる性質があるので暗くなると街灯を付ける等の制御に利用することが出来る。

赤色の波々模様が入っていてビジュアル的にカッコイイので個人的には好きなパーツの一つだ。

光センサー(フォトレジスター)

上記の秋月電子のセット以外ではAmazon等でも購入することもできる。

ADコンバーター

アナログ値で取り出された電圧をRaspberry Piが読み取れるようにデジタル値に変換するためのADコンバーター(MCP3208)を使用している。

その他のパーツ

LED

暗くなると点灯させるLED。

3mmLEDと抵抗(330Ω)。

抵抗

10KΩの抵抗を光センサーとGNDとの間に入れている

その他Raspberry Pi本体などについては以前の記事の「必要なモノ」を参考にして欲しい。

回路図

光センサー(フォトレジスター)を使って周囲の光を検出して暗くなるとLEDを点灯させる回路は以下の通り。

暗くなって光センサーの抵抗が増えるとADコンバーターのチャンネル0に接続された電圧が低くなのだが仕組みについては後述する。

光センサーで暗くなるとLEDを点灯の回路図

事前準備

Raspberry Piの設定画面よりspiを有効にすると同時にPythonからspiを制御するライブラリーspidevをインストールする。

spiの有効化の方法とspidevのインストールについては以前の記事を参照して欲しい。

尚、プログラムは前述の書籍「Raspberry Piで学ぶ電子工作」で紹介されていた方法とは異なる。

前述の書籍ではRaspberry Piのデバイスの基本的な操作を学ぶ為にspidevを使用していなかったがspidevを使った方がプログラムがシンプルになるので下記のプログラムではspidevを使用している。

プログラム

ソースコード

# -*- coding: utf-8 -*-
"""
Created on Sun Aug  9 21:05:02 2020

@author: Souichirou Kikuchi
"""

import spidev
import RPi.GPIO as GPIO
from time import sleep

V_REF = 3.29476 # input Voltage
CHN = 0 # 接続チャンネル
LED = 25 # LED点灯用GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)

spi = spidev.SpiDev()
spi.open(0, 0) # 0:SPI0、0:CE0
spi.max_speed_hz = 1000000 # 1MHz SPIのバージョンアップによりこの指定をしないと動かない

def get_voltage():
    dout = spi.xfer2([((0b1000+CHN)>>2)+0b100,((0b1000+CHN)&0b0011)<<6,0]) # Din(RasPi→MCP3208)を指定
    bit12 = ((dout[1]&0b1111) << 8) + dout[2] # Dout(MCP3208→RasPi)から12ビットを取り出す
    volts = round((bit12 * V_REF) / float(4095),4)  # 取得した値を電圧に変換する(12bitなので4095で割る)
    return volts # 電圧を返す

try:
    print('--- start program ---')
    while True:
        volts = get_voltage()
        print('volts= {:3.2f}'.format(volts))
        # 暗くなるとフォトレジスタの抵抗が増えるのでspiの電圧が下がる
        if volts < 2: # 2 Volts以下なら点灯
            GPIO.output(LED, GPIO.HIGH)
        else:
            GPIO.output(LED, GPIO.LOW)
        sleep(0.2)

except KeyboardInterrupt:
    pass
finally:
    spi.close()
    GPIO.cleanup()
    print('--- stop program ---')

補足説明

モジュールのインポート

8~10行目でプログラムで必要なモジュールをインポートしている。

spidevがPythonからspiを制御する為のモジュール。

定数の定義

12~14行目でプログラム中で使用する定数を定義している。

V_REFはRaspberry Piから供給される電圧、CHNは光センサーからの電圧をADコンバーター(MCP3208)に接続しているチャンネル(左から0~7)。

LEDはLEDを点灯させる為のGPIOの番号を定義している。

ADコンバーター

23~27行目はADコンバーターからの電圧を取り出すロジック。

MCP3208では0~4095の値で電圧を返す。

今回の例でいうと0~3.3Vを0(0V)~4095(3.3V)の値で表すことになる。

MCP3208に信号を送って(Din)、返ってきた値7(Dout)を12ビットで取得して4095で除算して電圧を求めているのだが詳細は以前のこちらの記事を参照して欲しい。

メイン

29~46行目がメインの処理。

try~excepy~finallyでエラー処理を行っている。

また0.2秒間隔でwhileループを回している。

電圧を測定

35行目で電圧を測定して2V以下であればGPIO25をHIGHにしてLED点灯を行っている。

2Vは仮に設定した値なので調整の必要があるかも知れない。

手で覆って暗くすると2.0V以下になったのでとりあえず2以下で設定をしている。

仕組み

暗くなると電圧が2V以下に低くなる仕組みは抵抗の分圧を利用している。

抵抗の分圧計算

上記の回路では、

Vout = Vcc × R2 ÷ (R1+R2)

が成り立つ。

また今回の回路ではR1が光センサー(フォトレジスター)でR2がブレッドボード上に配置した10KΩの抵抗に相当する。

フォトレジスターは暗くなると抵抗が増えるので上記の式の分母が大きくなり、分子は10KΩのままなのでVout(ADコンバータ-のチャンネル0に接続されている)の電圧が小さくなる。

そして2V以下になった時に暗くなったと判断してLEDを点灯している。

LED点灯の様子

動画

LED点灯の様子は以下の動画を見て欲しい。

光センサーに手をかざして周囲を暗くするとLEDが点灯する様子が分かる。

実行結果

プログラムの実行結果は以下の通り。

手をかざして電圧が2.00V以下の1.71VになったのでLEDが点灯した。

プログラムの実行結果

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

3件のフィードバック

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。