スキップしてメイン コンテンツに移動

アナログ電圧を測定する(ADCの基本)

 今回は、Raspberry Pi Pico のアナログ入力機能(ADC) を使って、電圧を読み取るテストを行います。Pico には ADC(アナログ-デジタル変換器) が 5 つありますが、このうちユーザーが自由に使えるのは 3 チャンネルです。

ADC 番号 用途 GPIO ピン ピン番号
ADC(0) ユーザー用 GP26 31 番
ADC(1) ユーザー用 GP27 32 番
ADC(2) ユーザー用 GP28 34 番
ADC(3) 電源電圧の測定(Vsys)
ADC(4) 内蔵温度センサー

▼ Pico の ADC 特性

  • 分解能は 12ビット(0~4095)で、0V~3.3V の電圧をデジタル値に変換します。

  • 実際に値を読み取るときは、16ビット(0~65535)として取得されます(下位4ビットは常に0)。

実験内容

今回は、ADC(0)(GP26) を使って電圧を測定します。

▼ 回路の構成

  • 10kΩの可変抵抗(ボリューム) に 3.3V を加えます。

  • ボリュームの中央の端子(電圧が変わる部分)を GP26(ADC0)に接続します。

  • ボリュームを回すことで電圧が変化し、その値を Pico が読み取ります。

この実験を通して、Raspberry Pi Pico のアナログ入力機能を使ってセンサーや電圧の変化を読み取る基本が学べます。
まずは電圧の変化を画面に表示してみましょう!

回路

ソースコード

from machine import ADC, Pin   # ADC と GPIO 制御に必要
import time                    # ウェイト用タイマ

# (任意)GP26 を明示的に入力設定。
#   ADC を使うだけならなくても動くが、ピンの用途を示す意味で残している。
Pin(26, Pin.IN)

adc = ADC(0)                   # ADC チャネル 0 → 物理ピン GP26
VREF = 3.3                     # 基準電圧 [V](ボードの電源電圧等)
SCALE = VREF / 65535           # 16‑bit 値を実電圧に変換する係数

while True:
    raw_value = adc.read_u16()        # 06553516‑bit)で取得
    voltage   = raw_value * SCALE     # 実電圧 (V) に換算
    print('V = {:.2f} V'.format(voltage))  # 小数点 2 桁で表示
    time.sleep(1)                     # 1 秒おきにサンプリング

回路

LM61BIZ 温度センサを読むサンプル

from machine import ADC, Pin   # ADC と GPIO 制御
import time                    # ウェイト用タイマ

# ── GPIO / ADC 初期化 ──────────────────────────────
Pin(26, Pin.IN)        # GP26 を「入力」に設定(ADC 使用時は省略可だが明示)
adc = ADC(0)           # ADC0 ⇔ GP26

# ── 定数(環境に合わせて調整) ───────────────────
VREF  = 3.3            # 参考電圧 [V](Pico 3.3 V レールを想定)
SCALE = VREF / 65535   # ADC 生データ (065535) → 電圧 [V] への係数

# ── 温度読み取り関数 ──────────────────────────────
def read_temperature_c(samples: int = 16) -> float:
    """
    LM61BIZ の温度を摂氏で返す。
    :param samples: 平均化に用いるサンプル数(デフォルト 16 回)
    """
    total = 0
    for _ in range(samples):
        total += adc.read_u16()     # 16‑bit スケールで読み取り
        time.sleep_us(20)           # サンプル間に 20 µs の小休止(任意)
    raw_avg     = total // samples  # 平均値(整数演算)
    voltage     = raw_avg * SCALE   # 実電圧 [V] へ換算
    voltage_mV  = voltage * 1000    # mV へ変換
    # LM61BIZ の一次特性式で温度計算
    temperature = (voltage_mV - 600) / 10
    return temperature

# ── メインループ ────────────────────────────────
while True:
    temp_c = read_temperature_c()   # 温度取得(平均化付き)
    # 小数点 2 桁で温度を表示
    print("Temperature: {:.2f} °C".format(temp_c))
    time.sleep(1)                   # 1 秒ごとに更新



>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
Temperature: 25.89 °C
Temperature: 25.88 °C
Temperature: 25.93 °C
Temperature: 25.91 °C
Temperature: 25.93 °C
Temperature: 25.89 °C
Temperature: 25.91 °C

🔄 処理の流れ

  1. 🛠️ GPIO 初期化

    • Pin(26, Pin.IN)GP26(ADC0) を入力モードに設定。

  2. 🎛️ ADC 準備

    • adc = ADC(0) で ADC0 を選択。

    • 定数 VREF = 3.3 VSCALE = VREF / 65535 を計算し、ADC カウントを電圧へ変換できるようにする。

  3. 📊 温度読み取り関数 read_temperature_c()

    • 🔁 16 回サンプリングsamples 引数で変更可)し、ノイズ低減のため平均を取る。

    • 📐 平均値を 電圧 [V]電圧 [mV] に変換。

    • 🧮 LM61BIZ の換算式

      Temperature [°C]=VmV60010 \text{Temperature [°C]} = \frac{V_{\text{mV}} - 600}{10}

      で摂氏温度を求めて返す。

  4. 🖨️ メインループ

    • 1 秒ごとに read_temperature_c() を呼び出し、
      Temperature: xx.xx °C の形式でシリアル(REPL)に表示。

  5. 💤 ウェイト

    • time.sleep(1) で 1 秒間隔を確保して次の計測へ。


