マイクロビット(e_04)CdS 明るさ検知
CdS(硫化カドミウムセル)
以前にArduinoをかじってました。その時に「みんなのAruduino入門」の本を参考にしていました。その時に購入した電子部品、センサーなどをmicro:bitで使ってみようと思っています。※thonny-microbitを使っています。
CdS(硫化カドミウムセル)は明るさで抵抗値が変化する素子です。明るいと抵抗が下がります。そのため明るさセンサーとして使えます。以下がCdSの外観です。
CdSの抵抗値
micro:bitでCdSの抵抗値を測ってみます。以下のように接続します。
以下の図ではR1=1kΩの抵抗と直列接続されています。R1の電圧を測ればCdSの抵抗値(R_cds)が算出できます。電源電圧をVsとすると R_cds=(Vs*R1)/V1-R1 で計算できます。
電圧V1を測定するために、micro:bitの入力ピンpin1に接続します。pin1のモードはアナログ入力にします。
※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の抵抗値の変化をmicro:bitを使って調べてみました。またmicro:bitのread_light_level()の値と比較しました。その結果、低照度の判別にはCdsの方が優位だと思いました。CdSを使えば明るさをイベントとして制御が簡単にできそうです。