【M5Stack CoreMP135】開発環境構築する

M5Stack CoreMP135を買ったので味見した話
記事のゴール
* だいたい公式と同じ開発環境セットアップし、サンプルプログラムをビルドする。
 トラブルがあったため暫定対応で動作することを確認した。

# 初めに
公式の開発環境構築方法などは以下のリンク先に乗っています。

* [公式ページ](https://docs.m5stack.com/en/core/M5CoreMP135 "https://docs.m5stack.com/en/core/M5CoreMP135")
* [公式ページ(develop)](https://docs.m5stack.com/ja/guide/linux/coremp135/develop "https://docs.m5stack.com/ja/guide/linux/coremp135/develop")
* [スイッチサイエンス販売ページ](https://www.switch-science.com/products/9650 "https://www.switch-science.com/products/9650")

この通りに完了できればこの記事は不要です。

:::note warn 
(2024.09.16 追記)
筆者環境ではwindows11以下ではいまだにすんなり行きませんが、Ubuntu上ではスムーズに進みます。VMware上にUbuntuを用意し、[公式ページ(develop)](https://docs.m5stack.com/ja/guide/linux/coremp135/develop "https://docs.m5stack.com/ja/guide/linux/coremp135/develop")に沿ってUbuntu環境で進めることをお勧めします。
:::

# 検証環境
* PC
　windows11
　有線LANに接続できるポートが必要
　gitがインストールされていること
* 電源 USB type-C 5V3A
* LANケーブル

この記事ではwindows11以下で確認していますが、公式ドキュメントを見るとlinuxでも行けそうです。

# 電源を入れるまで
### OSのセットアップ
[Description](https://docs.m5stack.com/en/core/M5CoreMP135 "https://docs.m5stack.com/en/core/M5CoreMP135")に以下のコメントがあります。
```
The host comes with a MicroSD card preloaded with Debian system, ready to use upon booting. 
```
Debian入ったSDが付属している！素晴らしい！ 
記事作成時点では、発売されたばかりなのでOSを更新する必要はないでしょう(多分)
将来書き換えたい状況になったり、別の環境をいれたSDカードを作る場合のやり方は
[CoreMP135 image burning](https://docs.m5stack.com/ja/guide/linux/coremp135/image "https://docs.m5stack.com/ja/guide/linux/coremp135/image")
に記載されています。

### 電源投入
では電源をいれるだけなので早速通電します。
電源はいくつかの方法で入れることができます。
* DCIN 12V/2A
* RS485 9~24V (記載はないですが電流値2A以上は用意しておきたいところ)
* USB Type-C 5V/3A

ほかにもバッテリーソケットがあったりします。
やってないですが、
[M5Stack用電池モジュール](https://www.switch-science.com/products/3653 "https://www.switch-science.com/products/3653")
をそのまま重ねたり、バッテリーだけ外してこっちに流用できそうですね。
そのうち試します。
(回路図見るとほかにも行けそうな経路がありますが、自己責任で...)

今回の記事では、業務PCに使うためのUSB type-Cが卓上に出てたのでこれを使いました。

### 起動
電源を指すと勝手に起動します。

![無題の動画 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782161/939dd90e-4fde-aa3a-bdff-d442d6924a49.gif)
(画面が暗くてすみません)

電源を切るときは、電源ボタンを長押しするとオフになります。
電源を指しっぱなしにしているときは、電源ボタンを押すと再び起動します。



# リモートログインしてみる

### ネットワーク環境の設定
SDカードのOSが初期状態のままであれば、IPアドレスはDHCPで設定できます。
パソコンをDHCPサーバ機能を持つルータに接続し、同じルータにCoreMP135を接続するといいでしょう。
筆者は手元にルータがなかったので、PC上でDHCPサーバを動作させたうえで、LANアダプタとCoreMP135を直結して作業しています。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782161/03954ddf-962d-34ff-4d31-ce7359194c89.png)

このとき、DHCPサーバからどんなIPアドレスが割り振られているかは
起動後に表示されるデモのETHERNET TESTから確認することができます。

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782161/91403abf-fe0a-045c-f7e2-281bae5244c1.jpeg)

ちなみに、DHCPサーバはRockwell Automationの[BootP DHCP EtherNet/IP Tool ](https://compatibility.rockwellautomation.com/Pages/MultiProductFindDownloads.aspx?crumb=112&mode=3&refSoft=1&versions=59657 "https://compatibility.rockwellautomation.com/Pages/MultiProductFindDownloads.aspx?crumb=112&mode=3&refSoft=1&versions=59657")を使用しました。

### SSHでアクセスしてみる
Windowsのコマンドプロンプトで以下のコマンドを実行します。
以下は私の環境の場合す。CoreMP135側のIPアドレスは環境ごとに異なる可能性があるため、@以降のIPアドレスは適切に読み替えてください。
```console:SSHでアクセスしてみる例
ssh root@192.168.2.212
```
デフォルトのユーザ名とパスワードは両方ともrootです。

:::note warn 
警告
インターネットに接続できる構成で利用する場合は、なるべくパスワードやユーザ名を変更しておいたほうが無難です。
:::
<!-- open属性なし -->
<details><summary>(オプション) 取り急ぎパスワードを変更する方法</summary>

SSHでログインした後、以下を実行し、指示に従ってください。

```console:rootのパスワード変更
passwd root
```

変更した後はCoreMP135の再起動を行ってください。以降の操作では新しいパスワードを利用します。
</details>


# ビルド環境のセットアップ
ここではwindows環境について説明します。
Linuxについては[公式ページ(develop)](https://docs.m5stack.com/ja/guide/linux/coremp135/develop "https://docs.m5stack.com/ja/guide/linux/coremp135/develop")をご確認ください。
windowsもそのページみたらいいじゃん。というコメントはその通りです。

### Python 3をインストールする
ここは公式ドキュメントに準拠しますが、仮想環境等で作成しても変わらないはずです。
[Python.org](https://www.python.org/ "https://www.python.org/")から最新のPython 3(DownlordにあるLatestのところから飛ぶ)をインストールします。
筆記時点では[Python 3.12.3](https://www.python.org/downloads/release/python-3123/ "Python 3.12.3")でした。
画面下部のWindows installer (64-bit)を使ってインストールしてください。

:::note warn 
インストール時の注意事項
インストール時には` Add python.exe to PATH `にチェックを入れてください。
![スクリーンショット 2024-05-01 202129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782161/4b6982de-ed1e-07af-4a30-0fc7d525b616.png)
なお、`Use admin privileges when installing py.exe` はどちらでも可です。
:::

### ビルドツール周りをセットアップする
コマンドプロンプトと記載していますが、PowerShellでも可能です。適宜読み替えてください。

はじめに以下をWindowsのコマンドプロンプトで実行します。
```console:pipでインストールする
pip install parse windows-curses scons pexpect paramiko scp
```
<!-- open属性なし -->
<details><summary>筆者の環境の場合</summary>

個人の自由ですが、私の場合は上のコマンドの代わりに以下でインストールしました。
理由がなければ上のコマンドをそのまま実行してください。
```console:pipでインストールする
py -m pip install parse windows-curses scons pexpect paramiko scp
```
</details>

### ライブラリをクローンする
次に適当な作業フォルダを作成します。
経験上、フォルダ名に日本語は含めないこと、階層は深くしないことがおすすめです。
`C:\project\M5`くらいがいいと思います。

コマンドプロンプト上で作成した作業フォルダに移動して以下を実行。
```console:m5stackからライブラリをクローンする
git clone https://github.com/m5stack/M5Stack_Linux_Libs
```
問題なければ`M5Stack_Linux_Libs`ができているはずです。

### クロスコンパイル用のツールチェーンを取得する
[公式ページ(開発環境構築)](https://docs.m5stack.com/ja/guide/linux/coremp135/develop "https://docs.m5stack.com/ja/guide/linux/coremp135/develop")にある
`gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf`
をダウンロードし、作業フォルダの中で展開します。

# サンプルプロジェクトのビルド
:::note warn
注意
この章については公式の手順で進められなかったので適当にやっています。
そのうち正しい方法でできるように整理されると思います。
:::
<!-- open属性なし -->
<details><summary>起きたトラブル(読まなくても良い)</summary>
公式手順のとおり

```console:
scons menuconfig
```

を実行すると、

```console:実行結果
scons: Reading SConscript files ...
Loaded configuration '<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world\build\config\global_config.mk'
```

など表示された後、設定画面に移動せずに処理が終了してしまう。
そのためツールチェーンまでの絶対パスを設定することができない状態になってしまった。
</details>

### ツールチェーンまでのパスを設定する
まず、
`<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world`
まで移動し、以下のコマンドを実行します。
```console:ビルドを一回実行する
scons -j4
```
すると、**ビルドしようとして失敗します**が、
`<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world\build\config\global_config.mk`
が生成されているはずです。

方法は何でもいいので
`<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world\build\config\global_config.mk`
を開き、
`CONFIG_TOOLCHAIN_PATH`を
`\gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf\bin`
までの絶対パスに置き換えます。
以下は例になります。
(解凍の仕方やフォルダ構成によって、パスの内容は変わるので注意してください。)
```makefile:config/global_config.mk 内のCONFIG_TOOLCHAIN_PATHを書き換える
CONFIG_TOOLCHAIN_PATH="<作業フォルダ>\gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf\gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf\bin"
```
ほかの行はそのままで良いです。

### ビルドする
コマンドプロンプトで
`<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world`に移動した後、以下を実行します。
```console:ビルド実行
scons -j4
```
errorがなければビルド完了です。

# CoreMP135上にプログラムを転送して動かす
ビルドした結果をCoreMP135上に移します。
方法はなんでも良いのですが、ここでは公式ドキュメントに従いSConsを使ってビルドした結果をCoreMP135に送ります。
### 送信設定
`<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world`
の中に、`setup.ini`を作ります。

(`<作業フォルダ>\M5Stack_Linux_Libs\examples\hello_world`
の中にある`setup.ini`をコピーして持ってきても良いです。)

ファイルの中身は以下になります。
IPアドレスを実態に合わせるのはもちろんのこと、
sshに使うやユーザ名やパスワードを変更している場合は適切な内容に変更しておきましょう。
```ini:setup.iniの中身
[ssh]
local_file_path = dist
remote_file_path = /root
remote_host = 192.168.2.212
remote_port = 22
username = root
password = root
```

### CoreMP135に送信する
次に、SConsを使ってプログラムをCoreMP135に送信します。
前述のリモートログインできる環境が構成されており、実際にSSHで接続可能な状態であることを確認してください。

コマンドプロンプトで
`<作業フォルダ>\M5Stack_Linux_Libs\examples\lcd_hello_world`にいる状態で、以下を実行します。
```console:プッシュ実行
scons push
```
success!と表示されたら成功です。

### 権限を付与して実行する
コマンドプロンプトからCoreMP135にsshでログインします。
ログインしたら、`setup.ini`remote_file_pathとして設定しているパスに移動します。
```console:権限を付与して実行する
chmod +x lcd_hello_world
./lcd_hello_world
```

うまくいっていればサンプルプログラムが起動します。

なお、画面上部には起動時のデモプログラムの時計表示等が出てきます。
公式のドキュメントを参考に以下の手続きでデモプログラムを停止させることができます。

CoreMP135にsshでログインしている状態で、次のコマンドでプロセスを確認します。
```console:start_uiのプロセスを探す
ps | grep "start_ui"
```
**/usr/local/m5stack/dist/core135_start_ui**に対応した番号を探します。
次に、
```console:start_uiを止める
kill <調べた番号>
```
で停止します。


# まとめ
* サンプルプログラムをビルドして動かすことができた
* scons menuconfig　周りがうまくいかなかったので力技になってしまっている

# 最後に
 [公式ページ(develop)](https://docs.m5stack.com/ja/guide/linux/coremp135/develop "https://docs.m5stack.com/ja/guide/linux/coremp135/develop")には紹介していない便利機能(debugportとか)が乗っています。絶対に目を通すようにしましょう。