M5Stack で mruby を動かしてみた

この記事は、[FUJITSU Advent Calender 2021](https://qiita.com/advent-calendar/2021/fujitsu)の 9 日目の記事です。

@GORO_Neko です。本当にお久しぶりな毎度毎度の御挨拶をば、ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

いつも通りではりますが、まずお断りをば一言。

ボク、仕事では「未だ」（ハイそぉです、今に至っても「未だ」っ！（>_<））一切組み込み系のお仕事をしておりません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# M5Stack で mruby を動かしたい！

二年弱ほど前の話なんですが、[mrubyワークショップ](https://mrubyworkshop.connpass.com/event/163293/)という勉強会に参加しました。

そこで、教材として貸し出されたのが mruby 実行環境が導入済みの [M5Stack](https://m5stack.com/)。

「うぁっ！　M5Stack で mruby が動いているよ！」と随分感動したものでした。

その勉強会では、M5Stack 用の mruby 実行環境の作り方は学習テーマにされていなかったため、その場では M5Stack 用の mruby 実行環境の作り方は学べませんでした。

それからつい最近まで、何とか個人持ちしている M5Stack に mruby 実行環境を入れたいとあれこれ調べておりました。

で、最近[こちらのサイト](https://github.com/mimaki/M5Stack-mruby)が公開してくださっているあれこれで、M5Stack 用の mruby 実行環境（以降、"M5Stack-mruby" と呼称）が作れる目星が付きました（あはは、サイトのオーナーと先に紹介した勉強会の講師の方が同じ人でした(^^; )。

# M5Stack-mruby 作成環境の作り方

基本、[先に紹介したサイトの説明](https://github.com/mimaki/M5Stack-mruby/blob/master/README_ja.md)通りなんですが、OS 等、利用している環境によっては「ハマりどころ」が存在します。

## ハマりどころ 1: esp-idf のバージョン

まず、前提として環境に以下を導入せよとサイトに説明があります。

- Ruby
- GNU Bison
- Git
- esp-idf

上 3 つは今時普通に入手可能なバージョンのものをそのまま利用可能です。

問題は 「esp-idf」。

これ、何も考えずに最新（現時点だとv4.4 ？）を導入すると、M5Stack-mruby がビルドできません。

何故か？

[サイトの構成](https://github.com/mimaki/M5Stack-mruby/tree/master/components)を見てみるとわかるのですが、構成品として得られる「Arduino core for the ESP32」も「M5Stack Library」も、更に「mruby_component」サブディレクトリ下に用意されている「mruby」も現時点から 4 〜 5 年前のものが用意されています。

「esp-idf」と「Arduino core for the ESP32」の間等には、利用できるバージョンの関係性があり、これが成り立たない 2 者を組み合わせると、まともに動きません。

上記の構成をよくよく眺めた結果、「esp-idf」は [v3.0](https://docs.espressif.com/projects/esp-idf/en/release-v3.0/index.html)を利用する必要があると推測しました。

## ハマりどころ 2: Python のバージョン

esp-idf v3.0 は、動作にあたって Python2 が利用できることを前提にしています。

また、Python2 用の python-serial の導入を要求します。

「esp-idf」導入作業の一環として「Python2」「Python2 用の pip」「python-serial」の導入も必要となります。

自分のように常用 OS が Ubuntu の場合、何の細工もせずに上記を満たせるバージョンは Ubuntu 18.04 だったりします。

## 今回作った環境構成

と、まぁ... 常用 OS の環境を色々細工するか、作成用にバージョン指定の OS 環境でも作ってやらないと、M5Stack-mruby 作成環境はできそうにありません（自分はできないと判断しました）。

とはいえ、M5Stack-mruby 作成のためだけに物理マシンを 1 台用立てられるほどリッチな人間でもないので、以下の OS を適用した Docker コンテナを作成し、その中にこれまた以下の構成のソフトウェアを導入し、M5Stack-mruby 作成環境を作成しました。

| OS ／ソフトウェア | バージョン |
| :--- | :--- |
| OS | Ubuntu 18.04 |
| Ruby | ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux] | 
| GNU Bison | bison (GNU Bison) 3.7.5 | 
| Git | git version 2.30.2 | 
| esp-idf | v3.0 | 
| Python | Python 2.7.18 | 
| pip | pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7) |

# M5Stack-mruby の作成手順

以下、コマンドレベルでの作成手順を列記します。

※　コマンドプロンプトが "$" の記述はホスト側での操作、"#" の記述はコンテナ内での操作として読んでください。

## M5Stack の用意

あらかじめ、作業マシンに M5Stack を接続しておきます。

※ コンテナ起動後に接続するとコンテナは M5Stack を認識しません。

## コンテナの作成

```console
$ docker pull ubuntu:18.04
$ docker run -it -d --name ubuntu1804 ubuntu:18.04
```

## 作業ユーザ（root）化、および作業ディレクトリ（/root）への移動
```console
# su -
# cd ~
```

## コンテナの最新化

```console
# apt update
# apt upgrade
```

## 開発ツール等の導入

```console
# apt install build-essential
# apt install vim
# apt install curl
# apt install wget
```

## "M5Stack-mruby" のサイトで導入を求められているソフトウエアの導入（ Ruby,esp-idf 以外）

```console
# apt install bison
# apt install git
# apt install python
# apt install python-pip
```

## "M5Stack-mruby" のサイトで導入を求められているソフトウエアの導入（ Ruby ）

```console
# cd ~
# apt install libssl-dev zlib1g-dev
# apt purge ruby rbenv ruby-build
# rm -rf ~/.rbenv
# git clone https://github.com/rbenv/rbenv.git ~/.rbenv
# git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

※　.bashrc の最後尾に以下を追記

```file
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - bash)"
```

```console
# source ~/.bashrc
# CONFIGURE_OPTS='--disable-install-rdoc' rbenv install 3.0.3
# rbenv global 3.0.3
```

## "M5Stack-mruby" のサイトで導入を求められているソフトウエアの導入（ esp-idf ）

```console
# cd ~
# mkdir esp
# cd esp
# git clone https://github.com/espressif/esp-idf.git -b v3.0
# apt install git wget make libncurses-dev flex bison gperf python python-serial
# wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
# tar -xzf xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
```

※ ~/bashrc 末尾の PATH 環境変数に "$HOME/esp/xtensa-esp32-elf/bin" を追加

※ ~/bashrc 末尾に export IDF_PATH="$HOME/esp/esp-idf" を追記

```console
# source ~/.bashrc
```

## esp-idf が要求する Python モジュールの導入

```console
# cd /root/esp/esp-idf/docs
# pip install -r requirements.txt
```

## USB 機器へのアクセス許可設定の実施

```console
# usermod -a -G dialout $USER
```

## M5Stack-mruby の導入

```console
# cd ~/esp
# git clone --recursive https://github.com/mimaki/M5Stack-mruby.git
```

## Rakefile の修正

/root/esp/M5Stack-mruby/components/mruby_component/mruby/Rakefile を修正する

【修正内容】

```file
37 行 〜 39 行の記述のうち最後の引数 "opts" をそれぞれ削除する
```

## 導入先 M5Stack 接続デバイスの確定

```console
# cd M5Stack-mruby
# make menuconfig
```

※ "Serial flasher config"を押下し"Default serial port"の値に"/dev/ttyUSB0"を指定

## M5Stack-mruby のビルドおよび M5Stack への導入

```console
# make flash
```

# うまく行った場合の M5Stack

最後に M5Stack-mruby が M5Stack にうまく導入できた場合の動作状況例の画像を貼っておきます。

![M5Stack_mruby.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89832/60305456-d86a-a6ee-2d43-b329366893e3.png)


では、また。