稼働中

マイクロビット(e_04)CdS 明るさ検知

CdS(硫化カドミウムセル)

以前にArduinoをかじってました。その時に「みんなのAruduino入門」の本を参考にしていました。その時に購入した電子部品、センサーなどをmicro:bitで使ってみようと思っています。※thonny-microbitを使っています。

CdS(硫化カドミウムセル)は明るさで抵抗値が変化する素子です。明るいと抵抗が下がります。そのため明るさセンサーとして使えます。以下がCdSの外観です。

CdS

CdSの抵抗値

micro:bitでCdSの抵抗値を測ってみます。以下のように接続します。
以下の図ではR1=1kΩの抵抗と直列接続されています。R1の電圧を測ればCdSの抵抗値(R_cds)が算出できます。電源電圧をVsとすると R_cds=(Vs*R1)/V1-R1 で計算できます。

電圧V1を測定するために、micro:bitの入力ピンpin1に接続します。pin1のモードはアナログ入力にします。

CdS配線図
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。

スクリプトは以下のようにしました。比例換算できる関数を作りました。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
# power supply mv z
Vs=3200                 #実測した供給電圧

# 比例換算の関数
def u_map(value,a_min,a_max, b_min,b_max):
    y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
    return y

display.off()
pin1.set_pull(pin1.NO_PULL)

while True:
    r_v1 = pin1.read_analog()
    sleep(100)
    v1=u_map(r_v1, 0, 1024, 0, Vs)  # 電源電圧と比例計算して算出
    #cds_ohm
    cds=(Vs*1000)/v1-1000           # Cdsの抵抗値を算出
    print('cds %7.0f_ohm' % cds)    # Cds抵抗値を表示
    sleep(1000)

実行結果です。(ThonnyのShell部に表示されます。STOPアイコンで停止します。)
蛍光灯下から覆いをして暗くしました。


>>> %Run b1117_cds_b.py
cds    1335_ohm         # デスクスタンド灯り
cds    6055_ohm         # 覆いで影に
cds   31999_ohm
cds   45500_ohm
cds   67199_ohm
cds   72071_ohm
cds   72071_ohm
cds   67199_ohm         # ほぼ真っ暗

今回、使用したCdsの抵抗値は蛍光灯の下では1.3kΩくらいでした。真っ暗になると高抵抗になり67kΩになりました。

micro:bitの測光と比較

micro:bitにも明るさを測る機能があります。micro:bitのディスプレイのLEDで測定できます。太陽電池のようにLEDも光を当てると光→電気変換します。変換効率は悪いですが。
micro:bitではread_light_level()で0-255の値を返します。
自動で切り替わると思いますがdisplay.off()にしてからread_light_level()で測定します。
read_light_level()を追加して以下のようにして測定しました。
室内の蛍光灯とデスクスタンドの向きを変えて明るさを明→暗へ変化させながら測定しました。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
# power supply mv
Vs=3200

def u_map(value,a_min,a_max, b_min,b_max):
    y= (value-a_min)/(a_max-a_min) * (b_max-b_min)+b_min
    return y

pin1.set_pull(pin1.NO_PULL)

while True:
    r_v1 = pin1.read_analog()
    sleep(100)
    v1=u_map(r_v1, 0, 1024, 0, Vs) #3215

    cds=(Vs*1000)/v1-1000
    #print('cds %06.1f_ohm '  % cds)
    
    # light_level< 0-255 >
    display.off()
    light_level=display.read_light_level()
    
    print('cds_ohm=%05.1f ' % cds, 'light_level=%03d ' % light_level)
    sleep(1000*2)

実行結果


>>> %Run b1117_cds_b2.py
cds_ohm=1066.6  light_level=152     # 蛍光灯、デスクスタンド明状態
cds_ohm=1066.6  light_level=149 
cds_ohm=1149.1  light_level=133     # 蛍光灯小、デスクスタンド明状態
cds_ohm=1162.7  light_level=133     # デスクスタンド明状態
cds_ohm=1453.2  light_level=097     # デスクスタンド暗横向きへ
cds_ohm=1453.2  light_level=098 
cds_ohm=1459.1  light_level=097 
cds_ohm=1465.0  light_level=088 
cds_ohm=1447.3  light_level=092 
cds_ohm=1441.5  light_level=096 
cds_ohm=1727.9  light_level=059 
cds_ohm=2257.9  light_level=028 
cds_ohm=3506.6  light_level=008 
cds_ohm=6522.0  light_level=000 
cds_ohm=7669.4  light_level=003 
cds_ohm=7743.5  light_level=000     # デスクスタンド暗上向きへ
cds_ohm=7317.0  light_level=000 
cds_ohm=7596.6  light_level=000 
cds_ohm=72071.4  light_level=000 
cds_ohm=126875.0  light_level=000   #消灯状態
cds_ohm=126875.0  light_level=000

データを整理すると以下のようになりました。micro:bitのread_light_level()は低照度では測定値がゼロになってしまうので、低照度~暗状態での明るさの判別はできそうにないです。低照度~暗状態ではCdSの方が使いやすそうです。

CdS-LED

まとめ

明るさに対するCdsの抵抗値の変化をmicro:bitを使って調べてみました。またmicro:bitのread_light_level()の値と比較しました。その結果、低照度の判別にはCdsの方が優位だと思いました。CdSを使えば明るさをイベントとして制御が簡単にできそうです。