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


概要

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

MacにESP32向けのmruby開発環境を構築する - Qiita
を書く前に、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 です。

手順

Linux mint 仮想マシン作成

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

【目的別】初心者におすすめのLinuxディストリビューション7選

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

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

ESP-IDF開発環境構築

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

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

Get Started — ESP-IDF Programming Guide v4.1-dev-1066-g93a8603c5 documentation

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

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

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

所が、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

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

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

ビルド

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

$ idf.py build

実機へアップロード

M5Stack を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 のドキュメントに従ってソースコードを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ファイルを確認してみると、下の様に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版です。

参照

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