i.MXRT ファミリー用クイックリファレンス¶
Teensy 4.1 ボード
以下は、i.MXRT ベースのボードのためのクイックリファレンスです。このボードを初めて使う場合は、まず次のマイクロコントローラの概要を確認してみてください。
MicroPython のインストール¶
チュートリアルの章: i.MXRT での MicroPython の始め方 を参照してください。そこにはトラブルシューティングについても記載されています。
ボードの一般的な制御¶
MicroPython REPL は VCP モードに設定した USB ポートで利用できます。タブ補完は、オブジェクトにどのようなメソッドがあるかを調べるのに便利です。貼り付けモード(ctrl-E)は、大きめの Pythonコードを REPL に貼り付けるのに便利です。
machine
モジュール
import machine
machine.freq() # CPU の現在の周波数を取得
遅延とタイミング¶
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) # 時差を計算
タイマー¶
i.MXRT ポートは仮想タイマーをサポートします。次の例のように使います:
from machine import Timer
tim0 = Timer(-1)
tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0))
tim1 = Timer(-1)
tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1))
period の単位はミリ秒です。
ピンと GPIO¶
machine.Pin クラスを使います:
from machine import Pin
p0 = Pin('D0', Pin.OUT) # GPIO 0 の出力ピンを作成
p0.on() # ピンを "on" (high) レベルに設定
p0.off() # ピンを "off" (low) レベルに設定
p0.value(1) # ピンを on/high に設定
p2 = Pin('D2', Pin.IN) # GPIO 2 の入力ピンを作成
print(p2.value()) # 値 0 または 1 を取得
p4 = Pin('D4', Pin.IN, Pin.PULL_UP) # 内部プルアップ抵抗を有効化
p5 = Pin('D5', Pin.OUT, value=1) # 作成時にピンを high に設定
p6 = Pin(pin.cpu.GPIO_B1_15, Pin.OUT) # cpu ピン名を使用
使用可能なピンは、次のように、それぞれのボードの範囲とラベルによります:
Teensy 4.0, MIMXRT10xx-EVK ns Olimex ボード: D0-Dxx' もしくは 'A0-Ann'
Seeed ARCH MIX ボード: 'J3_xx', 'J4_xx', 'J5_xx'
または、Pin.board または Pin.cpu クラスのピン名。
注記:
MIMXRT1xxx-EVK ボードでは、これらのピンに他のオンボードデバイスが接続されている場合があり、入力または出力での使用が制限されます。
MIMXRT1010_EVK では、Arduinoコネクタのピン D4、D5、D9 はデフォルトで MCU に接続されていません。詳細については、回路図を参照してください。
- MIMXRT1170_EVK ボードでは、Arduino コネクタの内側の列が次のように割り当てられています:
'D16' - 'D23': J9、奇数のピン番号。D17はデフォルトでは接続されていません。
'D24' - 'D27': J26、奇数のピン番号。これらのピンを有効にするには、J63-J66 を閉じる必要があります。
'D29' - 'D36': J25、奇数のピン番号。 'D29' と 'D30' はデフォルトでは接続されていません。
ピンを反転させるのに使える、高レベルの抽象化インタフェース machine.Signal があります。 負論理(active-low)の LED でも on()
や value(1)
で点灯できるので便利です。
UART (シリアルバス)¶
machine.UART を参照
from machine import UART
uart1 = UART(1, baudrate=115200)
uart1.write('hello') # 5バイト書き出す
uart1.read(5) # 5バイトまで読み込む
i.MXRT には最大8つのハードウェア UART がありますが、すべてのボードがすべての TX ピンと RX ピンをユーザーに公開しているわけではありません。UART 信号線のピン割り当てについては UART 入出力ピン を参照してください。
PWM (パルス幅変調)¶
i.MXRTには、それぞれ4つの FLEXPWM サブモジュールを備えた最大4つの専用 PWM モジュールと、PWM信号または信号ペアを生成するために使用できる4つのチャンネルを備えた最大4つの QTMR モジュールがあります。
PWM 機能は machine.PWM クラスによって提供されます。そのクラスにリストされているすべての基本メソッドと、シグナルグループを処理するためのいくつかの追加メソッドをサポートします。
# Teensy 用のサンプル
#
from machine import Pin, PWM
# ピンから PWM オブジェクトを作成し、周波数とデューティ比を設定
pwm2 = PWM(Pin('D2'), freq=2000, duty_u16=32768)
pwm2.freq() # 現在の周波数を取得
pwm2.freq(1000) # 周波数を設定/変更
pwm2.duty_u16() # 現在のデューティ比(0-65535 の範囲)を取得
pwm2.duty_u16(200) # 0 から 65535 の範囲でデューティ比を設定
pwm2.deinit() # このピンの PWM を無効化
# ピン D2 と D3 に相補的なシグナルペアを作成
pwm2 = PWM(('D2', 'D3'), freq=2000, duty_ns=20000)
# 4つの同期シグナルグループを作成。
# サブモジュール 0 の Pin('D4') から始めて、同期パルスを作成します。
pwm4 = PWM(Pin('D4'), freq=1000, align=PWM.HEAD)
# ピン D5, D6, D9 は同じモジュールのピン
pwm5 = PWM(Pin('D5'), freq=1000, duty_u16=10000, align=PWM.HEAD, sync=True)
pwm6 = PWM(Pin('D6'), freq=1000, duty_u16=20000, align=PWM.HEAD, sync=True)
pwm9 = PWM(Pin('D9'), freq=1000, duty_u16=30000, align=PWM.HEAD, sync=True)
pwm3 # PWM オブジェクトのプロパティを表示
PWM コンストラクタ¶
- class PWM(dest, freq, duty_u16, duty_ns, *, center, align, invert, sync, xor, deadtime)
以下のパラメータで新しいPWMオブジェクトを構築して、返します。
dest は PWM が出力されるエンティティで、通常は machine.Pin オブジェクトを指定しますが、ポートでは整数や文字列など、machine.PIN クラスの Pin を指定する他の値を使えます。 dest は単一のオブジェクトまたは2項目のオブジェクトから成るタプルのいずれかです。オブジェクトのタプルが指定された場合、2つのピンは補完モードで動作します。この2つのピンは、同じサブモジュールのA/Bチャンネルでなければなりません。
PWM オブジェクトは、FLEXPWM モジュールまたは QTMR モジュールによって提供されます。i.MXRT デバイスは、2つまたは4つの FLEXPWM モジュールと QTMR モジュールを備えています。各 FLEXPWM モジュールには、A、B、X と呼ばれる3つのチャンネルを持つ4つのサブモジュールがあり、各 QTMR モジュールには4つのチャンネルがあります。各 FLEXPWM サブモジュールまたは QTMR チャンネルは、異なるパラメータに設定できます。すべてのチャンネルがボードピンに配線されているわけではありません。詳細は後述します。
freq を設定すると、同じ FLEXPWM サブモジュールの3つのチャンネルに影響します。 duty_u16 と duty_ns は、一度に1つだけ指定する必要があります。
キーワード引数:
freq は PWM 周期の周波数を Hz 単位で設定する整数でなければなりません。有効な周波数範囲はそれぞれ 15Hz, 18Hz, 24Hzから 最大 1MHz 未満です
duty_u16 は,デューティ比を
duty_u16 / 65536
の比率で設定します。X チャンネルのデューティ比は、それぞれのサブモジュールの A および B チャンネルが使われていない場合にのみ変更できます。それ以外の場合、X チャンネルの duty_16 値は 32768 (50%)です。duty_ns は、パルス幅をナノ秒単位で設定します。X チャンネルに対する制限も同様に適用されます。
center=value: パルス周期内のパルスの中心を整数で設定します。値の範囲は 0-65535 です。結果として、center - duty_u16/2 から center + duty_u16/2 までのパルスが持続します。
align=value: パルス中心設定のショートカットで、パルスをフレームの中心(value=0)、開始時の前縁(value=1)、パルス周期の終了時の後縁(value=2)のいずれかにします。
invert=value: チャンネルマスク。マスクのビットを設定すると各チャンネルが反転。ビット0は最初に指定されたチャンネルを反転させ、ビット1は2番目に指定されたチャンネルを反転させます。デフォルトは0です。単一のチャンネルを持つ PWM オブジェクトでは、True と False を値として使えます。
sync=True|False: あるモジュールのサブモジュール0がすでにアクティブな場合、同じモジュールの他のサブモジュールは、サブモジュール0に同期するように強制できます。デフォルトは False です。
xor=0|1|2: 1 または 2 に設定すると、チャンネル A または B から XOR された信号が出力されます。2 に設定した場合、A と B は交互に信号を出力します。詳細および図解は、MCU のリファレンスマニュアル "Double Switching PWMs" の章を参照してください。
deadtime=time_ns: この設定は相補的なチャンネルに影響し、最初のチャンネルのエッジと次のチャンネルのエッジの間のデッドタイムを定義し、その間に両方のチャンネルがローに設定されます。これにより、接続されたHブリッジは、プッシュプルドライバの片側をスイッチオフしてから、もう片側をスイッチオンすることができます。
PWM メソッド¶
メソッドは汎用的な machine.PWM クラスと同じですが、init() メソッドのキーワード引数が追加され、コンストラクタの引数と同じになります。
各 FLEX サブモジュールまたは QTMR モジュールは、異なる周波数で動作することがあります。PWM 信号は、式に従って、pwm_clk 信号を積分係数で割ることによって生成されます:
f = pwm_clk / (2**n * m)
このコードで、n は 0..7 の範囲、m は 2..65536 の範囲です。pmw_clk は,MIMXRT1010/1015/1020 では 125Mhz、MIMXRT1050/1060/1064 では 150MHz、MIMXRT1170 では 160MHz です。最低周波数は pwm_clk/2**23 (15, 18, 20Hz) です。U16 分解能での最高周波数は pwm_clk/2**16 (1907, 2288, 2441 Hz) で、1%分解能での最高周波数は pwm_clk/100 (1.25, 1.5, 1.6 MHz)です。達成可能な最高周波数は、A/B チャンネルでは pwm_clk/3、X チャンネルと QTMR 信号では pwm_clk/2 となります。
PWM のピン割当て¶
ピンは Pin クラスと同様に指定します。PWM 信号線のピン割当てについては PWM 入出力ピン を参照してください。
ADC (アナログ/デジタル変換)¶
i.MXRT での ADC 機能は 'Ann' とラベル付けられたピンで利用できます。
machine.ADC クラスを使います:
from machine import ADC
adc = ADC(Pin('A2')) # ADC ピンの ADC オブジェクトを作成
val = adc.read_u16() # 生のアナログ値を 0-65535 (0.0v - 3.3v)の範囲で読込み
ADC の分解能は12bitで、read_u16() が返す値とは関係なく、10~11bit の精度を持ちます。より高い分解能や精度が必要な場合は、外部 ADC を使用してください。
ソフトウェア 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('D0'), mosi=Pin('D2'), miso=Pin('D4'))
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 に読み込み
サポートしている最大ボーレートは 500000 です。
ハードウェア SPI バス¶
最大4つのハードウェア SPI チャンネルがあります(最大30MHz)。ハードウェア SPI には machine.SPI クラスを使ってアクセスします。このクラスには先述のソフトウェア SPI と同じメソッドがあります:
from machine import SPI, Pin
spi = SPI(0, 10000000)
cs_pin = Pin('D6', Pin.OUT, value=1)
cs_pin(0)
spi.write('Hello World')
cs_pin(1)
SPI 信号線のピン割当てについては ハードウェア SPI 入出力ピン を参照してください。キーワードオプション cs=n を使うと、cs ピン 0 または 1 を自動 cs 信号として有効化できます。デフォルトは cs=-1 です。cs=-1 を適用すると自動 cs 信号は生成されません。この場合、cs はスクリプトによって設定されなければなりません。その割り当てをクリアするには電源の再投入が必要です。
注記:
現時点で最も信頼性の高いボーレートが 30MHz 程度であっても、特に高いボーレートでは、ボーレートの設定が必ずしもその通りの周波数になるとは限りません。
より高速なボーレートでの送信も可能です。テストでは、受信は 60MHz まで、送信は 90MHz まで動作しました。
ソフトウェア I2C バス¶
ソフトウェア I2C (ビット・バンギングを使用)は、出力可能なすべてのピンで動作し、 machine.SoftI2C クラスを使ってアクセスします。
from machine import Pin, SoftI2C
i2c = SoftI2C(scl=Pin('D5'), sda=Pin('D4'), freq=100000)
i2c.scan() # デバイスをスキャン
i2c.readfrom(0x3a, 4) # アドレス 0x3a のデバイスから 4 バイト読み込み
i2c.writeto(0x3a, '12') # アドレス 0x3a のデバイスに '12' を書き込み
buf = bytearray(10) # 10バイトのバッファを作成
i2c.writeto(0x3a, buf) # 与えたバッファをペリフェラルに書き込み
サポートしている最大周波数は 400000 です。
ハードウェア I2C バス¶
最大4つのハードウェア I2C チャンネルがありますハードウェア I2C は、より高速な伝送速度を可能にし、完全な I2C プロトコルをサポートします。I2C 信号線は GPIO ピンへの割り当てが固定されています。I2C 信号線のピン割当てについては ハードウェア I2C の入出力ピン を参照してください。
ハードウェア I2C には machine.I2C クラスを使ってアクセスしますこのクラスには先述のソフトウェア I2C と同じメソッドがあります:
from machine import I2C
i2c = I2C(0, 400_000)
i2c.writeto(0x76, b"Hello World")
I2S バス¶
machine.I2S を参照。次のコードは Teensy 4.1 ボードと UDA1334 のようなシンプルな外部コーデックを使った例です:
from machine import I2S, Pin
i2s = I2S(2, sck=Pin('D26'), ws=Pin('D27'), sd=Pin('D7'),
mode=I2S.TX, bts=16,format=I2S.STEREO,
rate=44100,ibuf=40000)
i2s.write(buf) # オーディオサンプルのバッファを I2S デバイスに書き出す
次のコードは MIMXRT10xx_DEV ボードで I2S を使う例です:
from machine import I2S, I2C, Pin
import wm8960
i2c=I2C(0)
wm=wm8960.WM8960(i2c, sample_rate=SAMPLE_RATE_IN_HZ,
adc_sync=wm8960.sync_dac,
swap=wm8960.swap_input)
i2s = I2S(1, sck=Pin("SCK_TX"), ws=Pin("WS_TX"), sd=Pin("SD_RX"),
mck=Pin("MCK),mode=I2S.RX, bts=16,format=I2S.MONO,
rate=32000,ibuf=10000)
i2s.readinto(buf) # I2S デバイスからのオーディオサンプルをバッファに読み込む
この例では、右チャンネルにオンボードマイクを接続し、左チャンネルからモノラル音声を取り込んでいるため、WM8960 ドライバの入力チャンネルが入れ替わっています。sck と ws ピンは、I2Sバスの TX 信号線に接続されていることに注意してください。これは意図的なもので、MW8960コーデックでは、これらの信号が RX と TX で共有されているからです。
次こコードは Teensy オーディオシールドを使った例です。
from machine import I2C, I2S, Pin
from sgtl5000 import CODEC
i2s = I2S(1, sck=Pin('D21'), ws=Pin('D20'), sd=Pin('D7'), mck=Pin('D23'),
mode=I2S.TX, bits=16,rate=44100,format=I2S.STEREO,
ibuf=40000,
)
# SGTL5000 コーデックの設定
i2c = I2C(0, freq=400000)
codec = CODEC(0x0A, i2c)
codec.mute_dac(False)
codec.dac_volume(0.9, 0.9)
codec.headphone_select(0)
codec.mute_headphone(False)
codec.volume(0.7, 0.7)
i2s.write(buf) # オーディオサンプルのバッファを I2S デバイスに書き出す
Teensy Audio シールドで使う SGTL5000 コーデックは、RX 信号線を RX と TX の両方に使います。コーデックは、I2S デバイスの後で初期化されることに注意してください。MCK は I2C の動作に必要で、I2Sコントローラから提供されるため、これは不可欠なことです。
MIMXRT ボードでは、ボードコネクタで 1 または 2 の I2S バスが利用可能です。MIMXRT1010 デバイスの場合、バス番号は1および3です。I2S 信号線は GPIO ピンへの割り当てが固定されています。I2S 信号線のピン割当てについては I2S 入出力ピン を参照してください。
リアルタイムクロック (RTC)¶
machine.RTC を参照:
from machine import RTC
rtc = RTC()
rtc.datetime((2017, 8, 23, 1, 12, 48, 0, 0)) # 指定の日時を設定
rtc.datetime() # 日時を取得
rtc.now() # CPython フォーマットで日時を返す。
i.MXRT MCU は、RTC のバッテリーバックアップに対応しています。1.5-3.6Vの電池を接続することで、主電源がない状態でも時刻と日付を保持できます。バッテリーから引き出される電流は 〜20µA で、これはかなり大きいです。CR2032 コイン電池で約1年使用できます。
注記: バージョン 1.23.0 では、サブセカンド(小数秒)のサポートが削除されました。RTC を読み取る際、サブセカンドの値として 0 が返されます。RTC 時間を設定する際は、サブセカンドフィールドは無視されます。RTC 自体はマイクロ秒の値を提供しません。
SD カード¶
machine.SDCard を参照:
import machine, os, vfs
sd = machine.SDCard()
fs = vfs.VfsFat(sd)
vfs.mount(fs, "/sd") # mount
os.listdir('/sd') # list directory contents
vfs.umount('/sd') # eject
注記: i.mx-rt 1011 および 1015 ベースのボードは machine.SDCard
クラスをサポートしていません。これらについては、MicroPython ドライバの SPI ベースのドライバ sdcard.py を使えます。これを使う場合、SPI ハードウェアモジュールの CS ピンをオーバードライブする必要があります。使用例を次に示します。
import vfs, sdcard, machine
cs_pin = "D10"
spi = machine.SPI(0) # SPI0 with cs at Pin "D10" used for SDCARD
cs = machine.Pin(cs_pin, machine.Pin.OUT, value=1)
sd = sdcard.SDCard(spi, cs)
fs = vfs.VfsFat(sd)
vfs.mount(fs, "/sdcard")
OneWire ドライバー¶
OneWire ドライバーはソフトウェアで実装され、すべてのピンで動作します:
from machine import Pin
import onewire
ow = onewire.OneWire(Pin('D12')) # 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()
メソッドは、温度をサンプリングするたびに呼び出す必要があることに注意してください。
DHT ドライバー¶
DHT ドライバーはソフトウェアで実装され、すべてのピンで動作します:
import dht
import machine
d = dht.DHT11(machine.Pin('D4'))
d.measure()
d.temperature() # 例: 23 (°C)
d.humidity() # 例: 41 (% RH)
d = dht.DHT22(machine.Pin('D4'))
d.measure()
d.temperature() # 例: 23.6 (°C)
d.humidity() # 例: 41.3 (% RH)
4.7k のプルアップ抵抗をデータラインに接続してください。DHT モジュールの中にはプルアップ抵抗が実装済みのものもあります
イーサネットドライバー¶
MIMXRT1011 搭載ボードと Teensy 4.0 を除くすべての MIMXRT ボードではイーサネットをサポートしています。使用例を次に示します。
import network
lan = network.LAN(0)
lan.active(True)
LAN内にDHCPサーバーがある場合は、そのサーバーからIPアドレスが提供されます。DHCPサーバが無い場合は lan.ipconfig(addr4="...") でIPアドレスを設定できます。デフォルトのアドレスは 192.168.0.1 です。
Teensy 4.1 には基板上にイーサネット端子がありませんが、PJRC から自作用のアダプタが提供されています。Seeed ARCH MIXボードはボード上に PHY ハードウェアを持っていませんが、外部 PHY インタフェースを取り付けられます。デフォルトでは、Seeed Arch Mix のファームウェアは LAN8720 PHY 用のドライバを使います。MIMXRT1170_EVK は2つのイーサネットポートを装備しており、100MポートにはLAN(0)、1GポートにはLAN(1)とアドレス指定されています。
ネットワークインタフェースの詳細については network.LAN クラスを参照してください
ファイルの転送¶
mpremote
ツールやSDカードなどを使って、i.MXRT デバイスにファイルを転送できます。イーサネットが利用できる場合は、ftp も利用できます。FTP サーバについては MicroPython フォーラムを、i.MXRT ボードへのファイル転送については rshell や Thonny のようなコミュニティでサポートされている代替手段を参照してください。