mruby-esp32 を使って ESP-WROOM-32（ESP32）上で、Ruby言語のコードから作ったアプリケーションを動かす

# はじめに

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

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

ボク、仕事では「未だ」一切 mruby 扱っておりません（コンダケ弄ってイテ、未ダ、ナオモ … ）。

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

# ESP-WROOM-32 上でも動く mruby

[ESP-WROOM-32](https://www.espressif.com/sites/default/files/documentation/esp-wroom-32_datasheet_en.pdf)(以後: ESP32 と記述)は、Espressif 社製の、Arduino 互換マイコンボードです。

![DSC_0081.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/3d27af6e-6f99-7103-6efd-2a61ab2dfa8b.jpeg)

(上記の写真は ESP-32 を手軽に使えるように開発ボード化した [ESP32-DevKitC](http://akizukidenshi.com/catalog/g/gM-11819/) )

WiFi や Bluetooth が実装されていたり、結構メモリも搭載（SRAM: 520 KB、フラッシュ: 4 MB）されていながら、日本でのお値段今日時点でだいたい ￥1,500、開発キット化されていない [ESP32](https://www.switch-science.com/catalog/3156/) なら ￥700 程度で入手可能 （「うぁ、安っす！」）と言う、恵まれた資金源を持ち合わせない電子工作好きには嬉しい 1 枚です。

Arduino 互換とうたわれているだけのことはあって、Arduino IDE ベースの開発環境でプログラム開発を行うことが可能です（と、言いつつ、今回の記事では、これを一切使わないわけですが … ）。

また別に、Espressif 社が提供する [ESP-IDF](Espressif IoT Development Framework) という開発環境を使って、プログラミングを行うことも出来ます。

mruby が動作するために要求するメモリ量は「 RAM: 200KB 程度」ですので、これでも mruby 動かせるんじゃないかなあと、ここしばらく考えておりました。

で、ネットを見渡してみると…

やっぱり同じような考えを持たれた方がいらっしゃいました。

[mruby-esp32](https://github.com/mruby-esp32/mruby-esp32) なるプロジェクトが、GitHub で公開済みでした。

と言うわけで、mruby-esp32 を ESP32 に導入して、Ruby 言語で記述したコードから作ったアプリケーションが動作することを実証します。

# やったこと

ESP32 上で、Ruby 言語で記述したアプリケーションを動作させるために、今回は以下のそれぞれを実施しました。
ちなみに、mruby-esp32 や mruby アプリケーションの作成に利用したのは、OS として Ubuntu 16.04(64 Bit 版 )をインストールした ノート PC です。 

---

1. 環境構築補助ツールの導入
2. ツールチェインの導入
3. ESP32 開発環境（ESP-IDF）の導入
4. mruby-esp32 の導入
5. サンプルアプリケーションの作成と実行

---

## 環境構築補助ツールの導入 

mruby-esp32 や mruby アプリケーションの作成に使う、ツール類を導入します。

必要となるものは以下のそれぞれです。

       
1. git
2. wget
3. make
4. libncurses-dev
5. flex
6. bison
7. gperf
8. python(pip)
9. python-serial
10. python-dev
11. gawk
12. grep
13. gettext
14. automake
15. texinfo
16. help2man
17. libtool
18. libtool-bin

自分の環境に未導入なものを、片端から OS 付属のインストールコマンド（ ex. "sudo apt-get install [インスールしたいもの]" ) で導入してください。

## ツールチェインの導入

[公式サイト](dl.espressif.com)が提供しているコンパイル済みツールチェインはバージョンが古く、いろいろ問題が出るため、[GitHub で公開されている開発リソース](https://github.com/espressif/crosstool-NG)をごっそり取得しビルドします。

ちなみに、ここでは "[ ホームディレクトリ ]/esp" に、ツールチェインを導入することにします。

まず、crosstool-NG を clone して、ビルドします。

    $ mkdir ~/esp
    $ cd ~/esp
    $ git clone -b xtensa-1.22.x https://github.com/espressif/crosstool-NG.git
    $ cd crosstool-NG
    $ ./bootstrap && ./configure --enable-local && make install
 
続いて、Toolchain のビルドを行います。

    $ ./ct-ng xtensa-esp32-elf
    $ ./ct-ng build
    $ chmod -R u+w builds/xtensa-esp32-elf

ビルド終了後、ツールチェインの実行バイナリの配置先を、環境変数 PATH に追記します。

    $ echo 'export PATH=$PATH:$HOME/esp/crosstool-NG/builds/xtensa-esp32-elf/bin' >> ~/.profile
    $ source ~/.profile

## ESP32 開発環境（ESP-IDF）の導入

GitHub から ESP-IDF のプロジェクトをクローンして、ESP32 開発環境（ESP-IDF）を導入します。

    $ cd ~/esp
    $ git clone --recursive https://github.com/espressif/esp-idf.git

導入終了後、esp-idf の導入先を、環境変数 IDF_PATH に記述します。

    $ echo 'export IDF_PATH=$HOME/esp/esp-idf' >> ~/.profile
    $ source ~/.profile

## mruby-esp32 の導入

GitHub から mruby-esp32 のプロジェクトをクローンして、"ホームディレクトリ/mruby-esp32" に導入します。

    $ cd ~/
    $ git clone --recursive https://github.com/carsonmcdonald/mruby-esp32.git


## サンプルアプリケーションの作成と実行

"ホームディレクトリ/mruby-esp32" に導入した mruby-esp32 プロジェクトは、以下の総てを含む、サンプルアプリケーション（シリアルモニタに SDK のバージョンや空きメモリの情報を出力するアプリケーション）のソースコードと make するための資源一式です。

---

【含まれるコード類】
* アプリケーションのエントリーポイントとなる C 言語で書かれたコード
* mruby vm 構成コード
* Ruby で書かれたユーザプログラムのコード 

---

早速ビルドして、サンプルアプリケーションの実行バイナリを作成 → ESP32 に転送して実行してみます。

最初に ESP32 を USB ケーブルでコンピュータに接続し、コンピュータ上でなんというシリアルポートとして認識されたかを確認します。

具体的には "ls" コマンド等で ESP32 接続後に現れた、"/dev/tty???"（???の部分は環境により変化、ただし "/dev/ttyACM0" または "/dev/ttyUSB0"として認識されることが多いはず）が何かを確認します。

シリアルポートの確認が終わったら、環境設定をします。
以下のコマンドを実行し、立ち上がったメニューから "Serial flasher config" → "Default serial port" と進み、上記で確認したシリアルポートを入力し Save & Exit します。

    $ cd ~/mruby-esp32
    $ make menuconfig

シリアルポートの設定が終わったら、以下の make コマンドでプロジェクト全体をビルドし、ESP32 側へビルドした実行バイナリを転送します。

    $ make MRUBY_EXAMPLE=system_mrb.rb
    $ make MRUBY_EXAMPLE=system_mrb.rb flash monitor

ビルドが成功した場合、シリアルモニタに SDK のバージョンや空きメモリの情報が出力されます。

![20180308.jpg](https://qiita-image-store.s3.amazonaws.com/0/89832/724195fc-c208-24b2-ab06-965bfe8a3c0f.jpeg)

と、言うわけで、ESP32 の上でも、Ruby言語で記述したコードから作ったアプリケーションが動きました。

… アプリケーションのエントリーポイントは C 言語で記述する必要があったり(と言っても、mruby-esp32 に入っているものを、無修正で使うだけで良いので、アプリを書くたびに、特に C 言語でエントリポイントのロジックを書く必要はありませんが)、まるっと Ruby だけでアプリケーションを書けない点が、ちょっともやっとしますが、とにかくRuby言語でコードを書いて、実装したい機能を作り込めることは確かです。

次に書く予定の記事では、mruby-esp32 に含まれるソースのうち Ruby で書かれたコードを変更するだけで、ESP32 の上で動作する任意のアプリケーションが作成できることを実証しようと思います（ 2018/3/11 [実証記事](https://qiita.com/GORO_Neko/items/4156331cbd7f5cdaf4ac)書きました）。

では、また。