はじめに
本記事は、USBメモリにUbuntuを入れて、そこでESP32向けの軽量Ruby環境を構築した際の記録です。
特徴
今回構築した環境の特徴は以下の通りです。
メリット
- USBメモリ上が主戦場となるので、失敗しても軽傷で済む
- PCにrubyやpythonといった必要なものを色々インストールしなくても良い
- Arduinoやwindowsのmsys環境と比較して、体感的にビルド&プログラム書き込みする時間が短い
- rubyの恩恵に授かることができる(配列の操作や数学関数など)
- 並列処理をコーディングしやすく、メモリ消費量が少ない※
※今回用いたmruby/cという開発言語の特徴です。(mrubyの実装)
詳しくは、こちらやこちらをご覧いただけると大変参考になります。
デメリット
- Ubuntuのハードディスク容量が限られている(後述するUNetbootinの制約)
サンプルプログラム
この手順では、最終的に以下の図のようにサンプルプログラムを動作させています。
operator1, operator2のスレッド(緑色の四角)から一定時間おきにprinterクラス(青色の四角)のPrintメソッドを実行して標準出力(puts)します。
図:サンプルプログラムの動作
手順
それでは実際に行った手順です。
※トライする方は自己責任でお願いします
使用したもの
- ESPr Developer 32(下記の手順では「ESP32」と表記しています)
- PC (USBメモリとESP32接続のためにUSBポートが2つ必要です)
※OS、スペックは下記の通り
OS:Windows7 Pro 64bit
RAM:8GB
CPU:Intel Core i5-3340M
SSD:500GB - USBケーブル(PCとESP32を接続します)
- USBメモリ
手順1:USBメモリにUbuntuをインストールする
1. Ubuntu 18.04 LTS 日本語 Remix(64bit)をダウンロードする
2. UNetbootinを使用してUSBメモリにUbuntuをインストールする
UNetbootinの入力内容(※使用したUNetbootinのバージョンは6.61です):
3. パソコンを再起動してBIOSメニューでUSBブートを先頭にした後、USBメモリを接続して再起動する
4. Ubuntuの起動後、基本的な環境設定を行う(Wi-Fi、キーボードレイアウト、タイムゾーン設定)
※キーボードレイアウト設定の参考記事
※タイムゾーン設定の参考記事
手順2:mrubyをインストールする
Ubuntuのターミナル上で以下の順でコマンドを実行します
1. gitをインストールする
sudo apt-get update
sudo apt install git
2. pyhon関連を入れる
sudo apt install gcc git wget make libncurses-dev flex bison \
gperf python python-pip python-setuptools python-serial \
python-cryptography python-future python-pyparsing
3. esp32のlinux開発環境をインストールする
mkdir $HOME/esp
cd $HOME/esp
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
rm xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
echo 'export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"' >> $HOME/.profile
echo 'export IDF_PATH="$HOME/esp/esp-idf"' >> $HOME/.profile
source $HOME/.profile
cd $HOME/esp
git clone --recursive https://github.com/espressif/esp-idf.git
4. python製の関連ツールをインストールします。
python -m pip install --user -r $IDF_PATH/requirements.txt
5. 自ユーザをdialoutグループに追加する(USBシリアルポートの権限のため)
sudo usermod -a -G dialout $USER
6. mrubyをインストールする
cd $HOME
git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.profile
echo 'eval "$(rbenv init -)"' >> $HOME/.profile
source .profile
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev
rbenv install 2.6.1
rbenv global 2.6.1
ruby --version
rbenv install mruby-1.4.1
手順3:プロジェクトを作成する
1. サンプルソースファイル一式をクローンする
git clone --recursive https://github.com/bigw00d/mrubyc-esp32-threadsample.git
2. プロジェクトを作成する
cd mrubyc-esp32-threadsample
chmod +x ./newproject.sh
./newproject.sh thread-sample
※「thread-sample」はプロジェクト名です(好きな名前を付けてよい)
プロジェクト作成後のプロジェクトファイル一式は以下の通りです。
手順4:実機にサンプルプログラムを書き込んでモニターする
1. makeする
make
※初回の実行時に設定画面が出てくるが、設定はそのままで良いはずなので、「Exit」を選択してその画面を抜ければよいです
(それ以降でCOMポート等のコンフィグを変更したい場合は「make menuconfig」を実行する)
2. ESP32にプログラムを書き込む
make flash
※エラーになる場合はESP32を抜き差ししてみるとよい
3. プログラムの動作状況をモニターする
make monitor
※終了する際は「Ctrl+]」を入力する
画像:モニターの様子(各スレッドからputsした文字列がterminalに表示される※)
※それぞれのスレッドでputsしている文字列:
operator1:「Hello!」(1秒間隔)
operator2:「Bye!」(2秒間隔)
終わりに
mrubyのインストールの辺りは結構時間がかかりますが、一度環境が出来てしまうとサクッとmake&書き込みができて使いやすく感じました。
ESP32の真骨頂といえばWi-FiやBluetoothなので、その辺りをどうrubyで実現できるかを今後色々試してみようと思います。
見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・。)
参考記事
hitoshi HASUMIさんのgithubページ
https://github.com/hasumikin?tab=repositories
本家mruby/cのgithubページ
https://github.com/mrubyc/mrubyc
おまけ
プログラム実行にまつわる話
サンプルプログラムを含めたプロジェクト内の各ファイルの関係は以下の図の通りです。
mruby/cでRubyのバイトコードを実行するVMが提供されており、mainを通してコンパイルしたRubyのバイトコードをVMに渡してRubyのプログラムを実行します。
※自分の理解のためにざっくり作成した図ですので、正確でない部分があるかもしれません。また、クラス図としての形式はあまり気にせずに作成しています。
プロジェクト作成について
今回はシェルスクリプト(newproject.sh)を用いて、プロジェクト作成と称してmakeに必要な最終調整を行っています。
[シェルスクリプトの処理内容]
・ 指定されたプロジェクト名を使用してトップのMakefileを作成する
・ mrubycにcomponent.mkをコピーする
・ mrubyc内にesp32用のhalをコピーする
※mrubycは外部リポジトリからcloneするため、mrubyc内への操作もここで行っています
makeの話
本環境ではESP32のmake環境であるESP-IDFを使用してビルド(make)しています。
そしてESP-IDFは、make時にmainとcomponentsのディレクトリとそのサブディレクトリを見て、そこにcomponent.mkという名前のファイルがあれば、それをmake時に実行します。
今回はそれを利用して、ESP-IDFのmakeと合わせてmruby/cのmakeも行っています。
参考記事:
https://kazkojima.github.io/esp-idf-components.html
atomのインストール
手順には必要ありませんが、エディタはatomをインストールしました。
(下記の参考記事の通りに取得してdebファイルを右クリックしてインストールしました)
参考記事:
https://www.leo-leo.uno/2018/08/18/392/
更新履歴
- 2019-03-20:細かい説明を「おまけ」に移動&追記