- 最終更新日
- 記事公開日
【ラズパイPico】CDS光センサーでAD変換(アナログ→デジタル変換)
Raspberry Pi Picoを使って、AD変換(アナログ→デジタル変換)をやってみました。
光センサを手でふさぐとLEDが消灯し、手を離すとまたLEDの点灯が始まります。
回路・配線図
ラズパイPicoの3.3V出力ピンをCDS(光センサー)に繋ぎ、指定した電圧以下になったタイミングで、LEDが点滅するサンプル回路になります。
プログラム(MicroPython)
# ハードウェア関連のライブラリを読み込み
import machine
# 時間関連のライブラリを読み込み
import utime
# GP17(22Pin)を出力ピンに設定、プルダウン(初期値):0
led = machine.Pin(17, machine.Pin.OUT,machine.Pin.PULL_DOWN)
# ADC0(31Pin)をADC変換ピンに設定
cds = machine.ADC(0)
# 永久リピート
while True:
# read_u16() ・・・アナログ値を読込み[0-65535]の整数を返す関数
# 16bit・2進数の最大値:1111111111111111 ⇒ 10進数の最大値:65535
# 3.3/65535の意味:電圧の最大値3.3Vを、65535という数値にあてはめるための計算
adc = cds.read_u16() * (3.3 / 65535)
# 2.6V以上のとき実行
if adc > 2.6:
# LEDをON
led.value(1)
# 0.2秒待機
utime.sleep(0.2)
# LEDをOFF
led.value(0)
# 0.2秒待機
utime.sleep(0.2)
else:
# LEDをOFF
led.value(0)
技術解説
ラズパイPicoには、アナログ信号をデジタル信号に変換する『A/D変換回路』が組み込まれています。
今回紹介した回路では、そのA/D変換回路が非常に重要な役目を担っています。
なぜ、A/D変換が必要なのか?
デジタル信号には、「0」と「1」しか存在していません。
例えば、「3.3V」というアナログ信号を、そのままラズパイのPinが受け取ったとき、どんなデジタル信号に変換されるでしょうか?
正解は「1」という値に変換されます。
では、「2.4V」の場合は?
正解は「1」
では、「1.2V」の場合は?
これも「1」
つまり、アナログ信号のままでは数値を読み取ることができないのです。
CDS(光センサー)とは?
今回、センサーにCDSを使用しました。
CDS(光センサー)とは、光の強さによって抵抗が変わる電子部品です。
フタを閉めたり、物体が目の前に移動してきたときのトリガーとして使います。
CDSに電圧をかけて、明るいとき・暗いときの電圧の違いを読み取るのが、一般的な使い方です。
- 明るいときの抵抗:小さい
- 暗いときの抵抗:大きい
例えば、3.3Vをかけた時、CDSより後の電圧はこうなります↓
- 明るいとき:2.9V
- 暗いとき:0.9V
しかし、このままではデジタル信号においては、どちらも「1」としか認識されません。
そこで、A/D変換を使います。
プログラム上のA/D変換処理
A/D変換されたデータは、「16bit」で送られてきます。
例えば、
- 3.3Vなら → 1111111111111111
- 2.4Vなら → 1011101000101101
- 0Vなら → 0000000000000000
という感じで、16桁の1と0だけで表現されるデータです。
プログラム上では、これを人間が理解する上で分かりやすいような数字のデータに変換しています。
adc = cds.read_u16() * (3.3 / 65535)
これでようやく電圧の値を数値として、プログラム上で扱うことができるようになります。