🔥
【Raspberry Pi Pico W】ADCの使い方(micropython×Thonny)
1. はじめに
1.1 この記事について
- Raspberry Pi Pico W(以下、Pico)のADCを使ったサンプルプログラムを記載する
- 細かい解説というより、備忘録とプログラム+回路図のサンプル重視
- 入門・解説というより備忘録に近い
1.2 対象読者
- Picoを使ったことがある
- Thonnyを使ってPicoにプログラムを書き込み・実行ができる
- プログラム言語(特にmicropython)が多少読める、書ける
1.3 動作環境
- PC
- OS:Windows 11 Home
- プログラミング環境:Thonny(v4.1.4)
- Raspberry Pi Pico W
- ファームウェア:v1.24
2. ADCについて
- Analog Digital Comverter(ADC)を用いると、アナログ値である電圧値を、デジタルの数値として読み取ることができる
- picoでADCとして自由に使えるのは、GP26,GP27,GP28の3つ(ADC3はVsys電源電圧、ADC4は内蔵温度センサで使用されている)
- 0〜3.3Vの電圧値を入力すると、電圧値に対応した0〜65535の整数値として読み取ることができる
- 値の範囲は16bitだが、内部的には12bit(4096段階)の分解能(レンジ)
- 3.3V以上の電圧はかけないこと! もし計測したければ分圧などして3.3V以下にする
具体的には、こんな感じで細かく電圧値を状態を読み取ることができます。
分解能のイメージ図
電圧値が約0.00081V(
ADCのエラッタ(RP2040-E11)について
picoのADCは実力的に7〜8bit程度しか出てないとの記録もあるため、公式の値12bitを信用しすぎないほうが良さそうです。
気になる方は↓の記事と、リンク先の公式ドキュメントを参照下さい。
3. 実験
いくつか試した活用例を記載しておきます
3.1 可変抵抗の電圧値を読み取る
可変抵抗(ポテンショメーター)の真ん中の電圧値を読み取ります
3.1.1 回路図
3.1.2 プログラム例
from machine import ADC
from time import sleep_ms
unit = 3.3/(2**16) # 16bitを電圧に変換する係数
adc = ADC(2) # ADC2のピンを使用する
while True:
raw_read = adc.read_u16() # ADCピンの値を16bitで読み取る
voltage = raw_read * unit # 16bitの値を電圧値に変換
print(f"{voltage=}") # 電圧値を表示する
sleep_ms(100) # 100msec待機
3.2 CdSで光を検知する
CdS(カドミウム照度センサ)を用いて、光を検出する
3.2.1 回路図
3.2.2 プログラム例
※3.1と同じため省略
3.3 簡易的な電圧計として使う
抵抗分圧の比を簡易的に計測してみます
※簡単に解説(330Ωと500Ωで抵抗分圧を行った場合の比率を計算)
3.3.1 回路図
3.3.2 プログラム例
100回計測した平均値を出力してみました。
from machine import ADC
from time import sleep_ms
adc = machine.ADC(2)
while True:
r_list = []
for i in range(100):
raw_data= adc.read_u16()
rate = raw_data / (2**16)
r_list.append(rate)
sleep_ms(10)
r_sum = 0
for r in r_list:
r_sum += r
r_average = r_sum / len(r_list)
print(f"{r_average=}")
4. まとめ
- ADCを使うことで、0 or 1ではなく細かく電圧値を読み取ることができる
- ポテンショメーターなど、細かいアナログ入力として用いたり、CdS等と組み合わせて物理現象をセンシングすることができる
- 基準電圧は0〜3.3Vのため、入力する電圧値には注意すること!
Discussion