Scratch と OSC の連携


Scratch は、初心者向けのプログラミング言語学習環境です。
OSC (OpenSound Control) は、MIDI の代替となる電子楽器用の通信プロトコルです。

注意
Scratch の最新版は バージョン 2.0 ですが。
この記事は バージョン 1.4 について述べています。
Scratch のサイト からダウンロードできます。

Scratch と外部プログラムの連携
Scratch 1.4 には 遠隔センサー (Remote Sensors) という機能があります。

Scratch と OSC の連携
Scratch の遠隔センサーと、OSC を橋渡しする Scratch OSC Bridge (以降 Bridge と称する) というアプリがあります。
Windows、MAC、Linux で動作します。

遠隔センサーのメッセージには、broadcast と sensor-update の2種類がありますが。
Bridge では、sensor-update を OSC メッセージとしてサポートしています。
broadcast は、Scratch と Bridge との間のコマンドして使用しています。

注意
Bridge は Java SE 6 を必要とします。
MAC の場合は ダウンロード – Java for OS X 2015-001 から

動作確認1 : Scratch から OSC Server へ
Scratch にて画像をクリックすると、
OSC Server にて画像に対応する文字が表示する。
OSC Server は pyOSC を使って Python で記述しました。

設定
(1) Scratch にて to_osc.sb を起動する。
20160827_scratch_to_osc

(2) Bridge を起動する。
「Connected with Scratch」が表示される。
送信先ホスト (HOST IP-ADDRESS) はデフォルトの「127.0.0.1」のままに。
送信先ポート (OUTGOING PORT) はデフォルトの「9000」のままに。
20160827_bridge_to_osc

(3) ターミナルにて、osc_server.py を起動する。

操作
(1) Scratch の画像をクリックする。
変数 /animal に値を代入し、sensor-update メッセージを送信する。
(2) Bridge にて、OSC メッセージに変換し、送信する。
(3) OSC Server にて、OSCメッセージを受信する。
ターミナルに、値に対応する文字を表示する。
画像と数字とメッセージの対応。
ねこ : 1:cat
いぬ : 2:dog
うま : 3:horse

プログラムの工夫
Scratch では、変数の値が変わった時に、sensor-update メッセージが送信されます。
「ねこ」の画像を続けてクリックしても、最初の1回しか送信されないという不具合が生じます。
これを回避するために、変数の値を設定してから、1秒後に画像以外の数字(0)を送っています。

動作確認2 : OSC Client から Scratch へ
OSC Client にて数字を入力すると、Scratch にて猫が移動する。
OSC Client は、pyOSC を使って Python で記述しました。

設定
(1) Scratch にて from_osc.sb を起動する。
20160827_scratch_from_osc

(2) Bridge を起動する。
「Connected with Scratch」が表示される。
「NOW LISTENING TO OSC PORT」に「8000」に表示される
「RECIEVED OSC ADDRESS」と「SEND THESE OSC ADDRESS TO SCRATCH」に「/MOVE」が表示される。
20160827_bridge_to_osc

(3) ターミナルにて、osc_client.py を起動する。

操作
(1) ターミナルにて、コマンド(数字)を入力する。
OSCメッセージ「/move 数字」を送信する。
(2) Bridge にて、sensor-update メッセージに変換し、送信する。
(3) Scratch にて、変数「/move」の値が変更される。
値に応じて、画像が移動する。

コマンドは、数字1文字です。
0 : 中心に移動する
1: 左に移動する
2 : 右に移動する
3 : 上に移動する
4 : 下に移動する

プログラムの工夫
Scratch では、sensor-update メッセージを受け取った時というイベントが無いようです。
sensor-update メッセージを受け取ると、対応する変数に値が設定されます。
変数が同じ値を保持するために、右に移動するというコマンドを送ると、いつまでも右に移動し続けるという不具合が生じます。
これを回避するために、OSC Client では、コマンドの数字を送ってから、1秒後にコマンド以外の数字(−1)を送っています。
Scratch では、変数の更新を1秒間隔にすることで、コマンドが一度実行された後は何もしないという動作を実現しています。
う〜ん。もっといいう手があるかもしれない。

