i.MXRT ファミリー用クイックリファレンス

Teensy 4.1 board

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 ポートには3つのハードウェアタイマーがあります。 machine.Timer クラスに 0 から 2 までのタイマーIDを指定して使います。

from machine import Timer

tim0 = Timer(0)
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(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('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: 0-33
  • MIMXRT10xx-EVK ボード: 0-21, 'D0-Dxx', 'A0-Ann'
  • Olimex RT1010Py ボード: 0-14, '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

pwm2 = PWM(Pin(2))      # ピンから PWM オブジェクトを作成
pwm2.freq()             # 現在の周波数を取得
pwm2.freq(1000)         # 周波数を設定
pwm2.duty_u16()         # 現在のデューティ比(0-65535 の範囲)を取得
pwm2.duty_u16(200)      # 0 から 65535 の範囲でデューティ比(duty_u16/65525)を設定
pwm2.deinit()           # このピンの PWM を無効化
# ピン 2 と 3 に相補的なシグナルペアを作成
pwm2 = PWM((2, 3), freq=2000, duty_ns=20000)

# 4つの同期シグナルグループを作成。
# サブモジュール 0 の Pin(4) から始めて、同期パルスを作成します。
pwm4 = PWM(Pin(4), freq=1000, align=PWM.HEAD)
# ピン 5, 6, 9 は同じモジュールのピン
pwm5 = PWM(Pin(5), freq=1000, duty_u16=10000, align=PWM.HEAD, sync=True)
pwm6 = PWM(Pin(6), freq=1000, duty_u16=20000, align=PWM.HEAD, sync=True)
pwm9 = PWM(Pin(9), 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_u16duty_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=True|False channel_mask: マスクのビットを設定すると各チャンネルが反転。ビット0は最初に指定されたチャンネルを反転させ,ビット2は2番目に指定されたチャンネルを反転させます。デフォルトは0です。
  • 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(32))          # 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(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 に読み込み

サポートしている最大ボーレートは 500000 です。

ハードウェア SPI バス

最大4つのハードウェア SPI チャンネルがあります(最大30MHz)。ハードウェア SPI には machine.SPI クラスを使ってアクセスします。このクラスには先述のソフトウェア SPI と同じメソッドがあります:

from machine import SPI, Pin

spi = SPI(0, 10000000)
cs_pin = Pin(6, 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 はスクリプトによって設定されなければなりません。その割り当てをクリアするには電源の再投入が必要です。

注記:

  1. 現時点で最も信頼性の高いボーレートが 30MHz 程度であっても、特に高いボーレートでは、ボーレートの設定が必ずしもその通りの周波数になるとは限りません。
  2. より高速なボーレートでの送信も可能です。テストでは、受信は 60MHz まで、送信は 90MHz まで動作しました。

ソフトウェア 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)  # 与えたバッファをペリフェラルに書き込み

サポートしている最大周波数は 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(26), ws=Pin(27), sd=Pin(7),
    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(21), ws=Pin(20), sd=Pin(7), mck=Pin(23),
    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年使用できます。

SD カード

machine.SDCard を参照:

import machine, os

sd = machine.SDCard()
fs = os.VfsFat(sd)
os.mount(fs, "/sd")  # マウント
os.listdir('/sd')    # ディレクトリ内容の一覧
os.umount('/sd')     # 取出し

注記: i.mx-rt 1011 および 1015 ベースのボードは machine.SDCard クラスをサポートしていません。これらについては、MicroPython ドライバの SPI ベースのドライバ sdcard.py を使えます。これを使う場合、SPI ハードウェアモジュールの CS ピンをオーバードライブする必要があります。使用例を次に示します。

import os, 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)
vfs = os.VfsFat(sd)
os.mount(vfs, "/sdcard")

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() メソッドは、温度をサンプリングするたびに呼び出す必要があることに注意してください。

DHT ドライバー

DHT ドライバーはソフトウェアで実装され、すべてのピンで動作します:

import dht
import machine

d = dht.DHT11(machine.Pin(4))
d.measure()
d.temperature() # 例: 23 (°C)
d.humidity()    # 例: 41 (% RH)

d = dht.DHT22(machine.Pin(4))
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.ifconfig() で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 のようなコミュニティでサポートされている代替手段を参照してください。