先日(2023年4月26日),MicroPythonがアップデートされv1.20となった.世間一般にはRaspberry Pi Pico Wで使える安定版がリリースされたとして話題になってるっぽい感じだが,この版はi.MX RT1170の評価基板:MIMXRT1170-EVKの安定版リリースでもある.
そんなわけで,どんなものか試してみたくてMIMXRT1170-EVKを借りてきた.
これはこの基板でMicroPythonを動作させるまでのメモ.
なお,この記事は細かいステップについてはかなり端折って書いてある.MicroPythonそのものや動作確認で使用したThonnyについてなどは,MIMXRT1050-EVKBでインストール〜動作確認を行った動画:『MicroPythonをi.MX RTクロスオーバーMCUで動かしてみた』を参照.
MicroPythonのインストール
J2コネクタに電源をつないで,J11コネクタ(USBマイクロBコネクタ)にPCを接続.下の図は各ケーブルを接続して電源スイッチ(SW1)を入れた様子.
そうするとデスクトップ上に「RT1170-EVK」の名のストレージ・デバイスがアイコンとして現れる.
MicroPythonのMIMXRT1170-EVK用ダウンロード・ページからbinファイル
をもらってきてドラッグ&ドロップ・コピー.
USBケーブルを「USB1(SDP)」コネクタ(J20)に接続し直す.
Thonnyを起動して以下のメッセージが表示されたら動作している
MicroPython v1.20.0 on 2023-04-26; i.MX RT1170 EVK with MIMXRT1176DVMAA
Type "help()" for more information.
動作確認
単純にピンの出力をHIGH/LOWさせてMicroPythonが動いているかどうかを確かめる.
Arduinoコネクタ(この基板の場合,Arduinoシールド・コネクタは片側2重になっていて,互換のピンは外側の列)の信号の名前でピンを指定できる
from machine import Pin
def main():
p0 = Pin( "D0", Pin.OUT )
while True:
p0.value( 1 )
p0.value( 0 )
if __name__ == "__main__":
main()
でもこの例ではピン出力をHIGH/LOWするだけで,動作を見てみるにはロジアナやオシロスコープが必要になってしまう.とりあえず手持ちのロジアナで出力を見てみたのが下の図.
でも,この基板には簡単な動作確認用にLEDが2個用意されているのでそれを使ってみる.
LEDがどのIOピンに接続されていて,どのように指定できるかを確認しないといけない.
まずは回路図を見てみる.回路図はここからダウンロードできる.
回路図を見るとUSER LED1
とUSER LED2
があり,それぞれUSER_LED_CTL1
とUSER_LED_CTL2
信号で制御できるようになっている.この信号を追っていくとマイコンのGPIO_AD_04
とGPIO_AD_26
のピンに接続されている.
MicroPythonではピンがどのように定義されているかは次のようなコマンドで確認できる.
基板のピン指定に使える名前は以下のようにして確認できる.
>>>
は,MicroPythonのプロンプト
>>> import machine
>>> dir( machine.Pin.board )
['__class__', '__name__', '__bases__', '__dict__', 'A0', 'A1',
'A2', 'A3', 'A4', 'A5', 'CS', 'D0', 'D1', 'D10', 'D11', 'D12',
'D13', 'D14', 'D15', 'D16', 'D17', 'D18', 'D19', 'D2', 'D20',
'D21', 'D22', 'D23', 'D24', 'D25', 'D26', 'D27', 'D29', 'D3',
'D30', 'D31', 'D32', 'D33', 'D34', 'D35', 'D36', 'D4', 'D5',
'D6', 'D7', 'D8', 'D9', 'LED1', 'LED2', 'MCK', 'RX', 'SCK',
'SCK_RX', 'SCK_TX', 'SCL', 'SDA', 'SDI', 'SDO', 'SD_RX', 'SD_TX',
'TX', 'WS_RX', 'WS_TX']
>>>
マイコンチップのピン名での指定に使える名前はこんな風に...
>>> import machine
>>> dir( machine.Pin.cpu )
['__class__', '__name__', '__bases__', '__dict__', 'GPIO_AD_00', 'GPIO_AD_01',
'GPIO_AD_02', 'GPIO_AD_03', 'GPIO_AD_04', 'GPIO_AD_05', 'GPIO_AD_06', 'GPIO_AD_07',
'GPIO_AD_08', 'GPIO_AD_09', 'GPIO_AD_10', 'GPIO_AD_11', 'GPIO_AD_12', 'GPIO_AD_13',
'GPIO_AD_14', 'GPIO_AD_15', 'GPIO_AD_16', 'GPIO_AD_17', 'GPIO_AD_18', 'GPIO_AD_19',
'GPIO_AD_20', 'GPIO_AD_21', 'GPIO_AD_22', 'GPIO_AD_23', 'GPIO_AD_24', 'GPIO_AD_25',
'GPIO_AD_26', 'GPIO_AD_27', 'GPIO_AD_28', 'GPIO_AD_29', 'GPIO_AD_30', 'GPIO_AD_31',
'GPIO_AD_32', 'GPIO_AD_33', 'GPIO_AD_34', 'GPIO_AD_35', 'GPIO_DISP_B1_00',
'GPIO_DISP_B1_01', 'GPIO_DISP_B1_02', 'GPIO_DISP_B1_03', 'GPIO_DISP_B1_04',
...中略...
'GPIO_SD_B2_09', 'GPIO_SD_B2_10', 'GPIO_SD_B2_11']
>>>
これをみると回路図で見たとおりの名前があるので,それを使ってコードにしてみたらこんな感じ.
from machine import Pin
from utime import sleep
def main():
user_led1 = Pin( "GPIO_AD_04", Pin.OUT )
user_led2 = Pin( "GPIO_AD_26", Pin.OUT )
while True:
user_led1.value( 1 )
user_led2.value( 0 )
sleep( 0.1 )
user_led1.value( 0 )
user_led2.value( 1 )
sleep( 0.1 )
if __name__ == "__main__":
main()
I²C
I²Cも試してみる.MIMXRT1050-EVKBではA4/A5ピンでのI²C制御は,ハードウェアI2Cクラスのインスタンスを宣言する際の第一引数のIDを「0」とすることでできた.
#i2c = I2C( 0, freq = (400_1000) ) # MIMXRT1050-EVKBの場合
i2c = I2C( 2, freq = (400_1000) ) # MIMXRT1170-EVKの場合
MIMXRT1170-EVKの場合はこれを「2」としてやる必要がある.
この違いはHardware I2C pin assignmentに明記されている.
このような基板による設定の違いを抽象化したい場合には以下のようなコードを書いておくと便利.
os.uname().machine
からは基板によって以下のような文字列が返ってくるので,これによって制御を変える
'i.MX RT1050 EVKB-A1 with MIMXRT1052DVL6B'
'i.MX RT1170 EVK with MIMXRT1176DVMAA'
import os
...
if "i.MX RT1170 EVK" in os.uname().machine:
i2c = machine.I2C( 2, freq = (400_000) )
else:
i2c = machine.I2C( 0, freq = (400_000) )
Etherポート
MIMXRT1170-EVKにはEtherポートは2個用意されている.
ネットワーク開始の際のポート指定に「0」または「1」を指定してやることで,それぞれ100Mbps側と1Gbps側を指定して使うことができる.
#lan = network.LAN( 0 ) # 100Mbpsポート (RT1050でのポートもこれ)
lan = network.LAN( 1 ) # 1Gbpsポート