2019年5月21日火曜日

RAPIROをScratchで制御する

5月25日(土)にスクラッチディ 2019 山梨にデモ出展することになりました。

何も準備できていませんが、この秋から予定しているプログラミング塾での教材をデモしようかなと考えています。Scratchでプログラミング可能なLEGO MINDSTORMS NXT(Enchanting)、Edison(EdScratch)、Scratch Jr on Raspberry Piなんですが、それだけでもちょっと寂しいのでRAPIROにMCをやってもらおうかなと考えました。

 Raspbian StretchではScratch 2.0 オフラインエディターが標準でインストールされています。
(注:Scratch3.0のリリースに合わせて2019年1月2日からScratch2.0オンラインエディターの提供が終了しました。)
そしてオフラインエディターには拡張機能があり、独自のブロックを簡単に追加できるようです。
Python で軽量サーバを作って Scratch 2 のHTTP拡張を待ち受けてみる
これで、拡張機能を作ってScratch(RAPIROとは別にRaspberry Pi 3で動かします)でシナリオ通りにRAPIROに喋らせるという魂胆です。確認の為にRaspberry PiでScratch2を立ち上げて、Shiftキーを押しながら「ファイル」を選ぶと「import experimental extension」と表示されるので、行けそうです。

Step1:HTTP拡張機能の作成


参考のページを元に拡張機能を定義しようとしましたが、外部のHTTPサーバへアクセスすることはできないようです。ポート番号は指定できますが、サーバについては指定方法がないようです。

仕方がないので、Bottle+PythonでRAPIROへリクエストを繋ぐ簡易サーバを作成しました。次にJSON 形式の.s2eファイルを作成して、拡張機能を読み込ませようとしましたが、うまく読み込んでくれません。URL を指定するようダイアログが出るので、「file:///.s2eファイルへのパス」で指定しても読み込んでくれません。

ここで、断念かと思いましたが・・・


Step2:Javascript Extensions


拡張機能で検索をしているとこちらのページにたどり着きました。
ここに
The current 2.0 extensions available in the offline editor, like the PicoBoard extension, are Javascript extensions.
とありました。
ということで、Step1で作成したPythonと.s2eファイルをJavaScriptに変換してみました。

Javascriptで拡張機能を作成する詳細仕様はこちらに上がっていますが、Ajaxも使えるようなのでRAPIROへのリクエスト送信も簡単に記述できました。

さて、実際にテストしてみると無事に拡張ブロックが表示されました。
今回は、最低限の機能だけ拡張機能として取り込んだので、今後時間を見てバージョンアップしたいと思います。



Javascriptについてはこちらにアップしてあります。

2019年5月17日金曜日

RAPIRO完全無線化 ー完結編(ソフトウエア)ー

大分時間が空いてしまいました。他の事で時間が取られてしまって書いている時間が取れませんでした。
さて、RAPIROの完全無線化についてハードウエアの方は完了したので、ソフトウエアの設定を行いたいと思います。と言っても、各パーツについてはすでに動作確認が終わっているので、それらを統合して簡単に使えるようにするだけです。

なお、以下の作業はRAPIROに組み込んだRaspberry Pi Zero B+(以下 PiZero)での作業になるので、まずは、sshでログインしてください。

Step1:カメラ画像のストリーミング


カメラ画像のストリーミングについてはこちらに投稿しておきましたが、PiZeroの電源を入れたら自動的にストリーミングを始めるようにサービス化しておきます。

まず、/home/pi/streaming/streaming.shとして以下を作成します。
#! /bin/sh
export LD_LIBRARY_PATH=/usr/local/lib/mjpg-streamer
mjpg_streamer -o "output_http.so -w /usr/local/share/mjpg-streamer/www" -i "input_raspicam.so -fps 5 -x 480 -y 320"
次に、/usr/lib/systemd/system/streaming.serviceとして以下を作成します。
[Unit]
Description=Mjpg-Streamer

[Service]
ExecStart =/home/pi/streaming/streaming.sh
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable streaming.service

Step2:RAPIROコントローラ(Python)


