RAPIROを動かす場合,やはりケーブルフリーで動かしたいのですが,そのためには,Raspberry Piを搭載して無線LAN経由で操作する必要があります。Raspberry Piを用意できない場合は,PCとRAPIRO上のArduinoとケーブル接続で動かすことになります。
このページでは,RAPIROにRaspberry Pi(以下RasPi)を搭載して無線LAN経由でPC上のBYOB(Scratch)から制御する場合(以下無線LAN接続とよぶ)とPCとRAPIRO(Arduino)をUSB接続してシリアル通信でPC上のBYOB(Scratch)で制御する場合(以下USB接続とよぶ)の2つの場合について説明します。なお,RAPIRO上のArduinoにはSample Programはインストールされているものとします。(RAPIROを保有している人は行っているはずなので説明は省略します。)
Etoysを使う方法はEtoysで動かすを読んで下さい。
Mathematicaで動かす方法も追加しました。(2014.06.15追加)Mathematicaで動かす
ここでは,PC上でBYOBを動かすことにしていますが,RasPi(Raspbian)上でBYOBを動かすこともできます。Raspbian上でBYOBを動かす方法はBYOBをRaspberry Piで動かすを参照して下さい。
無線LAN接続の場合は,以下の作業をPCからsshでRasPiにログインして行います。USB接続の場合はPCで行います。無線LAN接続の場合は予めRasPiのIPアドレスを調べておいてください。PCからはユーザpiを変更していない限り
ssh -l pi <IP address>でログインすることができます。
無線LAN接続の場合はRasPiで,USB接続の場合はPCでpyserialをインストールします。
Welcome to pySerial's documentation — pySerial 2.7 documentation
RasPiの場合は
sudo apt-get install python-serialを実行します。PCの場合は上記のサイトを参照してインストールします。
無線LAN接続の場合はRasPiで,USB接続の場合はPCでpyserialscratchpyをインストールします。
pilliq/scratchpy · GitHub
setuptoolsがインストールされていれば,
easy_install scratchpyでインストールできます。
注意:scratchpyと同様の機能のscratchというPythonモジュールがあります。こちらでも使えますが,下記のPythonプログラムを書き換える必要があります。
無線LAN接続の場合は,以下の作業をPCからsshでRasPiにログインして行います。USN接続の場合はPCで行います。
次のファイル(ここではrapiro.pyとする)を作成します。 無線LAN接続の場合はhostはPCのIPアドレス,USB接続の場合はlocalhostですが,hostを記載しなければデフォルトでlocalhostになります。scratchpyの説明を参照して下さい。このファイルでは,IP アドレスが192.168.0.2のPCでBYOB(Scratch)を起動している設定になります。 USB接続の場合は/dev/ttyAMA0を変更します。変更する名前はArduino IDEを使用しているときと同じものにします。Scratchの場合はこちらを参照願います。
##### import scratch import serial ser = serial.Serial('/dev/ttyAMA0', 57600, timeout=1) com = scratch.Scratch(host='192.168.0.2') try: while 1: msg=com.receive() if msg[0] == 'broadcast': print(msg[1]) ser.write(msg[1]) elif msg[0] == 'sensor-update': pass else: pass except KeyboardInterrupt: ser.write("#M0") ser.close() com.disconnect() #####
BYOB3.1.1を使用する場合は,共有から「メッシュのホストになる」をクリックします。 Scratch1.4を使用する場合は遠隔接続センサーを有効(remote sensor connections を enable)にします。
無線LAN接続の場合はRAPIROにsshでログインして,上記のrapiro.pyを実行します。
python rapiro.py
BYOBのブロック作成機能を利用した方がわかりやすいので,ここではBYOBを使用します。ブロック作成機能を使うことを除けば,Scratchでも同様にできます。
Rapiroのサンプルコードでは,あらかじめMoveコマンドとして,#M0から#M9までの10の動作が定義されています。詳しくは,Getting Started - right after you assembled your RAPIROを見て下さい。
BYOB上で,例えば#M1送ると,RAPIROが前に進みます。止めるには#M0を送ります。
この方法はScratchでもできる方法です。Scratchを使う場合はこのように命令を送信します。なお,こちらも参照願います。
#M1では何をするのかよくわからないので,BYOBで次のようなブロックをつくると分かりやすいと思います。
他に#M0から#M9まで名前を付けておきます。(ここではGetting Startedの説明をそのまま付けています。)
ここまではサンプルプログラムのMoveコマンドの実行でしたが,次に個別のサーボモータの動作制御とLEDの点灯の制御を行うPoseコマンドを考えます。サーボモータを動かすための基本的な命令はGetting-startedに書かれています。サーボモータを動かす一つ一つの命令は,サーボ番号角度実行時間の並びになります。ここで角度はあらかじめ決められている範囲での位置を表す角度です。例えば,頭を正面からみて30度右に1秒で回す場合,頭を制御するサーボの角度は顔の右真横が0度で左真横が180度になっていますので,正面から見て右に30度の位置はサーボの角度では60度になるので,
#PS00A060T010BYOBでいちいちこれを入力して送るのは,面倒なのでブロックを作ります。
数値部分は3桁で書かないといけないので,10は010にしないといけません。変数に010を入れるだけならいいのですが,あとで増やしたりできるように以下のように3桁の表現にできるようにしました。(もう少し簡単な方法があるでしょうか。)
サーボ番号は00から11なので,同様にzfii2を作ります。これらを用いて次のようにPoseコマンドを送信するブロックを作ります。
LEDのほうも同じように作ります。
サンプルプログラムのMoveコマンドで定義されているようにすべてのサーボとすべてのLEDを制御するための命令をまとめて送ることができます。まとめて送る場合は
#PS00A090S01A090S02A000S03A090S04A090S05A180S06A090S07A090S08A080S09A110S10A080S11A120R000G000B000T005のような形式になります。このような形式の表現を作るために次のブロックを用意します。
##### #coding: utf-8 import scratch import serial ser = serial.Serial('/dev/ttyAMA0', 57600, timeout=1) com = scratch.Scratch(host='192.168.1.15') try: while 1: msg=com.receive() if msg[0] == 'broadcast': if msg[1] == '前': ser.write("#M1") elif msg[1] == '右': ser.write("#M4") elif msg[1] == '左': ser.write("#M3") elif msg[1] == '後': ser.write("#M2") elif msg[1] == '止': ser.write("#M0") else: pass elif msg[0] == 'sensor-update': pass else: pass except KeyboardInterrupt: ser.write("#M0") ser.close() com.disconnect() #####Scratchでは,前後左右止の文字をメッセージ送信することでRapiroを動かすことができます。Pause命令についてもPythonファイルを工夫することで,Scratchのメッセージ送信を楽にすることができます。
Etoysからメッセージを送信するには,横川さんのScratchConnectを使います。現在Etoys5に含まれているScratchConnectはブロードキャストのタイルを使う時に不具合があるので,最新のScratchConnect-ky.6.mczを
SqueakSourceからダウンロードします。
ダウンロードしたmczファイルをEtoysのデスクトップにドラッグアンドドロップして,load versionを選びます。
このままだと,scratchpyでメッセージをパースするときにエラーがでるので,EtoysでSystem Browserを開いて,
ScratchConnect-Etoys->ScratchClientMorph->scratch->broadcast:を選んで,一番最後のクゥオーテーション'の前にあるスペースを削除します。(Pythonモジュールとしてscratchpyではなくscratchを使うとこの作業はしなくてもよくなります。)
なお,RasPiで動くEtoysとしては,蜂須賀さんが公開しているEtoys-To-Go-5.0があります。「やっぱスクイーク(Squeak)が好き!」へようこそ!- 注)タイトルは気分で変更されます。 - PukiWikiからダウンロードできます。
serial = DeviceOpen["Serial", {"/dev/ttyAMA0", "BaudRate" -> 57600}];次に#M1などの命令を送ります。その他Poseコマンドも同様に送信できます。
DeviceWriteBuffer[serial, {"#M1"}];