RP2 クイックリファレンス¶

Raspberry Pi Pico 開発ボード (画像出所: Raspberry Pi 財団)。
以下は、Raspberry Pi RP2xxx ボードのためのクイックリファレンスです。このボードを初めて使う場合は、まず次のマイクロコントローラの概要を確認することを勧めます
MicroPython のインストール¶
チュートリアルの章: RP2xxx での MicroPython の始め方 を参照してください。そこにはトラブルシューティングについても記載されています。
ボードの一般的な制御¶
MicroPython REPL は USB シリアルポートで利用できます。タブ補完は、オブジェクトにどのようなメソッドがあるかを調べるのに便利です。貼り付けモード(ctrl-E)は、大きめの Pythonコードを REPL に貼り付けるのに便利です。
machine
モジュール:
import machine
machine.freq() # CPU の現在の周波数を取得
machine.freq(240000000) # CPU の周波数を 240 MHz に設定
rp2
モジュール:
import rp2
遅延とタイミング¶
time
モジュールを使います:
import time
time.sleep(1) # 1秒間、一時停止する
time.sleep_ms(500) # 500ミリ秒間、一時停止する
time.sleep_us(10) # 10マイクロ秒間、一時停止する
start = time.ticks_ms() # ミリ秒カウンター値を取得
delta = time.ticks_diff(time.ticks_ms(), start) # 時差を計算
タイマー¶
(どう使う?)
ピンと GPIO¶
machine.Pin クラスを使います:
from machine import Pin
p0 = Pin(0, Pin.OUT) # GPIO 0 の出力ピンを作成
p0.on() # ピンを "on" (high) レベルに設定
p0.off() # ピンを "off" (low) レベルに設定
p0.value(1) # ピンを on/high に設定
p2 = Pin(2, Pin.IN) # GPIO 2 の入力ピンを作成
print(p2.value()) # 値 0 または 1 を取得
p4 = Pin(4, Pin.IN, Pin.PULL_UP) # 内部プルアップ抵抗を有効化
p5 = Pin(5, Pin.OUT, value=1) # 作成時にピンを high に設定
UART (シリアルバス)¶
machine.UART を参照
from machine import UART
uart1 = UART(1, baudrate=9600, tx=33, rx=32)
uart1.write('hello') # 5バイト書き出す
uart1.read(5) # 5バイトまで読み込む
PWM (パルス幅変調)¶
(RPi RP2xxx で PWM はどう使う?)
machine.PWM
クラスを使います:
from machine import Pin, PWM
pwm0 = PWM(Pin(0)) # ピンから PWM オブジェクトを作成
pwm0.freq() # 現在の周波数を取得
pwm0.freq(1000) # 周波数を設定
pwm0.duty() # 現在のデューティ比を取得
pwm0.duty(200) # デューティ比を設定
pwm0.deinit() # PWM を無効化
ADC (アナログ/デジタル変換)¶
(ADC モジュールはどう使う?)
machine.ADC クラスを使ってください:
from machine import ADC
adc = ADC(Pin(32)) # ADC ピンの ADC オブジェクトを作成
adc.read_u16() # 0.0v - 3.3v 範囲を 0-65535 の値で読込み
ソフトウェア SPI バス¶
ソフトウェア SPI (ビットバンギング)はすべてのピンで動作し、 machine.SoftSPI クラスを介してアクセスします:
from machine import Pin, SoftSPI
# 与えたピンから SoftSPI バスを構築
# 極性 polarity は SCK のアイドル状態
# phase=0 は SCK の第1エッジでサンプルを意味、chase=1 は第2を意味
spi = SoftSPI(baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))
spi.init(baudrate=200000) # ボーレートを設定
spi.read(10) # MISO で 10 バイト読込み
spi.read(10, 0xff) # 10 バイト読込み、その間 MOSI に 0xff を出力
buf = bytearray(50) # バッファを作成
spi.readinto(buf) # 与えたバッファに読込み(この場合は 50 バイト)
spi.readinto(buf, 0xff) # 与えたバッファに読込み、MOSI に 0xff を出力
spi.write(b'12345') # MOSI に 5 バイト書込み
buf = bytearray(4) # バッファを作成
spi.write_readinto(b'1234', buf) # MOSI に書き込み、MISO からバッファに読み込み
spi.write_readinto(buf, buf) # MOSI に buf を書き込み、MISO から buf に読み込み
警告
現在のところ、ソフトウェア SPI を初期化するときには sck
, mosi
, miso
すべて を指定しなければなりません。
ハードウェア SPI バス¶
ハードウェア SPI には machine.SPI クラスを使ってアクセスします:
from machine import Pin, SPI
spi = SPI(1, 10000000)
spi = SPI(1, 10000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
spi = SPI(2, baudrate=80000000, polarity=0, phase=0, bits=8, firstbit=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
ソフトウェア I2C バス¶
ソフトウェア I2C (ビット・バンギングを使用)は、出力可能なすべてのピンで動作し、 machine.SoftI2C クラスを使ってアクセスします。
from machine import Pin, SoftI2C
i2c = SoftI2C(scl=Pin(5), sda=Pin(4), freq=100000)
i2c.scan() # デバイスをスキャン
i2c.readfrom(0x3a, 4) # アドレス 0x3a のデバイスから 4 バイト読み込み
i2c.writeto(0x3a, '12') # アドレス 0x3a のデバイスに '12' を書き込み
buf = bytearray(10) # 10バイトのバッファを作成
i2c.writeto(0x3a, buf) # 与えたバッファをスレーブに書き込み
ハードウェア I2C バス¶
ハードウェア I2C には machine.I2C クラスを使ってアクセスしますこのクラスには先述のソフトウェア I2C と同じメソッドがあります:
from machine import Pin, I2C
i2c = I2C(0)
i2c = I2C(1, scl=Pin(5), sda=Pin(4), freq=400000)
リアルタイムクロック (RTC)¶
machine.RTC を参照:
from machine import RTC
rtc = RTC()
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # 指定の日時を設定
rtc.datetime() # 日時を取得
WDT (ウォッチドッグタイマー)¶
(ウォッチドッグタイマーはある?)
machine.WDT を参照:
from machine import WDT
# WDT を有効化し、タイムアウトを 5s に設定(最低値は 1s)
wdt = WDT(timeout=5000)
wdt.feed()
ディープスリープモード¶
(rp2 でディープスリープはサポートされている?)
次のコードで、スリープ、起床、リセット原因のチェックが行えます:
import machine
# ディープスリープから起こされたかをチェック
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
print('woke from a deep sleep')
# 10秒間のディープスリープに入る
machine.deepsleep(10000)
OneWire ドライバー¶
OneWire ドライバーはソフトウェアで実装され、すべてのピンで動作します:
from machine import Pin
import onewire
ow = onewire.OneWire(Pin(12)) # GPIO 12 で OneWire バスを作成
ow.scan() # バス上のデバイスリストをスキャン
ow.reset() # バスをリセット
ow.readbyte() # 1バイト読込み
ow.writebyte(0x12) # バスに1バイト書込み
ow.write('123') # バスに複数バイト書込み
ow.select_rom(b'12345678') # ROM コードで指定したデバイスを選択
DS18S20 と DS18B20 デバイス用の特定のドライバーがあります:
import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
print(ds.read_temp(rom))
4.7k のプルアップ抵抗をデータラインに接続してください。convert_temp()
メソッドは、温度をサンプリングするたびに呼び出す必要があることに注意してください。
NeoPixel/APA106 ドライバー¶
neopixel
と apa106
モジュールを使います(訳註: 両モジュールは rp2 ではまだサポートされていません):
from machine import Pin
from neopixel import NeoPixel
pin = Pin(0, Pin.OUT) # NeoPixel 駆動のための GPIO 0 を出力に設定
np = NeoPixel(pin, 8) # 8ピクセル用の NeoPixel ドライバーを GPIO 0 で作成
np[0] = (255, 255, 255) # 第1ピクセルを白に設定
np.write() # 全ピクセルにデータ書込み
r, g, b = np[0] # 第1ピクセルの色を取得
APA106 ドライバーは NeoPixel を継承していますが、内部的には異なる色順を使っています:
from apa106 import APA106
ap = APA106(pin, 8)
r, g, b = ap[0]
APA102 (DotStar)はクロック端子が追加されているため、別のドライバーを使います。