コメント

このブログの人気の投稿

Raspberry Pi Pico Wを使ってみよう

   Raspberry Pi Pico W(ラズベリーパイ ピコ ダブリュー) は、英国 Raspberry Pi 財団が 2022 年に発売した Wi-Fi 搭載マイコンボードです。従来の「Raspberry Pi」と聞くと Linux が動くシングルボードコンピュータ(SBC)を思い浮かべがちですが、Pico W は マイクロコントローラ (MCU)に分類され、いわゆる “組み込み開発” を手軽に始められるデバイスです。搭載 MCU はデュアルコア Arm Cortex-M0+(133 MHz 動作)の RP2040 。ここに Infineon 製 CYW43439 チップが追加され、 2.4 GHz IEEE 802.11 b/g/n Wi-Fi(BLE 対応 FW も提供中) が使えるのが最大の特徴です。  開発言語は MicroPython や CircuitPython が真っ先に紹介されることが多いのですが、 公式 Pico SDK を使えば C/C++ でも本格的に開発 できます。SDK は CMake ベースで Windows/macOS/Linux いずれでも利用可能。さらに、Arduino Core RP2040 が整備されたことで Arduino IDE 2.x からも “スケッチ感覚” で書き込みが可能 になりました。したがって、 「まずは Python でサッと試す」 「より高速化や省メモリ化が必要になったら C/C++ へ移行」 といった二段構えの学習ルートが取れるのが魅力です。 メニュー(基礎編) 01. Raspberry Pi Pico Wの開発環境を整える。 02. スイッチで 発光ダイオード(LED) を点灯・消灯させる 03. タイマーで発光ダイオード(LED)を1秒ごとに点滅させる 04. シリアル通信(オウム返し ) 05. シリアル通信(発光ダイオードの点灯・消灯) 06. サーボモーターを動かしてみよう(SG90制御入門) 07. DCモータを動かす(PWM) 08. IRリモートでRGBLED点灯 09. アナログ電圧を測定する(ADCの基本) 10. GPIO割り込み処理 11. リレーを駆動してLEDを制御する 12. DFPlayer で MP3 再生 13. 7 セグ 4 ...

スイッチで発光ダイオード(LED)を点灯・消灯させる

 スイッチを使って発光ダイオード(LED)を制御してみましょう。今回は、スイッチをオンにすると LED が点灯し、オフにすると消灯するように動作させます。もちろん、スイッチと LED を直接接続するのではなく、適切な回路を介して制御します。 1.回路 GPIO16 はデジタル入力として使用し、内部プルアップを有効にします。GPIO15 は出力として設定します。なお、接続には 1kΩ(1キロオーム)の抵抗を使用します。 【ソースコード】 # スイッチで LED を ON / OFF する簡単な例 #   GPIO15 : LED(出力)— LOW で消灯、HIGH で点灯 #   GPIO16 : スイッチ(入力)— 内部プルアップ抵抗を使用 # # ※ 配線例 #   LED のアノード → 1 kΩ 抵抗 → GPIO15 #   LED のカソード → GND #   スイッチ片側   → GPIO16 #   スイッチ反対側 → GND # # ★ 動作 #   スイッチを押す(GPIO16 が LOW)   → LED 点灯 #   スイッチを離す(GPIO16 が HIGH) → LED 消灯 from machine import Pin    # GPIO 制御ライブラリ import utime               # 時間関連(今回は使用しないが拡張用に読み込み) led = Pin ( 15 , Pin.OUT)                 # GPIO15 を出力モードに設定(LED 用) sw   = Pin ( 16 , Pin.IN, Pin.PULL_UP)     # GPIO16 を入力モード+内部プルアップ有効 while True:     if sw. value () == 1 :      # プルアップなので押していないときは 1   ...

シリアル通信(オウム返し)

 Raspberry Pi Pico Wは単体で使うのも便利ですが、パソコンや他のマイコンなど、さまざまな機器と通信できるとさらに活用の幅が広がります。 そこで今回は「シリアル通信」について紹介します。 まずは、パソコンから送られてきたデータをPico Wが受け取り、同じデータをそのままパソコンに送り返す、いわゆる「オウム返し(エコー)」を実装してみましょう。 シリアル通信とは? シリアル通信は、マイコンとパソコンや他の機器がデータを1ビットずつ順番に送受信する通信方式です。Raspberry Pi Pico WではUART(Universal Asynchronous Receiver/Transmitter)というハードウェアを使って実現します。 接続回路  id      TX       RX        baudrate     parity    stopbit  0  GPIO0 GPIO1   9600  なし  1  1  GPIO4 GPIO5   9600  なし  1 今回はUART1(GPIO4:TX、GPIO5:RX)を使用します。 ソースコード例 from machine import UART, Pin # UART1ポートを9600bpsで初期化(ボーレートを指定) sirial = UART ( 1 , 9600 ) # UARTの詳細設定: 9600bps 、データビット8、パリティ無し、ストップビット1で初期化 sirial. init ( 9600 , bits = 8 , parity = None, stop = 1 ) # UARTで文字列を送信する(※MicroPythonではバイト列で送るのが正しいため b '' にしたほうが安全) sirial. write (b 'Hello World \n\r ' )  # 起動時に「Hello World」を送信 # メインループ while True:     # 受信バッファにデータが存在するかチェック     if sirial. any () > 0 : ...