ピョンキー(Pyonkee)とRaspberry Pi
ピョンキー(Pyonkee)は、iPad版のScratchです。
Scratchには「遠隔センサー接続を有効にする」ブロックがあります。ピョンキーにもあります。これは、Scratchがインストールされた端末(PCだったりSBCだったりiPadだったり)とTCP/IPネットワーク内にある他の端末と通信を行うための、Scratch側端末をサーバーに見立てるブロック、のようです。このブロックを有効にすると、Scratch側の端末にScratchスクリプトに対するポートが開きます。クライアントとなる他の端末はScratch側の端末のIPアドレスとこのポート番号を使って通信を確立します。その後双方向(ソケット)通信できるようになります。双方向共にブロードキャストのようです。このときネットワーク内をRemote Sensors Protocolに則って通信します。
両端末共にScratchスクリプトで「遠隔センサー接続を有効にする」をオンにし、インタラクティブに通信できるかもしれません。
今回は「Scratchからモーターを駆動しよう」&「ピョンキー(Pyonkee)とRaspberry Pi」ですので、iPadにインストールしたピョンキーから、同一無線LAN内にあるRaspberry Pi上のGPIOに接続したモーターを駆動します。
- TCP/IPネットワーク環境に、ご家庭でも導入されている無線LAN(Wifi)を利用します。
- iPadに割り振られたIPアドレスを使います。ポート番号は「42001」です。
- iPadにインストールされたピョンキー(他のScratchでも同様)で行うことは、
- 「変数」で「すべてのスプライト用の変数」を作りこの変数に対して値を読み書きします。ピョンキーでこの変数に値を代入するだけで変数名と値のセットをブロードキャストします。他の端末からこの変数に対する値を受信すると変数に値が代入されますので、ピョンキーでこの変数を読むと値を取得できます。
- 任意の文字列を「制御」の「XXを送る」と「XXを受けっとた時」で送受信することができます。ピョンキーではこれらのブロックを使って他の端末に文字列を送ったり受信したりします。
- あとはいつの通りスクリプトを書きます。
- 最後に「調べる」ー「スライダーセンサーの値」を右クリック→「遠隔センサー接続を有効にする」を実行することで、他の端末と通信を開始することができます。
- Raspberry Piでピョンキー(他のScratchでも同様)と通信するにはRemote Sensors Protocolに則ったソケット通信プログラムを書く必要があります。ネットワーク上のScratchと通信するのに便利なPythonライブラリ「scratchpy」がありますのでこれを使います。
- またRaspberry Piからボード上のGPIOにアクセスするのに便利なPythonライブラリ「WiringPi/WiringPi2-Python」がありますので、モーターを駆動するのにこれを使います。
下準備をします。
- nmapコマンドをインストールします。
nmapコマンドは同じネットワーク上に存在する(使用している)PCのIPアドレスを調べることができます。
LXTerminalを起動して、以下のコマンドを実行します。
pi@raspberrypi ~ $ sudo apt-get update pi@raspberrypi ~ $ sudo apt-get -y install nmap
使い方は至ってシンプル。-sPオプションつけて、調べたいネットワークのIPアドレス範囲を指定して、sudoで実行します。
pi@raspberrypi ~ $ sudo nmap -sP 192.168.100.1-255
私の環境ではこのようになりました。(iPad上のピョンキーで「遠隔センサー接続を有効にする」ブロックを実行した場合)
「Apple」という文字があります。「Apple」製品はiPadしか起動していないのでこれがiPadです。IPアドレスを控えます。 - pipコマンドをインストールします。
pipコマンドはPythonにおけるパッケージ管理システムです。後ほどPythonライブラリをインストールするのに使います。
LXTerminalで以下のコマンドを実行します。
pi@raspberrypi ~ $ sudo apt-get -y install python-pip
- git-coreコマンドをインストールします。
Gitとは、プログラムのソースコードのバージョン管理システムです。後ほどWiring Piライブラリをインストールするのに使います
LXTerminalで以下のコマンドを実行します。
pi@raspberrypi ~ $ sudo apt-get -y install git-core
- python-devパッケージとpython-setuptoolsコマンドをインストールします。
python-devコマンドはPythonの開発環境、python-setuptoolsコマンドはpipと同じPythonにおけるパッケージ管理システムです。後ほどWiringPi2-Pythonライブラリをインストールするのに使います
LXTerminalで以下のコマンドを実行します。
pi@raspberrypi ~ $ sudo apt-get -y install python-dev python-setuptools
- Raspberry Piにscratchpyをインストールします。
LXTerminalで以下のコマンドを実行します。最後に「Successfully installed scratchpy(改行)Clean up...」と表示されれば成功です。
pi@raspberrypi ~ $ sudo pip install scratchpy
- Raspberry PiにWiringPi/WiringPi2-Pythonをインストールします。
WiringPi2-Pythonは、C言語で書かれたWiringPiのPythonラッパーライブラリです。まずWiringPiをインストール後、WiringPi2-Pythonをインストールします。
- WiringPiをインストールします。詳しいインストール手順はこちらにあります。→Wiring Pi Download and Install
LXTerminalで以下のコマンドを実行します。ビルド後、最後のあたりで「[Install](改行)(改行)All Done.」と表示されれば成功です。
pi@raspberrypi ~ $ git clone git://git.drogon.net/wiringPi pi@raspberrypi ~ $ cd wiringPi pi@raspberrypi ~ $ git pull origin pi@raspberrypi ~ $ ./build
- WiringPi2-Pythonをインストールします。詳しいインストール手順はこちらにあります。→WiringPi/WiringPi2-Python
LXTerminalで以下のコマンドを実行します。最後に「Finished processing dependencies for wiringpy2==多分バージョン」が表示されれば成功です。
pi@raspberrypi ~ $ git clone https://github.com/Gadgetoid/WiringPi2-Python.git pi@raspberrypi ~ $ cd WiringPi2-Python pi@raspberrypi ~ $ sudo python setup.py install
- WiringPiをインストールします。詳しいインストール手順はこちらにあります。→Wiring Pi Download and Install
LXTerminalで以下のコマンドを実行します。ビルド後、最後のあたりで「[Install](改行)(改行)All Done.」と表示されれば成功です。
以上で下準備は完了です。
Raspberry Piの電源を切って、Raspberry PiのGPIOにモーターを接続します。
TA7291P | Raspberry Pi GPIO もしくは モーターの端子 | 機能 |
---|---|---|
1 | 6(GND) | GND |
2 | モーターへ接続 | モーターへ接続 |
3 | 非接続 | - |
4 | 12(GPIO18) | モーターのパワー |
5 | 16(GPIO23) | モーターの回転方向の制御(正転) |
6 | 18(GPIO24) | モーターの回転方向の制御(逆転) |
7 | 1(3.3V) | モータードライバの電源 |
8 | 2(5V) | モーターの電源 |
9 | 非接続 | - |
10 | モーターへ接続 | モーターへ接続 |
スクリプトを書きます。
ピョンキー: 一画面に収まらないので、拡大して少しずつ写真を取りました。
スクリプトです。
コスチュームです。
変数です。
ステージです。
Rapsberry Pi側: Pythonで書きます。ファイル名を「motor.py」にしました。
import scratch import wiringpi2 # # PIN # MOTOR_PWM_PIN = 18 MOTOR_CRTL_RIGHT_PIN = 23 MOTOR_CRTL_LEFT_PIN = 24 # # MOTOR CONTROL # MOTOR_STOP = 0 MOTOR_RIGHT = 1 MOTOR_LEFT = 2 # # function # def listen4Scratch(): while True: try: yield s.receive() except scratch.ScratchError: raise StopIteration def ctrlMotor(direction): gpio.delay(10) if direction == MOTOR_STOP: gpio.digitalWrite(MOTOR_CRTL_RIGHT_PIN, 0) gpio.digitalWrite(MOTOR_CRTL_LEFT_PIN, 0) elif direction == MOTOR_RIGHT: gpio.digitalWrite(MOTOR_CRTL_RIGHT_PIN, 1) gpio.digitalWrite(MOTOR_CRTL_LEFT_PIN, 0) elif direction == MOTOR_LEFT: gpio.digitalWrite(MOTOR_CRTL_RIGHT_PIN, 0) gpio.digitalWrite(MOTOR_CRTL_LEFT_PIN, 1) def powerMotor(pmw): gpio.delay(10) gpio.pwmWrite(MOTOR_PWM_PIN, pmw) # # initialize # gpio = wiringpi2.GPIO(wiringpi2.GPIO.WPI_MODE_GPIO) gpio.pinMode(MOTOR_PWM_PIN, gpio.PWM_OUTPUT) gpio.pinMode(MOTOR_CRTL_RIGHT_PIN, gpio.OUTPUT) gpio.pinMode(MOTOR_CRTL_LEFT_PIN, gpio.OUTPUT) s = scratch.Scratch(host='192.168.100.101') s.connect() # # control # s.broadcast("jyunbi-ok") while True: for msg in listen4Scratch(): if msg[0] == 'broadcast': # code to handle broadcasts if msg[1] == 'migi-muki': ctrlMotor(MOTOR_RIGHT) elif msg[1] == 'hidari-muki': ctrlMotor(MOTOR_LEFT) elif msg[1] == 'tomare': ctrlMotor(MOTOR_STOP) else: break elif msg[0] == 'sensor-update': # code to handle sensor updates for key, value in msg[1].iteritems(): if key != 'engine': break gpio.delay(100) powerMotor(value) else: break
モーターを駆動します。
- ピョンキーの「遠隔センサー接続を有効にする」ブロックを実行します。
- Raspberry Piからnmapコマンドを使って、iPadに割り振られたIPアドレスを調べます。
pi@raspberrypi ~ $ sudo nmap -sP 192.168.100.1-255
- Rasperry Pi側のスクリプト「motor.py」にiPadのIPアドレスを記述します。
- Rapsberry Piで「motor.py」を実行します。
pi@raspberrypi ~ $ sudo python motor.py
- 通信が確立されれば、ピョンキーが「モーター準備OK」と言います。ピョンキーをクリックしてください。クリック毎にモーターが右回転(出力1000)→左回転(出力900)→右回転(出力1000)→停止→先頭に戻る、します。
参考WEBサイト
- ピョンキー(Pyonkee)
- Remote Sensor Connections(Scratch Wikiサイト内)
- Remote Sensors Protocol(Scratch Wikiサイト内)
- Python(Scratch Wikiサイト内)
- Communicating to Scratch via Python with a GUI(Scratch Wikiサイト内)
- scratchpy
- WiringPi/WiringPi2-Python
- Wiring Pi