post / 2024.02.15

MicroPython関数ライブラリ

MicroPython関数ライブラリ

本記事は、MicroPython の machine モジュールを Raspberry Pi Pico(RP2040)で使う際によく利用するインターフェースを整理したものです。内容は MicroPython 公式ドキュメント と照合して確認済みです。

machine:ハードウェア関連の機能

ピン番号には次の2種類があります:

  • GPIO 番号(GP0–GP29):コードではこれが最もよく使われます。Pin(25) は GP25 のことです。
  • 物理ピン番号:開発板上の 40 本のピンの位置であり、GPIO 番号とは別物です。配線時には区別に注意してください。

Pin クラス

コンストラクタ machine.Pin(id, mode=-1, pull=-1, value=None)

引数説明
idピン番号。Pico では 0–29(GP0–GP29)が使用可能
modeNone / Pin.IN(0) / Pin.OUT(1) / Pin.OPEN_DRAIN(2)
pull内部プルアップ/プルダウン抵抗。入力モードでのみ有効:None / Pin.PULL_UP(1) / Pin.PULL_DOWN(2)
value出力/オープンドレインモードでのみ有効。初期の電位:0 は低レベル、1 は高レベル

Pin.PULL_DOWN であり、Pin.DOWN ではないことに注意してください。

Pin.init(mode=-1, pull=-1, value=None)

ピンを再初期化します。渡した引数のみを変更し、それ以外の状態はそのまま維持します。

Pin.value([x])

  • 引数なし:現在のピンの電位(0 または 1)を返します。
  • 引数あり:ピンに電位を書き込みます。引数はブール値に変換されます(True は 1、False は 0)。

Pin.on() / Pin.off()、Pin.high() / Pin.low()

  • on()、high():高レベル(1)を出力します。
  • off()、low():低レベル(0)を出力します。

これら4つのメソッドは出力/オープンドレインモードでのみ意味を持ちます。low() / high() は非コア API で、Pico(rp2)では使用可能です。

Pin.toggle()

出力の電位を反転します。0 は 1 に、1 は 0 になります。toggle() は rp2、esp32 などのポートで使用可能です。ポートが対応していない場合は Pin.value(not Pin.value()) で代用します。

from machine import Pin
import time

led = Pin(25, Pin.OUT)   # Pico のボード上の LED は GP25
while True:
    led.toggle()
    time.sleep(1)        # 1秒ごとに反転

Pin.irq(handler=None, trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING)

外部割り込みを設定します。電位が変化するとコールバック関数が自動的に呼び出されます。

  • handler:割り込みコールバック関数。Pin 引数を1つ受け取る必要があります。
  • trigger:トリガー条件。| で組み合わせられます:
定数意味
Pin.IRQ_FALLING立ち下がりエッジ
Pin.IRQ_RISING立ち上がりエッジ
Pin.IRQ_LOW_LEVEL低レベル
Pin.IRQ_HIGH_LEVEL高レベル
def on_press(pin):
    print("按键被按下")

button = Pin(15, Pin.IN, Pin.PULL_UP)
button.irq(handler=on_press, trigger=Pin.IRQ_FALLING)

PWM クラス

PWM(パルス幅変調)は高速なスイッチングによって中間の電圧値を模擬します。調光、速度制御、サーボ制御などによく使われます。

machine.PWM(pin, freq=..., duty_u16=...)

指定したピンに PWM 出力を生成します。pin は Pin オブジェクトです。

よく使うメソッド

メソッド役割
PWM.freq([value])周波数を読み取り/設定。単位は Hz、範囲はおよそ 8 Hz – 62.5 MHz(CPU 125 MHz 時)
PWM.duty_u16([value])デューティ比を読み取り/設定。値は 0–65535 で、value / 65535 の比率を表す
PWM.duty_ns([value])1周期内の高レベル時間を読み取り/設定。単位は ns
PWM.deinit()PWM 出力を停止する

duty_u16 の上限は 65535 であり、65536 ではないことに注意してください。値 65536 はオーバーフローします。

RP2040 には独立した PWM スライスが 8 組あり、各組に 2 チャンネル、合計 16 路です。同じ組の 2 チャンネルは周波数を共有しなければなりませんが、デューティ比は別々にできます。

例:ブレス LED

from machine import Pin, PWM
import time

led = PWM(Pin(25))
led.freq(1000)      # 1 kHz

duty = 0            # デューティ比のパーセント
step = 1

while True:
    duty += step
    if duty >= 100:
        duty = 100
        step = -1
    elif duty <= 0:
        duty = 0
        step = 1

    # パーセントを 0-65535 に変換。範囲を超えないよう注意
    led.duty_u16(int(duty / 100 * 65535))

    if duty % 5 == 0:
        print(duty)  # グラフ描画用に観察しやすくする

    time.sleep(0.01)  # 約2秒で1往復

例:ボタンで点灯(ソフトウェアデバウンス付き)

from machine import Pin
import time

button = Pin(15, Pin.IN, Pin.PULL_UP)   # 押すと 0 が読める
led_board = Pin(25, Pin.OUT)            # ボード上の LED
led_ext = Pin(16, Pin.OUT)              # 外付け LED

while True:
    led_ext.off()
    if button.value() == 0:             # 押された可能性
        time.sleep(0.01)                # 10 ms 待って再確認し、チャタリングを除去
        if button.value() == 0:         # 押下を確認
            led_board.toggle()
            led_ext.on()
            print("The button is pressed.")
            while button.value() == 0:  # 離されるのを待つ
                time.sleep(0.01)

メカニカルなボタンは、押す瞬間と離す瞬間にミリ秒単位の電位のチャタリングが発生し、CPU には複数回の押下として読み取られます。ソフトウェアデバウンスの方法は、押下を検出した後に 10 ms 待ってからもう一度確認するというものです。

ADC クラス

ADC(アナログ-デジタル変換)はアナログ電圧をデジタル値に変換します。

machine.ADC(id)

id には Pin オブジェクトを渡すことも、チャンネル番号を渡すこともできます:

  • Pico ではチャンネル 0–3 が GP26–GP29 に対応します(GP29 はボード上で VSYS に接続されています)。
  • チャンネル 4 はチップ内蔵の温度センサーで、ADC.CORE_TEMP で表せます。

ADC.read_u16()

変換結果を読み取ります。0–65535 の整数を返し、電圧範囲 0–3.3 V に対応します。

from machine import ADC, Pin

adc = ADC(Pin(26))          # ADC(0) と書くこともできる
value = adc.read_u16()      # 0 - 65535
voltage = value / 65535 * 3.3   # 電圧に換算
print(voltage, "V")

レンジは 0–65535 であることに注意してください。RP2040 の ADC ハードウェア自体は 12 ビット(0–4095)で、MicroPython がそれを線形に 16 ビットへ引き伸ばしているため、末尾の数ビットには実際の精度はありません。

まとめ

場面ポイント
デジタル入出力Pin(id, mode, pull)。入力は value() で読み、出力は value() / on() / off() / toggle() を使う
割り込みPin.irq(handler, trigger)。コールバックは Pin 引数を1つ取る必要がある
調光/速度制御PWM(pin) + freq() + duty_u16()。デューティ比の上限は 65535
アナログ値の読み取りADC(Pin(26)) + read_u16()。0–65535 を返す
ボタンのチャタリング変化を検出したら 10 ms 待ってから再確認する

著者: 孤筝

タイトル: MicroPython関数ライブラリ

公開日: 2024-02-15

更新日: 2026-10-05

ライセンス: CC BY-NC-SA 4.0

いつまた一杯の酒を飲み、細かい論文を議論するのか。

検索