🔥

【Raspberry Pi Pico W】ADCの使い方(micropython×Thonny)

2024/12/02に公開

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(=3.3/(2^{12}))高くなると、読み取り値が1増える感じ

ADCのエラッタ(RP2040-E11)について

picoのADCは実力的に7〜8bit程度しか出てないとの記録もあるため、公式の値12bitを信用しすぎないほうが良さそうです。

気になる方は↓の記事と、リンク先の公式ドキュメントを参照下さい。
http://radiopench.blog96.fc2.com/blog-entry-1189.html

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