Bottle + PythonでRAPIROを外部から制御できるようにします。HTTPでコマンドを受け取ると、シリアル通信でRAPIROへコマンドを投げるという簡単な仕組みです。
Python用軽量Webフレームワークとしては他にFlaskもあり、どちらも簡単にREST風アプリが作れますが、私はBottleを利用しています。

Pythonのソース(本体)とindex.html、RAPIROのサーボモータをOFFにする機能をつけたスケッチをGitHubに上げてあるのでそちらを参照してください。詳細はソースを見ていただければすぐにわかると思います。
index.htmlではmjpg_streamerの提供するCSSファイル等をstaticフォルダ経由で利用しているので注意してください。又、python3、bottleについてはインストール済みであるとします。
$ cd ~
$ git clone https://github.com/KeiIchimaru/rapiroctl.git
$ cd rapiroctl
$ ln -s /usr/local/share/mjpg-streamer/www static
スケッチについてはRAPIROへの書き込みを行っておいてください。
あとはサービスとして登録する作業になります。
/usr/lib/systemd/system/rapiroctl.serviceとして以下を作成します。
[Unit]
Description=RAPIRO Controller

[Service]
ExecStart =/home/pi/rapiroctl/rapiroctl.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable rapiroctl.service
以上で、PiZeroのポート80でHTTPリクエストを待ち受けているので、ブラウザでアクセスするとサンプルの画面が表示されます。サンプルではカメラからのストリーミングも表示しているので、RAPIROに搭乗して操縦しているような感覚が得られると思います。(移動すると、画面が左右に大きく揺れるので酔いやすい方はご注意くださいw)

Step3:shutdownスイッチ


PiZeroはRAPIROの頭部に組み込まれているので、shutdownする場合は外部からsshでログインする必要があります。その為にPCを立ち上げるのも面倒なので、ハードウエア編で触れていますが、こちらのサイトを参考にshutdown用タクトスイッチを付けることにしました。利用したGPIOはBCM23(P16:物理ピン番号)とGND(P14)を使い、組み立てる時にタクトスイッチから配線しておきました。

PythonのプログラムはGitHubに上げてあるので、すでにダウンロードしてあるはずですのでサービスとして登録するだけです。
/usr/lib/systemd/system/shutdownbuttond.serviceとして以下を作成します。
[Unit]
Description=Shutdown by Button Daemon

[Service]
ExecStart =/home/pi/rapiroctl/shutdownd.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable shutdownbuttond.service

Step4:動かしてみて


以上で、全て完了したので動作確認です。
PiZeroの電源をONにすると、しばらくしてカメラが赤く光って起動が終了したことがわかりますので、その後RAPIRO本体の電源を入れて準備完了です。

ブラウザからPiZeroにアクセスすると下のような画面が出てきます。どう動くかは、各自試してみてくだサイ。ノートパソコンやスマフォからだと画面からはみ出て使いずらいと思いますので、各自自由にカスタマイズして使いやすい画面にして頂ければ幸いです。


rapiroctl.pyそのものはhttpサーバとして動いているだけなので、スマフォアプリを作成するなど応用は色々あると思います。

画面下部の「Play」はaudioフォルダ内の.wavファイルを再生する機能です。アンプが組み込んであるのでRAPIROを喋らせることができます。「Say」は指定されたテキストを音声合成して喋らせようとしたのですが、処理に時間がかかるので現在は使っていません。この辺りのこともそのうち時間ができたら投稿したいと思います。

電源を切るときは、タクトスイッチを長押しするとshutdownプロセスが開始されるので、しばらくしてカメラのランプが消えたら、PiZeroの電源を切って、最後にRAPIRO本体の電源を切ってください。


Raspberry Pi ZeroでHeadphonesが無くなった

最近こんなの Adeept Robotic Arm Kit for Arduino や こんなの 「Petoi Bittle」(ペトイ・ビトル) を購入して遊んでいました。 両方共にArduino互換ボードでサーボモーターを駆動する物ですが基本的なプログラムは提供されるのでとりあ...