-
Notifications
You must be signed in to change notification settings - Fork 13
ESP32 での mrubyc の始め方
ボードについてはGPIOのピンのが外にどのように接続されているか、
UARTをPCで使用できるようにする内臓USBシリアルコンバータが含まれているか
を事前に確認しておきましょう。
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のビルドには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
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内のコードであれば十分収まる範囲です。
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̟+] です.