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 FULL (32-bit)
- ストレージ : 接続した microSD
- 詳細な設定 (右下の歯車アイコン) :
- ホスト名 : 適宜
- ユーザ名・パスワード : 適宜
- wifi 設定 : 適宜
- ロケール :
- タイムゾーン : Asia/Tokyo
- キーボード : us (← USキーボード版を使っているため)
Raspberry Pi での準備
設定
Raspberry Pi Configuration にて,ロケールの設定をする. 他の設定は Raspbery Pi Imager にて設定済である.
- Localisation
- Locale : ja, UTF-8
基本パッケージのインストール
ターミナルを起動して以下を実行.
$ sudo -s # apt update # apt upgrade # apt install dnsutils # apt install bison # apt install lv emacs # apt install code # 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
$ sudo -s # 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 $ git clone https://github.com/gfd-dennou-club/mrubyc-gem-ili934x.git $ git clone https://github.com/gfd-dennou-club/mrubyc-gem-sht35.git
デバイス用のリポジトリに含まれる Ruby クラス用ファイルを mrblib 以下にリンクする. これは make gems コマンドで一括実行できる.
$ cd .. $ make gems $ cd main ; ln -s ../components/mrubyc-gem-ili934x/main/font.h ./ ; cd ..
VM の書き込み. ラズパイではコンパイルに 10 分弱かかる.
$ make flash
メインプログラムの書き込みを行って動作確認する. Ctrl-] でモニタを終了できる.
$ make spiffs monitor
smalruby3-gui-smt
ブロックの定義や,ブロックと Ruby コードとの対応の定義を行うためには, smalruby3-gui-smt を修正する必要がある.
$ mkdir ~/SmT $ cd ~/SmT $ git clone -b linux-SmTmini-2022 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 --force
electron_smt
$ cd ~/SmT $ git clone -b linux-SmTmini-2022 --recursive https://github.com/gfd-dennou-club/electron_smt.git $ cd electron_smt/ $ npm install $ cd app/ $ mv esp esp.bk $ ln -s ~/esp/mrubyc-esp32 ./esp $ cd esp/src $ mv master.rb ~/SmT/master.rb $ ln -s ~/SmT/master.rb ./ $ cd ../ $ vi Makefile (esptool.py, idf_monitor.py のパスやポート (/dev/ttyUSB0) を確認すること) $ cd ../../ $ cp bin/* ~/Desktop/ (注:ディレクトリ名が日本語 (デスクトップ) となっている場合もある)
デスクトップ上のアイコンをダブルクリックして実行する. プログラムを作成して「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 を入れなくても動作することが確かめられた.