プログラム
作成したプログラムは Github で公開しました。

参考
Scratch OSC Bridge
Scratch OSC Bridge 用の環境のセットアップとテストの手順


Python OSC (python-osc)


OSC (OpenSound Control) は、MIDI の代替となる電子楽器用の通信プロトコルです。

python-osc
前回は pyOSC を試した ので、今回は python-osc を試します。

インストールする

$ pip3 install python-osc

ソースとサンプルは github にあります。

動作確認
サンプルを試します。

(1) サーバー(受信)側を起動する

$ python3 simple_server.py

Serving on ('127.0.0.1', 5005)

(3) 別のターミナルで、クライアント(送信)側を起動する

$ python3 simple_client.py

Sending b'/filter\x00,f\x00\x00;2N\xfd'
... 

(3) 受信側のターミナルで、下記のような表示が出れば、OKです。

/filter 0.002720772521570325
/filter 0.31352025270462036
...

Python OSC (pyOSC)


OSC (OpenSound Control) は、MIDI (Musical Instrument Digital Interface) の代替となる電子楽器用の通信プロトコルです。
ちなみに、メッセージを送信する側を OSC クライアント、受信する側を OSC サーバーと言います。

Python などの多くの言語でサポートされています。
また、Pure Data などの音楽アプリや、Android や iPhone などの電子機器でもサポートされています。
電子楽器に限らず、汎用的な通信プロトコルとしても利用されています。

Python の OSC 対応には、Python 2 用の pyOSC と、Python 3 用の python-osc があります。

pyOSC
まずは、pyOSC を試します。
PyPI からソースをダウンロードする。
インストールする

$ python setup.py install

ドキュメントは pyOSC wiki にあります
サンプルは pyOSC examples にあります

動作確認
サンプルを試します。

(1)受信側を起動する

$ python basic_receive.py
 
Registered Callback-functions are :
default
/info
/arduino/analog
/error
/print
Starting OSCServer. Use ctrl-C to quit.

(2) 別のターミナルで、送信側を起動する

$ python basic_send.py 

(3) 受信側のターミナルで、下記のような表示が出れば、OKです。

OSCServer: OSCMessage '/print' from localhost:64300: [1234]
---
received new osc msg from localhost:60478
with addr : /arduino/analog
typetags i
data [4321]
---
OSCServer: OSCMessage '/print' from localhost:59731: [44, 4.5233001708984375, 'the white cliffs of dover']
...

Sumobot を Scratch から制御する


20160801_sumobot_scrach

Scratch と Python の連携 の応用として、
Sumobot を Scratch から制御します。

作成したプログラムは Github で公開しました。

主な作成手順
(1) MAC にて、Scratch プロジェクトを作成します。
画像をクリックすると、broadcast メッセージを送信する。
画像とメッセージの対応
– 上向き (forward) : “f”
– 下向き (backward) : “b”
– 左回り (left) : “l”
– 右回り (right) : “r”
– 停止 (stop) : “s”

(2) MAC にて、Python プログラムを作成します。
broadcast メッセージを受信して、Sumobot を移動する。
3秒後に停止する。

(3) Rapberry Pi (Sumobot) に転送します。

操作
(1) MAC から Rapberry Pi に VNC で接続します。
(2) Scratch プロジェクトを起動します。
(3) Python プログラムを起動します。
(4) Scratch の画像をクリックすると、Sumobot が移動します。


Scrach と Python の連携


Scrach は、初心者向けのプログラミング言語学習環境です。
ブロックを組み合わせてプログラムを作る ビジュアルプログラミング言語 の代表格です。

注意
Scrach の最新版は バージョン 2.0 ですが。
この記事は バージョン 1.4 について述べています。
Scratch のサイト からダウンロードできます。

遠隔センサー
Scrach 1.4 には、遠隔センサー (Remote Sensors) という機能があります。
仕様は Scratch Wiki に記述されています。
Remote Sensors Protocol

