M5StickC PLUS 主にMicroPythonで遊ぶ

ちっちゃくて，いろいろ遊べるデバイスです。私の遊び方をまとめることにします。

https://docs.m5stack.com/en/quick_start/m5stickc_plus/mpy
https://docs.m5stack.com/en/core/m5stickc_plus

ほぼこのページで説明されているのですが，補足の意味で書きます。

# まずはとにかくファームを書き込む

- M5Burnerを使います。上記URL参照。
- PLUSじゃないサンプルファイルを書き込むと，いろいろ不都合を起こします。やってしまったら，`Easyloader`等でやり直しします。（これも上記URLからたどれる）
- WiFiの設定も適宜行います。

# とにかく REPL と ampy で操る

いきなりUSBケーブルを接続し，`ampy`コマンドを送っても反応がないので，かなり悩みました。

なかなかズバリ書かれた記事が見当たらなかったのですが，以下の手順を見つけました。macOS Big Sur 11.6.4 を使っています。

- USBケーブルでmacに接続し，`screen` でM5StickC PLUSと通信します。（デバイス番号は適宜変更してください）

```bash
screen /dev/cu.usbserial-1DD2F6A6AB 115200
```

M5StickC PLUSから反応がない場合が多いです。**Ctrl+C / Ctrl+D / Ctrl+B などを送ってみます。** 見慣れたメッセージが出てくるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/812813ea-b1a6-d119-6b4e-cd1963995e15.png)

このまま REPL 上で操作も可能です。ああよかった。

その REPL の状態で，`screen`を脱出します。[Ctrl]+[a] つぎに [k] [y] を押します。ampyを受け付けるようになります。

```bash
$ ampy -p /dev/cu.usbserial-1DD2F6A6AB ls /flash
/flash/apps
/flash/blocks
/flash/boot.py
/flash/emojiImg
/flash/img
/flash/main.py
/flash/res
/flash/temp.py
/flash/test.py
/flash/update
$ ampy -p /dev/cu.usbserial-1DD2F6A6AB run blink.py 
0
1
2
3
4
$
```

使ったスクリプト

```blink.py
from m5stack import *
from m5ui import *
from uiflow import *
import utime

def run():
    for i in range(5):
        print(i)
        M5Led.on()
        utime.sleep(0.5)
        M5Led.off()
        utime.sleep(0.5)

run()
```

それでも，どのようなきっかけなのかよくわかりませんが，ampyを受け付けなくなるときがあります。そんなときも，上記のようにREPLにアクセスして，いったん`screen`を抜ければまたampyを受け付けるようになるはずです。

# M5StickC PLUS の動作モードについて

これも最初わからなくて悩みました。。。末尾の記事を参考に，やっと自分なりに理解できるようになりました。うまく説明できるか不安ですが。。。

図はいろいろなURLから引用させてもらいました。

まず，どのモードになっていても，上に記載した方法で **強制的にREPLにアクセスすることができるようです。** ひと安心です。

電源を入れて，最初の画面が出たらすぐに[B]ボタンを何度か押すと，以下の3モードが切り替えできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/3b86564a-9595-f7d2-e782-7e835afbfb84.png)

左から Internet モード，USB モード，APP モードとなってます。

[B]ボタンを離してしばらくすると，そのモードで動作開始します。

- Internetモードでは，https://flow.m5stack.com/ で遊びます。
- USBモードでは，UIFlow-Desktop-IDEや，VScode + [vscode-m5stack-mpy](https://marketplace.visualstudio.com/items?itemName=curdeveryday.vscode-m5stack-mpy)  が使えます。
- APPモードは，main.py が走ります。

また，電源ON直後に[A(M5)]を押し，続けて[B]を連打することで，以下3つの裏モードに入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/87cc560b-162f-93f2-fcd4-376258e0ae4d.png)

[B]で選んで[A(M5)]で確定します。

- Code ではInternetモードになるようです。
- Setup は設定メニューに入ります。
- APPListでは，`app/`にある`*.py`ファイルを選んで実行できます。

最初は [A(M5)] や [B] を押すタイミングが良くわかりませんでしたが，慣れたらOKでした。
REPLからCtrl+Dで再起動すると少し楽です。

# VScode + [vscode-m5stack-mpy](https://marketplace.visualstudio.com/items?itemName=curdeveryday.vscode-m5stack-mpy) で遊ぶ

公式ガイドのとおりですが，少しだけ補足します。

M5StickC PLUS を接続すると，エクスプローラー - M5STACK DEVICE にデバイス内のファイル一覧が出てきます。これらの *.py ファイルに対して編集したり，`Run in M5Stack` したりすることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/a5f89d55-2333-dd6b-8e8b-42b9e39eea72.png)

#  Thonnyを使う（個人的おすすめ 加筆修正）

- Ctrl+C連打等でREPLへのアクセスは可能です。デバイス内のファイルも開けます。ただ，`>>> %Run -c $EDITOR_CONTENT` がうまく動きません。`import`して実行します。（`blink.py`は上記参照）
- または `exec("myfile.py")`とすれば簡単です。

```
MicroPython ae8b2b72a-dirty on 2022-03-04; M5StickC-Plus with ESP32
Type "help()" for more information.
>>> os.listdir()
['apps', 'blink.py', 'blocks', 'boot.py', 'emojiImg', 'img', 'main.py', 'res', 'temp.py', 'test.py', 'update']
>>> import blink
0
1
2
3
4
>>> import blink
>>> blink.run()
0
1
2
3
4
>>> del blink
>>> import blink
>>> blink.run()
0
1
2
3
4
>>> 
```

しばらく使い込んでみました。以下のように使うといい感じでした。
- M5StickC PLUS は APPモードにします。
- Thonnyに接続します。REPLに戻らなかったら，Ctrl+C連打等実施します。
- 表示 - ファイル を選んでおけば，デバイス内のファイルやり取りも簡単です。とにかくデバイス内にスクリプトを用意します。
- `main.py`を書いた場合，Ctrl+Dで再起動すれば実行できます。その他の場合は上記の通り`import`や`execfile`で実行します。

- UIFlowを併用すれば，スクリプトのプロトタイプに最適です。UIで画面やら大枠をササッと作って，スクリプトをThonnyにコピペして，細かいところをタイプして実行です。この場合は**UIFlowとM5StickC PLUSを接続せずに使います。** UIFlowはリファレンスマニュアルとしても最適です。

# ほか参考 URL
- Arduinoは使ったことがないので...

https://docs.m5stack.com/en/core/m5stickc_plus
https://note.com/singtaro/n/n45bed25b37c5