コンテナ（Ubuntu）に ESP-32 用の mruby 開発環境を構築してみる

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

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

一年近く無活動だったような（汗）。

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

ボク、仕事では一切組み込み系のお仕事をしておりません。

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

# ESP-32 で 最新の mruby（mruby 3.2) を動かしたい！

今回の記事を書くにあたって手元の mruby と ESP-IDF のバージョン見たんですよ。そうしたら目を覆いたくなるような現実が…

毎度お世話になってる[mruby on the ESP32](https://github.com/mruby-esp32/mruby-esp32/blob/master/README.md)のメージを見たところ、ちゃんと最新の [mruby（mruby 3.2)](https://mruby.org/releases/2023/02/24/mruby-3.2.0-released.html) に対応している模様。うぅん、サボりすぎたか自分よ。

そこで、最新の [mruby（mruby 3.2)](https://mruby.org/releases/2023/02/24/mruby-3.2.0-released.html)  を比較的新しい [ESP-IFD(ESP-IDF 5.1)](https://docs.espressif.com/projects/esp-idf/en/release-v5.1)と組み合わせて、まだ新しいと言えそうなマイコンボードの [ESP32-DevKitC-32E](https://akizukidenshi.com/catalog/g/gM-15673/)用の開発環境（用意したRubyソースから、マイコンボードで動くオブジェクトをコンパイルできる環境）を整備することにしました。
 
# ESP32 向け開発作成環境の作り方

基本、[先に紹介したサイト](https://github.com/mruby-esp32/mruby-esp32/blob/master/README.md)に従って構築していきます。

今までに作った、他のマイコンボードやら OS やら用の環境に悪ささせないため、例年（？）通りコンテナの中に作っていきます。

# M5Stack-mruby の作成手順

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

※　コマンドプロンプトが "$" の記述はホスト側での操作、"#" の記述はコンテナ内での操作として読んでください（くどくなりますが、開発環境自体はコンテナの中に構築します）。

## ESP-32 の用意

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

※ コンテナ起動後に接続するとコンテナは ESP-32 を認識しません…と言うとちょっと嘘があって、ESP-32利用前に一旦コンテナを再起動するば良くもあります（超乱雑説明）。

## コンテナの作成

```console
$ docker pull ubuntu:22.04
$ docker run -it -d --name mruby-esp ubuntu:22.04
```

コンテナの用意ができたら以下等でコンテナに入ります

```console
$ docker exec -it mruby-esp bash
```

ここからはコンテナの中での作業となります

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

## コンテナの最新化

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

## 開発ツール等の導入

```console
# apt -y install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
# apt -y install vim curl
```

## build 時に必要となるツールの導入

```console
# apt -y install cmake build-essential gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib rake
```

## ESP-IDF の導入

```console
# cd ~
# mkdir -p /root/esp
# cd /root/esp
# git clone -b release/v5.1 --recursive https://github.com/espressif/esp-idf.git
# cd /root/esp/esp-idf
# ./install.sh esp32
# . /root/esp/esp-idf/export.sh
```

※ "git clone -b release/v5.1" の所で、ダウンロード対象が大きいせいか、よくエラーが出ることになるので要注意
※ （運が良ければ）コマンドを再実行しているうちに、そのうちダウンロードできます

※ コンテナを再起動した場合は ". /root/esp/esp-idf/export.sh" を再実行しましょう（必要な環境変数の設定等をしてくれるので

## cruby の導入

```console
# cd ~
# apt install libssl-dev zlib1g-dev libyaml-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.2.2
# rbenv global 3.2.2
```

## "mruby on the ESP32" の導入

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

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

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

はい、これで"mruby on the ESP32"の導入は終了です。

あとは"mruby on the ESP32"を導入した結果出来たディレクトリ"/root/mruby-esp32/main/examples"内のRbuyスクリプトか、ここにおいた自前のRbuyスクリプトを、以下のようなコマンドでコンパイルおよびマイコンボードへの転送を行えば、マイコンボード上でRubyスクリプトから作った実行体を動作させられます。

```console
idf.py build
idf.py -p $(YOUR_SERIAL_PORT) flash monitor
```

※ YOUR_SERIAL_PORT：マイコンボードの接続シリアルポートを記述（OS が Ubuntu なら通常 "/dev/ttyUSB0"）

コンパイルだ転送だ、実はこんな不具合が等についてはまた別の記事で…

では、また。