RAPIROをBYOB,Scratch,Etoysで動かす

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で動かす

基本的なメッセージの流れ(無線LAN接続の場合)


用意するもの

無線LAN接続の場合

ここでは,PC上でBYOBを動かすことにしていますが,RasPi(Raspbian)上でBYOBを動かすこともできます。Raspbian上でBYOBを動かす方法はBYOBをRaspberry Piで動かすを参照して下さい。

USB接続の場合

Mac OS XとLinuxの場合はあらかじめPythonの実行環境がありますが,Windowsの場合は各自Pythonの実行環境を用意する必要があります。詳しくはWindows で Python を使う — Python 2.7ja1 documentationを参考にしてください。

準備

インストール

無線LAN接続の場合は,以下の作業をPCからsshでRasPiにログインして行います。USB接続の場合はPCで行います。無線LAN接続の場合は予めRasPiのIPアドレスを調べておいてください。PCからはユーザpiを変更していない限り

ssh -l pi <IP address>
でログインすることができます。

注意:scratchpyと同様の機能のscratchというPythonモジュールがあります。こちらでも使えますが,下記のPythonプログラムを書き換える必要があります。

設定

BYOB(Scratch)のスクリプト作成

BYOBのブロック作成機能を利用した方がわかりやすいので,ここではBYOBを使用します。ブロック作成機能を使うことを除けば,Scratchでも同様にできます。

上記のブロックを作成したものです。rapiro.ypr

Scratchを使用する場合の工夫

Scratchを使用する場合はブロックを作成することができないので,次の様なPythonのファイルを利用してScratchからのメッセージ送信を簡単にするのがよいと思います。Pyonkeeを使うこともできます。
#####
#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で動かす

Etoys単独でメッセージ送信する方法が現状なさそうなので,BYOBかScratchを踏み台にします。BYOBやScratchで作成したプログラムをEtoysからのメッセージ送信で起動してもよいですし,BYOBやScratchは単なる中継地点と考えて,EtoysのみでRAPIROを動かすための命令を送信してもよいです。

ScratchConnect

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を使うとこの作業はしなくてもよくなります。)

削除した後はacceptして,イメージを保存します。 これでEtoysを使う準備ができました。オブジェクトのカタログの中にScratch Clientがあるので,それを取り出します。BYOBでHost Meshを実行後に,rapiro.pyを実行し,ScratchClientをダブルクリックします。後は,つぎのようなスクリプトをチクタクさせるか,ボタンを作成するとよいでしょう。Poseコマンドも同様に送信できます。

なお,RasPiで動くEtoysとしては,蜂須賀さんが公開しているEtoys-To-Go-5.0があります。「やっぱスクイーク(Squeak)が好き!」へようこそ!- 注)タイトルは気分で変更されます。 - PukiWikiからダウンロードできます。

Mathematicaで動かす

Raspberry Pi上のMathematicaを起動して,次の式を評価します。
serial = DeviceOpen["Serial", {"/dev/ttyAMA0", "BaudRate" -> 57600}];
次に#M1などの命令を送ります。その他Poseコマンドも同様に送信できます。
DeviceWriteBuffer[serial, {"#M1"}]; 

参考サイト
2014.11.15 Pyonkeeについて付記
2014.11.1 scratchpyと書くべきところをpyserialと記載したミスを修正
2014.10.16 Raspberry PiにBYOBをインストール方法を別ページに移動した。またコードの表示を見やすくした。
2014.10.14 Raspberry PiにBYOBをインストール方法をリンクではなく直接記載
2014.6.15 最初の説明の修正とMathematicaで動かす方法を追加しました。
2014.5.30 rapiro.yprへのリンクを分かりやすい場所に作りました。
2014.5.8 Scratchを使用する場合の工夫を追記
2014.4.7 表示・誤字の修正とWindows上のPython環境の情報を追記
2014.4.4 公開