MIMXRT1170-EVKでMicroPython

先日(2023年4月26日)，[MicroPython](https://micropython.org)がアップデートされv1.20となった．世間一般には[Raspberry Pi Pico W](https://www.raspberrypi.com/products/raspberry-pi-pico/)で使える安定版がリリースされたとして話題になってるっぽい感じだが，この版はi.MX RT1170の評価基板：MIMXRT1170-EVKの安定版リリースでもある．
そんなわけで，どんなものか試してみたくて[MIMXRT1170-EVK](https://www.nxp.jp/design/development-boards/i-mx-evaluation-and-development-boards/i-mx-rt1170-evaluation-kit:MIMXRT1170-EVK)を借りてきた．
これはこの基板でMicroPythonを動作させるまでのメモ． 

なお，この記事は細かいステップについてはかなり端折って書いてある．MicroPythonそのものや動作確認で使用したThonnyについてなどは，[MIMXRT1050-EVKBでインストール〜動作確認を行った動画：『MicroPythonをi.MX RTクロスオーバーMCUで動かしてみた』](https://youtu.be/KHRxZc4m0Vc)を参照．


# MicroPythonのインストール 

J2コネクタに電源をつないで，J11コネクタ(USBマイクロBコネクタ)にPCを接続．下の図は各ケーブルを接続して電源スイッチ(SW1)を入れた様子．

![DSC_0750.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/e05e5a75-00c5-7334-ad8b-454ec755bad8.jpeg)

そうするとデスクトップ上に「RT1170-EVK」の名のストレージ・デバイスがアイコンとして現れる．

![スクリーンショット 2023-05-02 15.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/f56f3877-78da-f372-4254-10b617071996.png)

MicroPythonの[MIMXRT1170-EVK用ダウンロード・ページ](https://micropython.org/download/MIMXRT1170_EVK/)から[binファイル](https://micropython.org/resources/firmware/MIMXRT1170_EVK-20230426-v1.20.0.bin)
をもらってきてドラッグ&ドロップ・コピー．

![スクリーンショット 2023-05-02 16.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/cadc0033-7622-917a-9e03-f5ddb860c2e1.png)

USBケーブルを「USB1(SDP)」コネクタ(J20)に接続し直す．

![DSC_0754.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/7713e705-53f9-67d5-3832-35b803ef95ec.jpeg)

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重になっていて，互換のピンは外側の列）の信号の名前でピンを指定できる
```python 
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するだけで，動作を見てみるにはロジアナやオシロスコープが必要になってしまう．とりあえず手持ちのロジアナで出力を見てみたのが下の図． 
![スクリーンショット 2023-05-02 15.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/81d5a68e-42d6-34cc-195c-50c2c3c89302.png)



でも，この基板には簡単な動作確認用にLEDが2個用意されているのでそれを使ってみる． 
LEDがどのIOピンに接続されていて，どのように指定できるかを確認しないといけない．
まずは回路図を見てみる．回路図は[ここ](https://www.nxp.jp/design/development-boards/i-mx-evaluation-and-development-boards/i-mx-rt1170-evaluation-kit:MIMXRT1170-EVK)からダウンロードできる．  

回路図を見ると`USER LED1`と`USER LED2`があり，それぞれ`USER_LED_CTL1`と`USER_LED_CTL2`信号で制御できるようになっている．この信号を追っていくとマイコンの`GPIO_AD_04`と`GPIO_AD_26`のピンに接続されている． 
MicroPythonではピンがどのように定義されているかは次のようなコマンドで確認できる． 

基板のピン指定に使える名前は以下のようにして確認できる． 
`>>>`は，MicroPythonのプロンプト 

```python
>>> 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']
>>> 
```

マイコンチップのピン名での指定に使える名前はこんな風に...

```python
>>> 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']
>>> 
```

これをみると回路図で見たとおりの名前があるので，それを使ってコードにしてみたらこんな感じ．

```python
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()
```
緑と赤のLEDがチカチカする．
![led.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/c97e6082-cb70-0f1a-9482-029cb9e23131.gif)


# I²C 

I²Cも試してみる．[MIMXRT1050-EVKB](https://www.nxp.jp/design/development-boards/i-mx-evaluation-and-development-boards/i-mx-rt1050-evaluation-kit:MIMXRT1050-EVK)ではA4/A5ピンでのI²C制御は，ハードウェアI2Cクラスのインスタンスを宣言する際の第一引数のIDを「0」とすることでできた．
```python
#i2c = I2C( 0, freq = (400_1000) ) # MIMXRT1050-EVKBの場合
i2c  = I2C( 2, freq = (400_1000) ) # MIMXRT1170-EVKの場合
```

MIMXRT1170-EVKの場合はこれを「2」としてやる必要がある． 
この違いは[Hardware I2C pin assignment](https://docs.micropython.org/en/latest/mimxrt/pinout.html#mimxrt-i2c-pinout)に明記されている． 

このような基板による設定の違いを抽象化したい場合には以下のようなコードを書いておくと便利． 

`os.uname().machine`からは基板によって以下のような文字列が返ってくるので，これによって制御を変える
`'i.MX RT1050 EVKB-A1 with MIMXRT1052DVL6B'`
`'i.MX RT1170 EVK with MIMXRT1176DVMAA'`
```python
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側を指定して使うことができる．

```python 
#lan = network.LAN( 0 ) # 100Mbpsポート (RT1050でのポートもこれ)
lan  = network.LAN( 1 ) # 1Gbpsポート
```

![スクリーンショット 2023-05-02 16.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288603/9db14030-d29e-0405-f10d-99bb55811cb5.png)