Raspberry Pi (Pi400) での利用 (講習会ユーザ用)

前提:利用する ESP32 マイコンには,mruby/c の VM が書き込まれているものとする.

SD カードに OS イメージを書く (Windows 11 での作業)

公式の Raspbery Pi Imager をインストールし,それを用いて micro SD への OS イメージの書き込みを行う. なお,後述の ESP-IDF ver.4.2 は Raspberry PI OS (armv7l) の 32-bit 版でしか動作しないので注意されたい. また,PI400 の US キーボード版を利用しているので,キーボードレイアウトは us としている.

  • OS : Raspberry PI OS (32-bit)
  • ストレージ : 接続した microSD
  • 詳細な設定 (右下の歯車アイコン) :
    • ホスト名 : es
    • ユーザ名・パスワード : 適宜
    • wifi 設定 : 適宜
    • ロケール :
      • タイムゾーン : Asia/Tokyo
      • キーボード : us

Raspberry Pi での準備作業

ESP-IDF 公式開発環境は必要ないのでインストールしない. ファームウェアは別途 PC で用意して書き込むことを念頭においている.

初期設定

Raspberry Pi Configuration にて,ロケールの設定をする. 他の設定は Raspbery Pi Imager にて設定済である.

  • Localisation
    • Locale : ja, UTF-8

基本パッケージのインストール

# apt update
# apt upgrade

# apt install dnsutils 
# apt install ruby
# apt install bison
# apt install lv emacs
# apt install gnome-terminal

mruby

ESP32 用 mrubyc ライブラリ (https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git) は mruby 2.1.0 に依存している.Debian パッケージの mruby とバージョンが合わないので, 手動で mruby 2.1.0 をインストールする.

$ git clone -b 2.1.0 https://github.com/mruby/mruby.git
$ cd mruby
$ ./minirake
$ sudo cp bin/* /usr/local/bin/

mkspiffs

メインプログラム (master.rb) からバイトコードを作成する際に必要となる mkspiffs コマンドを用意する.

$ cd ~/src
$ git clone https://github.com/igrr/mkspiffs
$ cd mkspiffs
$ git submodule update --init
$ ./build_all_configs.sh --esp-idf
$ sudo cp ./mkspiffs /usr/local/bin/

nodejs

スモウルビーは javascript で書かれており,nodejs が使われている. Debian パッケージの nodejs のバージョンが古いので, nodejs の公式の説明に従って nodejs が配布している Debian パッケージを利用する.

  • https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-enterprise-linux-fedora-and-snap-packages
  • https://github.com/nodesource/distributions/blob/master/README.md

    # curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
    # apt install -y nodejs

メモ

"npm install <パッケージ名>" を実行すると,依存するパッケージをインストールすることができる. "npm install -g <パッケージ名>" とすると,グローバルインストールすることができる (/usr 以下にインストールされる). -g を付けないと個人環境へのインストールとなる (~/.npm 以下にインストールされる). なお,"npm install" というようにパッケージ名を省略すると,カレントディレクトリの package.json の情報に元づいてパッケージがインストールされる.

package.json に書かれているパッケージ情報が古くなってきた場合は, npm-check-updates を用いてアップデートすると良い. 但し,npm v7 から仕様が変わったので,--legacy-peer-deps を付ける必要があるかもしれない. このオプションは peerDependencies の依存解決を v6 以前と同じ処理にするものである.

# npm install -g npm-check-updates

$ ncu
$ ncu -u

$ npm install --legacy-peer-deps

また,npm list でインストールされたパッケージとそのバージョンが一覧される.

$ npm list

esp-idf

ラズパイでは ESP32 用の VM をコンパイルすることは無いので,メインプログラム (master.rb) を mrbc コマンドでコンパイルして,esptool.py や idf_monitor.py で バイトコードのマイコンへの書き込みや,モニタ出力の確認ができれば良い. ここでは esptool.py, idf_monitor.py を用意する.

ESP32 用 mrubyc ライブラリ (https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git) で make spiffs するためには esptool.py が必要となる. ここでは root 権限でグローバル環境にインストールすることにした.

$ sudo pip install esptool 

ESP32 用 mrubyc ライブラリ (https://github.com/gfd-dennou-club/iotex-esp32-mrubyc.git) で make monitor で確認するためには,esp-idf を clone する必要がある. esp-idf/tools/idf_monitor.py を動かすだけなら,--recursive や ./install.sh を 実行する必要はないようだ.

$ git clone -b v4.2.3 https://github.com/espressif/esp-idf.git

SmT on Raspberry Pi のセットアップ

$ cd ~/SmT
$ git clone -b linux-SmTmini --recursive https://github.com/gfd-dennou-club/electron_smt.git
$ cd electron_smt/
$ npm install
$ cd app/esp/mrblib
$ mv master.rb ~/SmT/master.rb
$ ln -s ~/SmT/master.rb ./

$ cd ../
$ vi Makefile   (esptool.py, idf_monitor.py のパスやポート (/dev/ttyUSB0) を確認すること)

$ cd ../../
$ npx electron app (起動することを確認する)

デスクトップにショートカットを用意する.

$ cp bin/* ~/デスクトップ/     (日本語がうまく扱えない場合は,ファインダで操作すること)

デスクトップ上のアイコンをダブルクリックして実行する. プログラムを作成して「Rubyコードを保存」する際は,ファイル名は /home/pi/SmT/master.rb にすること.

ファイル内を確認し,パスがずれていないか確認すること. なお,SmT-monitor.sh と SmT-write.sh はターミナルを立ち上げてコマンドを実行する形にしている.

  • SmT.sh : SmT の起動
  • SmT-monitor.sh : モニター出力 (プログラムの動作確認用)
  • SmT-write.sh : メインプログラム (master.rb) のコンパイルとマイコンへの書き込みのみ
  • SmT-edit.sh : メインプログラム (master.rb) の編集.テキストエディタが起動する.

TODO

  • 一度マイコンへ書き込みをすると,SmT のウィンドウが x ボタンで閉じないことがある.理由がまだ判明していない
  • バイナリを以下のように作成することができる.しかし,esp32-mrubyc の master.rb は相対パスで指定されているので,ファイルが見つからないために動かない (そのために,デスクトップに起動用のシェルスクリプトを置くことにした).なお,バイナリを作る場合には以下のようにする.

    $ npx electron-packager app SmT-2022 --platform=linux --arch=armv7l electronVersion=16.2.4