MAiX IIをjupyter notebookで開発する

#はじめに
M5のUnit V2のプレオーダーが始まりましたが、発売はまだ一カ月先ということです。
待ち遠しいので同じくWi-FiとカメラとマイクとスピーカーとディスプレイとユーザーボタンとマイクロSDカードスロットとGPIOがついてさらにはLinuxが走るMAiX IIで遊んで待ちましょう。
スペックはUnitV2の方が優れていますが、価格は[$28.8](https://www.seeedstudio.com/Sipeed-MAIX-Dock-p-4815.html)と格安（[UnitV2は$75](https://m5stack-store.myshopify.com/products/unitv2-ai-camera-gc2145)）です。 

#１．事前準備と参考情報
##１－１．ファームウェア
MAiXIIを使には、microSDにファームウェアをインストールする必要があります。ファームウェアのインストールにはLinuxPCもしくはWindowsPCが必要です。
ファームウェアは[こちら](https://dl.sipeed.com/shareURL/MaixII/SDK/release)からダウンロードできます。2021/4/18時点の最新版はv831_sipeed_20210203_image.zipdです。

##１－２．ファームウェアのインストール
インストール方法は[こちらの公式サイト](https://maixpy.sipeed.com/maixpy3/zh/install/maixii_m2dock/flash.html)で確認できます。中国語サイトですがブラウザの翻訳機能でも理解できると思います。
Linux版は[Qiitaに日本語記事](https://qiita.com/airpocket/items/0c06772712d8d5cfbe4b)を掲載しています。

##１－３．シリアル接続して初期設定など
ファームウェアのインストールはMAiXIIのUSB OTG側のコネクタに接続して行いますが、初期設定等はUSB UART側に接続してシリアル通信します。シリアル通信の接続方法は公式の説明は[こちら](https://maixpy.sipeed.com/maixpy3/zh/install/maixii_m2dock/drive.html)です。chromeの日本語翻訳ですんなり実行出来ると思います。
接続ツールはMobaXtermがおすすめと言うことで試してみたら確かに使いやすかったです。MobaXtermを使ったシリアル通信接続方法は[こちら](https://maixpy.sipeed.com/maixpy3/zh/tools/mobaxterm.html)。chromeの日本語翻訳がうまく動かなかったのでDeepLあたりに食わせて翻訳しましょう。

さらにさらにモジュールのアップグレードとかWi-Fiの設定とかをしておきます。説明は[こちら](https://maixpy.sipeed.com/maixpy3/zh/install/maixii_m2dock/config.html)。

##１－４．禁断のWi-Fi接続
シリアル接続だけしててもできることは限られているのでWi-Fi接続を行います。Ethernet接続もできるようですが、めんどくさそうなので技適の試用申請してWi-Fiつなぐのが早そうですね。
ディスプレイをはがして、MAiXIIとMAiX2dockを分解するとWi-Fiチップが見えます。使用されているWi-Fiの通信チップはRealTekのRTL8189FTVです。
![DSC_2869.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/b50a0016-d809-92fc-859a-ec319b61535c.jpeg)
![DSC_2869.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/fcb9c1e8-b75c-a36d-e6e4-c1409daec8f6.jpeg)
このチップは技適を通っており、スペックも確認がとれますので技適未取得機器を用いた実験等の特例制度に申請して接続してしまいます。

初期設定でWi-FiのSSIDとパスワードが正しく入力されていれば、再起動と同時にWi-Fiに接続されます。シリアル接続してifconfigでIPアドレスを確認してください。
MobaXtermからSSH接続を選択し、IPアドレスと初期設定時に決めたユーザーIDとパスワードを入力すれば接続できるはずです。

##１－５．IPアドレス固定
毎度IPアドレスを確認するのも面倒なので、固定しておきます。
USBシリアル接続側から操作します。

```sh
$ ip addr                                 //現在接続しているIPアドレス確認  
$ ip link set wlan0 down                  //wifi off
$ ip addr del 192.168.1.200/24 dev wlan0  //現在接続しているIPアドレス設定を削除
$ ip addr add 192.168.4.13/24 dev wlan0   //新しいアドレスを追加
$ ip link set wlan0 up                    //wifi on
$ echo "nameserver 192.168.4.1" >> /etc/resolv.conf //接続先のDNS
$ echo "nameserver 8.8.8.8" >> /etc/resolv.conf
```
 

#２．jupyter notebookの設定。

jupyter notebookで接続する準備をします。公式の説明は[こちら](https://maixpy.sipeed.com/maixpy3/zh/tools/jupyter.html)ですが、さらに[ここ]を参照しろと言われます。
基本的な仕組みとしては、リモート側（MAiX II）とローカル側（PC）でrpycというサービスを立ち上げて、jupyterのカーネルにrpyc-pythonを設定してやるとあとは宜しくやってくれる用です。

##２－１．リモート(MAiX II)側の設定
MaixIIにはrpycもジュールが既にインストールされていますので立ち上げるだけです。

```sh
python -c "from maix import rpycs; rpycs.start()" &
```

これでサービスが立ち上がりました。常駐してくれるようで、2度目以降は不要です。

##２－２．ローカル(PC)側
jupyter notebook、python3がインストール済みであることを前提とします。
rpycモジュールをインストールして有効化します。

```sh
pip3 install rpyc_ikernel
python3 -m rpyc_ikernel.install
```

これで、pythonのカーネルとしてrpycが使用可能となりました。
早速jupyter notebookを立ち上げて、「New」からRPyc-Pythonを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/870c3cb4-5e96-b73e-7e0f-9528c60394f8.png)

noteが立ち上がったら、MAiX IIのIPアドレスを指定してコネクトします。IPアドレスは任意の値に変更してください。

```python
$connect("192.168.1.115")
import platform
print(platform.uname())
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/bfaa585a-871b-727a-da0d-8d3f04d4e304.png)

VScodeもjupyter notebookに対応したので同様に接続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/020e71f7-f794-b219-af57-616aeb5f9073.png)

VScode使うなら、jupyterじゃなくて直接スクリプト触りたいですけどね。。。