Skip to content

ESP32 での mrubyc の始め方

Ko-ichiro Sugiyama edited this page Apr 16, 2022 · 14 revisions

はじめに

まず必要なものは、ESP32チップを搭載したボードです。

ボードについてはGPIOのピンのが外にどのように接続されているか、
UARTをPCで使用できるようにする内臓USBシリアルコンバータが含まれているか
を事前に確認しておきましょう。

ESP-IDF 環境の構築

ESP32 マイコンの標準開発環境である ESP-IDF をインストールする.ESP-IDF のバージョンは 4.2 系 (2022/04/15 現在の最新は v4.2.3) にすること.なお,ESP-IDF を使う前にいちいち export.sh を実行するのは面倒なので, ~/.bashrc に追加しておくとよいだろう.

$ sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools python3-serial python3-click python3-cryptography python3-future python3-pyparsing python3-pyelftools python3-libusb1 cmake ninja-build ccache
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

$ mkdir ~/esp
$ cd ~/esp
$ git clone --recursive -b v4.2.3 https://github.com/espressif/esp-idf.git
$ cd esp-idf
$ ./install.sh

$ . ./export.sh 

Debian 系の場合は,ユーザを dialout グループに入れておかないとセンサに書き込みができない.

# usermod -a -G dialout <自分のユーザ名>

mruby/c環境の構築

mrubyのビルドにはCRubyが必要となります。
ここでは複数のRubyをシステム内に共存させるためのツールrbenvを使用します。

$ cd $HOME
$ git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv

パスを通す

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $HOME/.bashrc  
$ echo 'eval "$(rbenv init -)"' >> $HOME/.bashrc  
$ source .bashrc  

ruby-build をインストール.

$ mkdir -p "$(rbenv root)"/plugins  
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build  

Ruby のバージョンは 2 系統の最新にすること (2020/04/15 時点で 2.7.6).

$ sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev  
$ rbenv install 2.7.6 
$ rbenv global 2.7.6 

上のコマンドで、 ruby 2.7.6pXX (XXXX-XX-XX revision XXXXXX) [x86_64-linux] のように出力されれば大丈夫です。

mruby のインストール

$ rbenv install mruby-2.1.0

iotex-esp32-mrubyc の環境設定

rubyのコードを書き換える度にファームウェア毎アップロードしていたのを、rubyのバイナリデータをFlashの一部にSPIFFSを利用してアップロードし、実行する機能です。

rubyのバイナリデータをSPIFFS用のイメージにする「mkspiffs」が必要になります。

■ mkspiffsのビルド方法

$ git clone https://github.com/igrr/mkspiffs
$ cd mkspiffs
$ git submodule update --init
$ ./build_all_configs.sh --esp-idf

■ mkspiffsの確認とインストール

$ ./mkspiffs --version
mkspiffs ver. 0.2.3-7-gf248296
Build configuration name: esp-idf
SPIFFS ver. 0.3.7-5-gf5e26c4
Extra build flags: -DSPIFFS_OBJ_META_LEN=4
SPIFFS configuration:
  SPIFFS_OBJ_NAME_LEN: 32
  SPIFFS_OBJ_META_LEN: 4.  # ここが「4」になっていること
  SPIFFS_USE_MAGIC: 1
  SPIFFS_USE_MAGIC_LENGTH: 1
  SPIFFS_ALIGNED_OBJECT_INDEX_TABLES: 0
$ sudo cp ./mkspiffs /usr/local/bin/

■ファームウェアの書き込み

$  git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git 
$ cd iotex-esp32-mrubyc
$ make menuconfig
    IoTeX ESP32 mrubyc Configuration  --->
          [ ] USE ESP32 Firmware Flash # チェックを外し、Ctrl+Sで保存
$ make flash         

■SPIFFSへの書き込み

$ make sdc
$ make spiffs #以降はmrblib/loop/master.rbを書き換えたらこのコマンドを実行するだけでOK

■従来のファームウェアに戻す

$ cd iotex-esp32-mrubyc
$ make menuconfig
    IoTeX ESP32 mrubyc Configuration  --->
          [*] USE ESP32 Firmware Flash # チェックを入れて、Ctrl+Sで保存
$ make adc flash

■その他 ・Flashの領域はpartition.csvで管理されており、ESP32のSPIFFSで設定できる最小サイズである16KB(0x4000)に設定してあります。現状のExample内のコードであれば十分収まる範囲です。

動作確認 (Hello World)

IoTexのmrubyc環境利用の基礎知識を見ながらHello Warldを表示するプログラムを書く。

プロジェクトの作成  

基本的に ESP-IDF 環境と同じなので, ESP-IDF 環境がインストールされているディレクトリ (ここでは $HOME/esp) 以下にプロジェクト用のディレクトリを作る. GitHub から clone する.

$ cd ~/esp  
$ git clone https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git mrubyc-00-hello-world  
$ cd mrubyc-00-hello-world  

プログラムの作成

mruby/c のコードはプロジェクトディレクトリ内の mrblib/loops 以下に置きます。
mrblib/loops/master.rb というファイルを作成し, 以下のようなプログラムを書き込みます。
このプログラムは 5 秒毎に "Hello World!" を延々と表示するものです。

while true  
  puts "Hello World!"  
  sleep 5  
end  

ビルドする前に

ビルドする前に、 ESP32 のデバイス名の確認を行います。
ESP32 は /dev/tty* というデバイス名で認識されていることが一般的です。
/dev/tty* を調べ, "USB" と付くもの or tty.<USB-Serial の型番> を探します。
Linux の場合は /dev/ttyUSB0 となるのが一般的です。

ビルド

make コマンドを用いてビルドする
ESP32 のデバイス名を確認した後に、make コマンドを実行します。
プロジェクトのディレクトリで最初に make コマンドを実行した時には 以下の例のように config menu が表示されます。
TOP から Serial flasher config を選択し、"Default serial port" を先に調べたデバイス名にします。

$ make  

マイコンへの書き込みと標準出力の表示

マイコンに書き込むのは make spiffs コマンド (但し,make flash コマンドを最初に 1 回行う必要あり)、
標準出力を表示するのは make monitor コマンドです。
まとめて make spiffs monitor としても良いです。
また、 puts や print で何らかの情報を書き出すようにしている場合は make monitor する必要があります。
プログラムのマイコンへの書き込みが終了すれば, "Leaving...." "Hard resetting via RTS pin..." といった表示がなされます。
プログラム中で "printf("Hello world!\n");" と書いたのを表示させたければ, make monitor する必要があります。
monitor を終了するのは Ctrl̟+] です.