Raspbian, Linux, macOSのArduino IDEの配下でシェルスクリプトを実行する環境を整え良好に動かすことができるようになりましたので以下にレポートします。
- 動機
Raspberry PiでArduino IDEベースのAVR開発環境にRasPiのGPIOを用いたAVRライタの仕組みを導入しようとしました。このとき,Arduino IDE内蔵のAVRライタソフトavrdudeはGPIO書込みに対応しておらず,Raspbianリポジトリからavrdudeをapt-getしArduino IDEのものと差し替える必要がありました。
この差し替え操作をArduino IDE配下のバッチ処理で自動化しようと考えたのが動機です。 - 概要
- Arduino IDE本体の修正(ハック)は行いません。
- Arduino IDEに備わっている機能だけで実現しました。
- Arduino IDEのボードマネージャからインストールできます。
- あらかじめ作成収容したシェルスクリプトのみが実行できます。
- 実行中のシェルスクリプトは標準入力(キーボード)から切り離されるのでインタラクティブな操作はできません。バッチ処理向きです。
- /bin/sh を子プロセスで起動するので,Raspbian, Linux, macOS でしか利用できません。
Windowsでpoweshellを子プロセスで起動すれば実行できると思いますが全く実験していません。
- 稼働実験
実験環境 RUNscript をArduino IDEに導入して動かしてみます。- Raspbian, Linux, macOSが対象です。
- インストール
- 下の実験パッケージのjsonをコピーしてArduino IDEの環境設定(Prerefarence)の「追加のボードマネージャのURL」欄に貼り付けます。
https://kimkosaka.github.io/RUNscript/package_Runscript_index.json - Arduino IDEでボードマネージャを起動します
「ツール」メニュー→「ボード」→ボード・マネージャ - リストの最下段あたりに”RUNscript”があると思います。これをインストールします。
- 下の実験パッケージのjsonをコピーしてArduino IDEの環境設定(Prerefarence)の「追加のボードマネージャのURL」欄に貼り付けます。
- シェルスクリプトの実行
- 「ツール」メニュー→「ボード」と進みボードリストをスクロールするとRUNscript-1,RUNscript-2がリストされています。これらはシェルスクリプトを実行するための”仮想ボード”です。
- RUNscript-1を選択します。(選択すると「ツール」メニューが閉じます)
- Runscript-1が持っているシェルスクリプトの実行は
再度,「ツール」メニューを開き「ブートローダの書き込み」をクリックします。
クリックと同時にシェルスクリプトが実行されArduino IDEの下部のメッセージエリアにスクリプト実行の進捗と結果が表示されます。
RUNscript-1のシェルスクリプトは下の通りです。#!/bin/sh echo "" echo "hello world" echo "" exit 0
- 同様にRUNscript-2を選択して実行して見ましょう。
RUNscript-2のシェルスクリプトは下の通りです。ls -l ~/ exit 0
- シェルスクリプトが保存されている場所(パス)
- Raspbian, Linux
~/.arduino15/packages/RUNscript/hardware/avr/1.0.1/bootloaders - macOS
~/Library/Arduino15/packages/RUNscript/hardware/avr/1.0.1/bootloaders - この配下に次の2つのシェルスクリプトファイルが収容されています。
hello_world.sh (RUNscript-1にバンドル)
list_files.sh (RUNscript-2にバンドル)
- Raspbian, Linux
- hello_world.sh,list_files.sh をエディタで開いて自前のスクリプトを記述保存して実行させてみましょう。
ただし,標準入力が切り離されますので注意が必要です。キーボード入力が必要なスクリプトは,実行時キー入力待ちになると無限に待ちます(フリーズ)
- 解説
- シェルスクリプトを実行する仕組みのイメージ
- ブートローダ書き込みの動作
「ブートローダ書き込み」クリックでブートローダのHEXファイルが吐き出されます
HEXファイルにplatform.txtに記述された制御引数(パラメータ)を付加し
platform.txtに記述されたAVR書き込みソフト(通常はAVRDUDE)に送ります
AVRDUDEは書き込み装置を制御パラメータに沿って動かしブートローダHEXをターゲットに書き込みます。
- シェルスクリプト実行
AVRDUDEの代わりにシェルスクリプトランチャー(RUNscript.sh)を使うようplatform.txtを記述します。
ブートローダHEXに付加していた制御パタメータを付加しないようplatform.txtを記述します。
念のため,コンパイラが起動されても動作しない(必ずエラーになる)ようなコンパイラ設定を記述します。
動作
「ブートローダ書き込み」クリックでブートローダHEXの代わりにシェルスクリプトを吐き出します。
パラメータを付加しないでランチャーに送ります。
ランチャーは渡されたスクリプトを/bin/shに送り実行させます。
- ブートローダ書き込みの動作
- シェルスクリプト実行のための設定ファイルなどについて解説します。
下のURLをクリックしてgithubを開きます。
https://github.com/kimio-kosaka/RUNscript
次の3.から各ファイルの概要を述べます。 - 標準のplatform.txt を次のように改編しています。
- avrdudeをRUNscript.shに変更
- 引数の付与を削除
- 念のためコンパイラの動作を停止
- board.txt は次のように記述しています
- ボード名:実行時選択する仮想ボード名
- ブートローダファイル:ボード名にバンドルされるシェルスクリプトファイル名
- 他はboard.txtの記述エラーとならないためのダミー記述
- bootloadersフォルダ
- このフォルダの中にスクリプトファイルを収容。
- シェルスクリプトランチャーRUNscript.sh
- Arduino IDEから呼出して使うツールはplatform.txt等とは別に用意し
package_RUNscript_index.jsonで開発環境パッケージに統合しています。 - RUNscript.shのソースコードは下のとおり
#!/bin/sh date echo "" if [ -e $1 ]; then /bin/sh $1 if [ $? -gt 0 ]; then echo "" echo "*** RUNscript finished ***" echo "" exit 1 else echo "" echo "*** RUNscript finished ***" exit 0 fi else echo not found: $1 echo "" exit 1 fi
- Arduino IDEから呼出して使うツールはplatform.txt等とは別に用意し
- package_RUNscript_index.json
開発環境のインストールためのメタファイル(開発環境パッケージ)です。
下のURLをクリックすれば内容を閲覧できます。
https://kimio-kosaka.github.io/RUNscript/package_Runscript_index.json- 開発環境設定ファイル(platform.txt,board,txt他)のアーカイブ
RUNscript-1.0.1.tar.gzを収容します。 - その開発環境で使うツール(この場合はRUNscript.sh)のアーカイブ
scripts-1.1.tar.gzを収容します。
OS毎にインストールツールを記述します。 - ボードマネージャは,このjsonの記述に沿ってダウンロードとインストールを行います。
jsonの記述に誤りがあればエラーを吐いて止まります。
- 開発環境設定ファイル(platform.txt,board,txt他)のアーカイブ
- シェルスクリプトを実行する仕組みのイメージ