post / 2024.02.15
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)が使用可能 |
mode | None / 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 待ってから再確認する |
スポンサー / タクシーで家まで六十七十ドルかかります!


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