【弊社製品Tips】ぱぺろっくりー! for educationのブロックプログラムをRaspberry Piで自動実行

ソフィアプランニング製 ぱぺろっくりー! for educationは、googleのBlocklyをベースにしたPaPeRo i用ビジュアルプログラミングツールです。
Windows PCのChromeブラウザ上でブロックプログラムの作成、実行、デバッグができます。
入力されたブロックプログラムをJavaScriptに変換して実行する仕組みになっていて、動かすにはWindows PCとブラウザ(Chrome)が必要です。
したがって作ったプログラムをPaPeRo i単体では動かせないことになるわけですが、PaPeRo iのお腹にRaspberry Piを内蔵してPCの代わりをさせ、
電源ON時にブロックプログラムを自動実行させる方法があります。

Raspberry Piの自動実行設定

通常Raspberry Piの方が早く立ち上がるため、まずぱぺろっくりーが使えるようになるのを待ってからブラウザを起動するスクリプトを、/home/pi/pape6.shとして作成します。

#!/bin/bash
for j in {0..1000}; do
  if curl 192.168.1.1:8869/pape6/ > /dev/null; then
    sleep 30
    chromium-browser http://192.168.1.1:8869/pape6?autorun
    exit 0
  else
    sleep 2
    echo retrying...
  fi
done
exit 1

Raspberry Piで電源ON時しGUIがオープンした時点で実行させるには、
/home/pi/.config/lxsession/LXDE-pi/autostartに記述する必要があるので、このファイルに

@/home/pi/pape6.sh

を追記します。

これでぱぺろっくりーで最後に開いていたブロックプログラムが、電源ON時に自動実行される様になります。
なおこれが機能するためには電源ON時にユーザーpiでGUI環境で自動ログインするデフォルト設定になっている必要がありますので、
デフォルトから変更している場合には設定を戻す必要があります。
※ぱぺろっくりー! for educationの動作環境はWindows PCであり、Raspberry Piではシミュレータは正常動作しません。

Raspberry Piのリードオンリー化

Raspberry Pi/Raspbianは普通のLinuxなので、電源を切る前にちゃんとshutdownする必要がありますが、PaPeRo iのお腹に入れて運用するとなるとそれは難しいです。また、普通にSDカードに書き込みを行う状態でRaspberry Piをサーバー用途で使うと、正確な数値はわかりませんが、数ヶ月でSDカードの寿命が来てしまうという話もあります。
そこで今回に限らず組込み用途で使う場合にはOSが入ったSDカードはリードオンリーでマウントし、その上にRAMディスクをかぶせて一見普通にリードライト出来る様にする、という手法がとられます(電源ON中に上書きされたデータは電源OFFで消えてしまいます)。

この方法は、検索すると実績はあるけれどカーネルの再コンパイルが必要で大変なaufsや、ユーザー空間なので遅いfuseの情報が多く、現状カーネルに取り込まれて一番使いやすいはずのoverlay(旧overlayfs)の情報があまり見つかりません。
色々調べた結果、こちらDSAS開発者の部屋:ラズパイで作るネットワークエミュレータ(後編)の方法が一番良い様でしたので使わせて頂くことにします。
しかしなぜかうまく行かない所がいくつかあったので修正し、またどうせなので全部まとめてリードオンリー化ができるシェルスクリプトにしてみました。
といっても単に並べただけなので、ちょっとしたことで失敗する可能性があります。
・実行は自己責任でお願いします。
・失敗しても良い新しいSDカードでのみ実行して下さい。
 消えては困るデータがあるSDカードでは決して実行しないで下さい。
・NOOBSは使わずRASPBIAN WITH DESKTOPを直接SDカードに書いたもので実行して下さい。
・念のため実行前に/boot/config.txtのバックアップは取っておいて下さい。
 これさえ戻せば、ゴミは残るにせよ、元通りの起動になるはずです(/bootはvfatなのでPCで戻せます)。
・シェルスクリプト中で必要なツールをapt-getしていますので、インターネット接続可能な状態で実行して下さい。
・sudo suしてrootで実行して下さい。
・(消えない場所ならどこでも良いですが)/home/piで実行して下さい。
・何かうまく行かない場合、通常リブート中にkernel panicになります。kernel panicというとぎょっとする人もいるかもしれませんが、カーネルのブートシーケンスを変えようとする様な場合にはkernel panicは当たり前に発生し、それが解決のヒントになります。今回のinitスクリプトでは確率的に発生する未知の不具合を想定してinitスクリプト内でエラーを検出した場合にはリブートする様になっているので、もしリブートを繰り返して何のエラーか確認しづらいという場合には、

ng() {
    echo
    echo "NG"
    #exec sh   # rescue shell
    exec reboot -f
}

となっているところを

ng() {
    echo
    echo "NG"
    exec sh   # rescue shell
    #exec reboot -f
}

に変更してください。エラーが発生した時点でrescue shellに抜けるようになります。

・エラー無く実行が終われば、リブートでリードオンリーになります。
・リードオンリー、リードライトをスクリプトで切り替えられます。
 /home/pi/overlay/set_rw.sh リブート後にリードライトになります
 /home/pi/overlay/set_ro.sh リブート後にリードオンリーになります
・また、リードオンリー状態でも

$ sudo mount -o remount,rw /overlay/disk

とし、/overlay/disk/home/piなど/overlay/disk/をルートとみてファイルを追加・編集すれば、再度roでremountするか正しくshutdown/rebootすれば、変更が反映されます。

※RASPBIAN STRETCH WITH DESKTOP Release date:2017-09-07 / Raspberry Pi2 Model Bで動作確認しました。Raspberry Pi1はこの用途では力不足でPaPeRo iより起動が遅くなる様です。

自動実行化の手順

一部繰り返しになりますが、この方法で自動実行化する場合、

(1) sudo set_rw.sh && rebootでリードライト状態にしてchromium-browserでブロックプログラムを作成し動作確認する
(2) そのままchromium-browserを閉じる
(3) sudo set_ro.sh && haltまたはrebootする

という手順が必要です。特に(2)にご注意ください。
自動実行をやめる場合、リードライト状態にして/home/pi/.config/lxsession/LXDE-pi/autostartに追加した行を削除して下さい。