日本語で解説している記事もあります。
Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する

簡単に説明すると。
ポート 42001 を使ったソケット通信です。
メッセージの形式は、本文のサイズ (4バイト)+本文 (nバイト) です。
メッセージは2種類あり、broadcast と sensor-update です。

Python との連携
Python では、遠隔センサーを使うための py-scratch というモジュールが公開されています。
今回は、これを使用しますが。
プログラム本体は、150行とコンパクトなので、自分なりに改版して使うのも良さそうです。

py-scratch のインストール
(1) サイト からモジュールをダウンロードする

(2) インストールする

$ sudo python setup.py install
...
Finished processing dependencies for scratch==0.0.1a

動作確認1 : Python から Scratch へ
Python から broadcast メッセージを送信し、Scratch の猫を移動させる。
メッセージは、アルファベット1文字です。
c : 中心に移動する
l : 左に移動する
r : 右に移動する
u : 上に移動する
d : 下に移動する
20160801_python_to_scrach

動作確認2 : Scratch から Python へ
Scratch の画像をクリックすると、broadcast メッセージを送信し、Python にてメッセージを表示する。
画像とメッセージの対応。
ねこ : cat
いぬ : dog
うま : horse
20160801_scrach_to_python

プログラム
作成したプログラムは Github で公開しました。


PokemonGo Map を試す


ポケモンGO は、ナイアンティック社のサーバーと通信しながら、ゲームが進行します。
この通信部分がハックされて、Github で公開されています。
その1つ PokemonGo Map を試してみました。

インストール
ソースをダウンロードする

$ sudo -H pip install -r requirements.txt

Google Maps API キーを取得して、
config/credentials.json に書き込みます。

起動

$ python runserver.py -a AUTH_SERVICE -u USERNAME -p PASSWORD -l LOCATION -st STEP_LIMIT

AUTH_SERVICE は、google か ptc
USERNAME は、gmail アドレス (googleの場合)
PASSWORD は、gmail アドレスのパスワード (googleの場合)
LOCATION は、例えば “Yokohama, Japan”
STEP_LIMIT は、例えば 10

確認
WEBブラウザでアクセスする

http://localhost:5000

こんな風に、ポケモンがいる場所が表示される。
20160726_okemon_go;_map


ポケモンGOの非公式APIを試す


ポケモンGO は、ナイアンティック社のサーバーと通信しながら、ゲームが進行します。
この通信部分がハックされて、Github で公開されています。

その1つ pgoapi – a python pokemon go api lib/demo を試してみました。
下記の注意書きがあります。
・これは非公式です。自分の責任で使用してね。
・私は ポケモンGO をやらないよ。
・ボットや金稼ぎのコードは入ってないよ。

インストール
ソースをダウンロードする

$ python setup.py install
Finished processing dependencies for pgoapi==1.1.0

起動

$ python pokecli.py -a AUTH_SERVICE -u USERNAME -p PASSWORD -l LOCATION

AUTH_SERVICE は、google か ptc
USERNAME は、gmail アドレス (googleの場合)
PASSWORD は、gmail アドレスのパスワード (googleの場合)
LOCATION は、例えば “Yokohama, Japan”

レスポンス
下記のようなレスポンスが返ってきます

