Raspberry Pi (Pi400) での利用 (開発者環境 構築編)

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 をインストールする.

$ mkdir src
$ cd ~/src
$ 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

SmT 開発のための準備

esp-idf

公式の開発環境 ESP-IDF をインストールする.これをインストールしておけば 手元で VM を作りなおすことが可能となる.

$ 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 -b v4.2.3 https://github.com/espressif/esp-idf.git
$ cd esp-idf
$ ./install.sh

環境変数の設定

$ . ./export.sh

常に ESP-IDF 関連の環境変数を有効にするために,.bashrc に入れておく.

$ echo ". ~/esp/esp-idf/export.sh" >> ~/.bashrc

なお,ラズパイでは初期ユーザ pi は dialout グループに入っている. もし入っていなかったら dialout グループにユーザ pi を入れる必要がある. そうしないと,マイコンへの書き込みができない.

さらに,npm で esptool をグローバル環境にインストールしておく. そうしないと,SmT の実行時に環境変数がうまく引き継がれずにマイコンへの書き込みに失敗する.

$ sudo pip install esptool

mrubyc-esp32

ESP32 マイコン用の mrubyc ライブラリをインストールする.

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

高専ボードのための gem を使う. 以下は RTC, LCD, CO2 センサを使う場合.

$ cd components/
$ git clone https://github.com/gfd-dennou-club/mrubyc-gem-rx8035sa.git
$ git clone https://github.com/gfd-dennou-club/mrubyc-gem-aqm0802a.git
$ git clone https://github.com/gfd-dennou-club/mrubyc-gem-scd30.git

デバイス用のリポジトリに含まれる Ruby クラス用ファイルを mrblib 以下にリンクする. これは make gems コマンドで一括実行できる.

$ cd ..
$ make gems

  *** make links (.rb) ***
  ../components/mrubyc-gem-aqm0802a/mrblib/aqm0802a.rb -> mrblib/aqm0802a.rb
  ../components/mrubyc-gem-scd30/mrblib/scd30.rb -> mrblib/scd30.rb
  ../components/mrubyc-gem-rx8035sa/mrblib/rc8035sa.rb -> mrblib/rc8035sa.rb

  *** make links (.c, .h) ***

  *** add following lines in main/main.c ***

VM の書き込み. ラズパイではコンパイルに 10 分弱かかる.

$ make flash         

メインプログラムの書き込みを行って動作確認する. Ctrl-] でモニタを終了できる.

$ make spiffs monitor

smalruby3-gui-smt

ブロックの定義や,ブロックと Ruby コードとの対応の定義を行うためには, smalruby3-gui-smt を修正する必要がある.

$ mkdir ~/SmT
$ cd ~/SmT 
$ git clone -b linux-SmTmini https://github.com/gfd-dennou-club/smalruby3-gui-smt.git
$ cd smalruby3-gui-smt

ラズパイ (32 bit 版) では,chromedriver を削除しておく.chromedriver は 64 bit 版しか 提供されていないが,ESP-IDF ver. 4.3 は 32 bit 版しか提供されていないためである. chromedriver をインストールしなくても問題ないようだ.

$ vi package.json 

パッケージのインストール.なお,npm-check-updates を用いて package.json をアップデートすると インストールに失敗するので,npm-check-updates は利用しない.警告が多数でるが,エラーは無いので 気にしないことにする.

$ npm install

動作確認.実行してブラウザでアクセスする.http://localhost:8601 で確認できる.

$ npm start

scratch-vm-smt

smalruby3-gui-smt で用いる scratch-vm の入れ替えを行う. そうしないと,例えば smalruby3-gui-smt で新設したカテゴリを使った場合に, .sb3 ファイルとしてプログラムを保存することができない.

git clone する際に,名前を scratch-vm に変更する必要があることに注意されたい.

$ cd ~/SmT
$ git clone -b linux-SmTmini https://github.com/gfd-dennou-club/scratch-vm-smt.git scratch-vm

$ cd scratch-vm/
$ npm install
$ sudo npm link

smalruby3-gui-smt において scratch-vm へのリンクを作り直す.

$ cd ~/SmT/smalruby3-gui-smt/
$ npm link scratch-vm

electron_smt

$ 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 ../../
$ 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

現実的には,デスクトップに起動用のシェルスクリプトを配置することかな. 結果として,chromdriver を入れなくても動作することが確かめられた.