2017年3月3日金曜日

Scratch 1.4からServoBlasterを使う

Arch Linux ARMに入っているScratch 1.4のブロックを使ってServoBlasterを動かそうという試み。

※言うまでもないですが、Scratchの改造・シェルスクリプトの実行は自己責任で!※

通常は、直接ServoBlasterを動かすためのブロックは用意されていないので、
ScratchをSmalltalkのレベルで改造する必要があり、以下を参考にして、
ブロックの追加を行った。情報を公開してくださった方々に感謝。
参考
http://itpro.nikkeibp.co.jp/article/COLUMN/20111019/371085/
http://oohito.com/nqthm/archives/2243
http://d.hatena.ne.jp/minekoa/20080314/1205484707

概要
ServoBlasterは、"echo 0=50% > /dev/servoblaster"と言った形式のコマンドで、
"/dev/servoblaster"に値を送る事でサーボモータを動かす。
 なので、Scratch側から上記のコマンド相当(ファイルへの書き込み)を実行できれば、
ServoBlasterが動くはず。

だったが、、、。

やってみたところ、Scratchで直接ファイル(/dev/servoblaster)への書き込みを
実行しても、ServoBlasterで拾わなかった。
そこで、Scratch外部のシェルスクリプトから"echo 0=50% > /dev/servoblaster"を送ってみた。
動作確認ができたので、この方法を使うことにした。

手順
①・ScratchからSmalltalkへ降りて、ブロックの追加をする。
②・追加したブロックに任意のファイルへの書き込みのメソッド(?)を設定する。
③・任意のファイルの更新を監視し、変更があった場合にファイル内容(文字列)を読み込んで、
"echo"コマンドで"/dev/servoblaster"へ送る為のシェルスクリプトを作成する。


手順①は上述の参考サイトを見て、適当なブロックのカテゴリに追加。


  1. ('servo %s' #- #servo: '0=50%')

ブロックができたことを確認。


手順②では、今回は任意のファイルを"/home/o10yan/Scratch/servo"と決めうちする。
(ホームディレクトリは私の環境の場合なので、そこは御自分の環境に読み替えて下さい)
書き込む文字列は引数"t1"で渡されていると推測。

  1. servo: t1
  2. | file |
  3. file _ FileStream fileNamed: '/home/o10yan/Scratch/servo'.
  4. file nextPutAll: t1.
  5. file close.
  6. (Delay forMilliseconds: 10) wait

(注:上記"file _"は、Scratchでは"file ←"と表示される)


Scratch側の準備は以上で終了。
試しに動かしてみて、ファイルができているかを確認。



手順③で以下のように、ファイル監視のシェルスクリプトを作成。
ファイルの更新監視用に"inotifywait"を使うので、予め"inotify-tools"をインストールしておく。
先ずは、監視用のファイルが存在するかを確認して、無ければ作っておく。
"inotifywait"で指定のファイルに更新があるかを監視し、更新があった場合、
ファイルの内容を変数(text_line)に読み込んで、それを"/dev/servoblaster"へ送る。
ファイルに文字列が残ってしまうと気持ち悪いので、空白を書き込んでおく。

  1. #!/bin/bash
  2.  
  3. if [ ! -e /home/o10yan/Scratch/servo ]; then
  4. touch /home/o10yan/Scratch/servo
  5. fi
  6.  
  7. while inotifywait -e modify /home/o10yan/Scratch/servo; do
  8. text_line=$(cat /home/o10yan/Scratch/servo)
  9.  
  10. if [ -n '$text_line' ]; then
  11. echo '' > /home//o10yan/Scratch/servo
  12. echo $text_line > /dev/servoblaster
  13. fi
  14. done

出来上がったシェルスクリプトを実行し、監視状態になることを確認し、
Scratchのブロックを動かす。


今回は、ServoBlasterを動かすための改造を行ったが、次回はLinuxコマンドを
送るような改造を行う。

※お願い※
私は、Smalltalkについて全然分かっていないので、コピペ主体で改造してます。
Smalltalkに詳しい方で、「ここは間違っている」「こうした方が良い」と言う
指摘がありましたら、コメントを頂けると有難いです。
よろしくお願いします。

0 件のコメント :

コメントを投稿