{ 'api_url': ***,
'auth_ticket': {***},
'request_id': ***,
'responses': {
	'GET_PLAYER': {***},
	'GET_INVENTORY': {***}
}

GET_PLAYER には、プレイヤーのプロファイルが、
GET_INVENTORY には、捕獲したポケモンの情報が入っています。

例えば

'pokemon_data': {  
  'pokemon_id': 25,  
  'captured_cell_id': 6924438341447319552L,
  'cp': 11,
  'creation_time_ms': 1469193683258L,
  'height_m': 0.5040460228919983,
  'weight_kg': 10.100167274475098
  'id': 6317937124603386989L,
  'individual_attack': 10,
  'individual_defense': 10,
  'individual_stamina': 10,
  'move_1': 219,
  'move_2': 78,
  'stamina': 10,
  'stamina_max': 10
}

examples の中に、ポケモン(pokemon) と 攻撃技(moves) の一覧があります。
pokemon_id 25 は、ピカチュウ(Pikachu)
move 78 は、かみなり(Thunder)
move 219 は、でんこうせっか(Quick Attack)

20160725_pikachu


Python ローカルのIPアドレスを取得する


Python コード
ローカルのIPアドレスを取得する

import socket
list = []
print "socket name" 
for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]:
	s.connect(('8.8.8.8', 80))
	nlist = s.getsockname()
	for n in nlist:
		print n,
	print
	name = nlist[0]
	list.append( name )
	s.close()
print
print "IP Address"
print list[0]

socket.socket(family, type)
AF_INET は、IPv4 インターネットプロトコルのこと。
SOCK_DGRAM は、IPパケットのこと。

s.connect((host, port))
8.8.8.8 は、Google の DNS サービスだと思うが。これを使う理由はよくわからない。

s.getsockname()
ソケットのIPアドレスとソケット番号を取得する。

参考
ローカルIPアドレスをプログラムで取得するには
python socket — 低レベルネットワークインターフェース
linux SOCKET


さくら IoT で温度・湿度を観測する


20160701_sakura_iot_system

さくらの IoT Platform さくらインターネットが提供するIoTプラットフォームサービスです。
前回 は、基本的な確認ができたので。
今回は、実用的なものを作ってみました。
センサーのデータ (温度・湿度など) を、さくらの IoT を経由して、WEB にてグラフ表示します。
作ったプログラムは Github で公開しました。

まず、センサー部です。
センサーボード として、以前作ったものを使います。
温度、湿度、気圧などが測定できます。
20160701_sakura_iot_sensor_board

Arduino にセンサーボードとIoT通信ボードを接続します。
Arduino のスケッチ を作成します。
Arduino に書き込みます。
Arduino の電源を入れると、さくらの IoT サーバーに送信されます。
データは、さくらの IoT コントロールパネルに表示されます。
これで、センサー部は完成です。

続いて、サーバー部です。
今回のアルファ版では、さくらのクラウド 2万円分チケットも付いていました。
ありがたく使わせて頂き、さくらのクラウドで新規にサーバーを立てました。
サーバーのプログラム を作成します。
主要部は、Python Flask で記述しました。
さくらの IoT Platform から来たデータを、いったんデータベース(MySQL) に格納します。
データベースから読み出し、Google Chart でグラフ表示します。
これで、サーバー部は完成です。

自宅で1日ほど運用したものが、下記に示します。
ここのところ、毎日30度を超えて暑いですね。
寝る前に、クーラーを入れたので、そこだけ温度が下がってます。
20160701_sakura_iot_graph


WiFi アクセス ポイントから位置情報を検索する


WiFi アクセス ポイントから位置情報 (緯度経度) を検索するには、
Google Maps Geolocation API を使用します。

まず、APIキーを取得します。
次に、サンプルを試します。

$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"

下記のような位置情報が返ってきます。
米国のGoogle本社のそばですね。

{ 
  "location": {
  "lat": 37.4248297,
  "lng": -122.07346549999998
 },
 "accuracy": 1145.0
}

20160620_geo_goole

手軽に試せるように Python コードを作成します。
作成したコードは Github で公開しました。

サンプルのMACアドレスで、実行します。

$ python geo_wifi.py 01:23:45:67:89:AB 01:23:45:67:89:AC

35.4437078 139.6380256 4093.0

Chromeブラウザに地図が表示されます。
なぜか、横浜市役所です。
20160621_geolocation

さて本番
家で拾えるWifiのMACアドレスを試すと、
う〜ん自宅の近くが表示されますね。(^^;

参考
Wi-FiのMACアドレスはもはや住所と考えるしかない
linux のコマンドラインから、wi-fi の情報をつかって位置情報を得る