ESP32向けのmruby開発環境を構築する(Linux編)

# 概要

LinuxにESP32向けmruby開発環境を構築します。

[MacにESP32向けのmruby開発環境を構築する - Qiita](https://qiita.com/katsuyoshi/items/dc0aed3aeb35d8a0ebcb)
を書く前に、Mac向けに書かれている記事が見つけられなくて実はLinuxで試していました。

途中でビルドできなくてMacで試したのですが、結局同じ原因で引っかかっていて解決しました。
折角なのでLinux版も公開します。
(流れは同じですが、コマンドなど多少違います)

## 前提条件

ParallelsでLinuxの仮想マシンを作成してその上に構築してます。

使用したLinuxディストリビューションとバージョンです。

```
$ cat /etc/lsb-release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.2
DISTRIB_CODENAME=tina
DISTRIB_DESCRIPTION="Linux Mint 19.2 Tina"
```

ターゲットデバイスは [M5Stack](https://www.switch-science.com/catalog/3647/) です。

# 手順

## Linux mint 仮想マシン作成

Linuxは普段使っていないので、下のサイトを参考に今までインストールしたことがなかったLinux mintにしてみました。

[【目的別】初心者におすすめのLinuxディストリビューション7選](https://eng-entrance.com/linux_beginner_distribution)

Parallelsインストールアシスタントに従ってディストリビューションを選択するだけでほぼ自動的に作ってくれます。

知らなかったんですがParalles Liteという無料版もあり、こちらでもLinuxの仮想環境を作ることができる様です。

![Image from Gyazo](https://i.gyazo.com/f4338dc8da3f75674f7f72d92df7bff3.png)

## ESP-IDF開発環境構築

Macの時と同じ様にESP-IDFというクロス開発環境を使います。

公式ドキュメントに従って進めていくのですが、あらかじめ各種コマンドを用意する必要があります。

[Get Started — ESP-IDF Programming Guide v4.1-dev-1066-g93a8603c5 documentation](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html)


### コマンド類のインストール

必要なコマンドは@GORO_Nekoさんが下の記事で書いてくれているので、それを参考に入れていきます。

[mruby-esp32 を使って ESP-WROOM-32（ESP32）上で、Ruby言語のコードから作ったアプリケーションを動かす - Qiita](https://qiita.com/GORO_Neko/items/12967d5c8f84975db221)

所が、```sudo apt install``` を実行すると ```404 Not Found``` が出てしまいaptを更新しないといけないみたいです。

```
$ sudo apt update
```

下の様に必要なコマンド類をインストールします。
(入ってなかった物とバージョンアップされた物です。)
最近は```apt get```じゃなく```apt install```なんですね。

```
$ sudo apt install git
$ sudo apt install libncurses-dev
$ sudo apt install gperf
$ sudo apt install python-pip
$ sudo apt install python-serial
$ sudo apt install python-dev
$ sudo apt install grep
$ sudo apt install automake
$ sudo apt install texinfo
$ sudo apt install help2man
$ sudo apt install libtool
$ sudo apt install libtool-bin
$ sudo apt install cmake
$ sudo apt install ruby
```


### ESP-IDFのソースコード 一式Clone

ここから下はMac版と大体同じです。
ドキュメントに従ってespディレクトリ内にgithubからCloneします。

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

### ESP-IDFのセットアップ

```
$ cd ~/esp/esp-idf
$ ./install.sh
```

```~/.bashrc``` に以下の行を追加します。

```
. $HOME/esp/esp-idf/export.sh
```

ターミナルを立ち上げ直すか、```source ~/.profile```を実行して反映させます。


### hello worldサンプルプロジェクトのコピー

esp-idfで用意されているhello worldのサンプルをコピーします。

```
$ cd ~/esp
$ cp -r $IDF_PATH/examples/get-started/hello_world .
```

### Configuration

ビルドに先立ってmenuconfigを起動します。

```
$ cd ~/esp/hello_world
$ idf.py menuconfig
```

正常に起動すると下の様な画面がでます。
この画面がでればここまでの作業が問題なくできています。

![Image from Gyazo](https://i.gyazo.com/3f103b64419f8f92094202d301e90d9f.png)

この画面で色々条件を設定するみたいですが、ここではESCキーで一旦終了します。
終了時のダイアログで念のためYを押して保存します。


### ビルド

下のコマンドでhello world プロジェクトがビルドされます。

```
$ idf.py build
```

### 実機へアップロード

[M5Stack](https://www.switch-science.com/catalog/3647/) をUSBケーブルで接続します。
接続したポートを確認します。通常は```/dev/ttyUSB0```の様です。

```
$ ls /dev/ttyU*
/dev/ttyUSB0
```

プログラムをアップロードするには下のコマンドを実行します。

```
$ idf.py -p /dev/ttyUSB0 flash
```

が、Permission deniedでErrorになってしまいました。

```
serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'
```

```/dev/ttyUSB0``` のownerがroot:dialoutになっていてアクセス権がないようなので、dialoutグループにログインしているユーザー(parallels)を追加します。

```
$ sudo usermod -aG dialout parallels
```

ここで再起動します。(多分ログインし直すだけでいいと思います。)


```/dev/ttyUSB0``` のownerを変更する方法でもできましたが、デバイスを抜き差しするとownerがroot:dialoutに再設定されてしまうので、毎回chownする必要がでてしまうので、グループに入れる方が良いです。

改めてアップロードしてみます。

```
$ idf.py -p /dev/ttyUSB0 flash
```

今度はうまくいきました。

### プログラムの動作確認

monitorでプログラムの出力を確認できます。

```
idf.py -p /dev/ttyUSB0 monitor
```

Hello world!とチップの情報が出力されているのが確認できます。

```
Hello world!
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 2MB external flash
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
```

これでESP-IDFでプロジェクトビルトから実行まで確認できました。


## mruby構築

### ソースコードをClone

[GitHub の mruby-esp32](https://github.com/mruby-esp32/mruby-esp32) のドキュメントに従ってソースコードをCloneします

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

### ビルド

ドキュメントにあるようにmakeでビルドします。
MRUBY_EXAMPLE=simplest_mrb.rb はいくつかあるサンプルから使用するmrubyファイルを指定する様です。

Mac版と同様に-WオプションのチェックでエラーがでるのでCFLAGSにチェックを無効にする設定をしてからmakeします。

```
$ export CFLAGS="-Wno-error=format-overflow="
$ make MRUBY_EXAMPLE=simplest_mrb.rb
```

### 通信ポートの設定

```menuconfig``` で通信に使用するポートを設定しますが、デフォルトが ```/dev/ttyUSB0``` になっているので通常は設定しなくてもいいと思います。

もし通信ポートが ```/dev/ttyUSB0``` でなかった場合に下の手順で設定します。

```
$ make menuconfig
```

```menuconfig``` が起動したら次の様に設定します。

1. __Serial flasher config --->__ を選択
2. __(/dev/ttyUSB0) Default serail port)__ を選択
3. 使用するポートを入力します。
4. __ESC__ を2回押し、ダイアログで __Y__ を押して保存します。

### プログラムの書き込みと動作確認

[simplest_mrb.rb](https://github.com/mruby-esp32/mruby-esp32/blob/master/main/examples/simplest_mrb.rb)ファイルを確認してみると、下の様に1234と4321の2行出力する様になっています。

```
puts "1234"
puts "4321"
```

プログラムの書き込みと動作確認するにはflashとmonitorタスクを実行します。

```
$ make MRUBY_EXAMPLE=simplest_mrb.rb flash monitor
```

出力を確認すると正常に動作している様です。

```
I (542) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (370) mruby_task: Loading binary...
1234
4321
I (390) mruby_task: Success
```

という事でMac版同様に無事mrubyプログラムが実行されました。


# 関連

Mac版です。

- [MacにESP32向けのmruby開発環境を構築する - Qiita](https://qiita.com/katsuyoshi/items/dc0aed3aeb35d8a0ebcb)


# 参照

以下のサイトを参考にさせていただきました。(ほぼまとめサイトの様になっておりますが…)
ありがとうございました。


- [mruby-esp32 を使って ESP-WROOM-32（ESP32）上で、Ruby言語のコードから作ったアプリケーションを動かす - Qiita](https://qiita.com/GORO_Neko/items/12967d5c8f84975db221)
- [GitHub - mruby-esp32/mruby-esp32: mruby application template for ESP32](https://github.com/mruby-esp32/mruby-esp32)