僕は発展途上技術者

Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

のんびり書こうかなとも思っていたが、こちらの記事 →Pyonkeeで遊ぼう! でも紹介されたりと期待もされているようなので続けざまに2回目を書きます。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

ポート番号 42001 を開放



前回の記事で、スクラッチの「遠隔センサー接続」を有効にする方法を書いた。

「遠隔センサー接続」を有効にするとスクラッチは TCP のポート番号 42001 を開放する。

スクラッチのユーザーを意識して、コンピューターのことにまだ詳しくない人にも、できればスクラッチ中上級者になったこどもたちにもわかるようにと思ってこの記事を書いているが、とはいえ全部を説明しだすとキリがないので、TCP について、あるいはポート番号についてもっと詳しく知りたかったら Wikipedia などで調べて欲しい。

ポート番号というのは、語源が port(船の荷物の出入口)であることから連想できるように、プログラム同士をつなげて通信するときの出入口の番号だと思ってもらいたい。ポート番号というのは実はたくさんあるのだけれど、42001 番の出入口だけが開いて、そこからだけ通信できるようになると想像してほしい。

Ruby のプログラムをスクラッチにつなげる



これ以降の説明では Ruby が登場する。Ruby がわかっているのが望ましいが、遠隔センサー接続の仕組み自体は実はそれほど難しいわけではないし、説明にはアニメーションgifを使って実際に動いている様子を見せるようにするので、Ruby がわかっていなくても何となく雰囲気だけでもわかってもらえるかもしれない。

Scratch につなげる Ruby のプログラムは以下の通り、コメントを抜かせばたった2行だ。



localhost とは、プログラムを動かしているマシンのそのもののアドレスだ。スクラッチとこの ruby のプログラムは同じマシン上で動いているので、つなげる接続先は、同じマシン上の TCP 番号 42001 となる。

これを実行してみても、特に何も起こらない。プログラムをスクラッチにつなげただけで何もせず終了しているからだ。



スクラッチからのメッセージを覗き見る



スクラッチにつなげたあと、送られてきたメッセージを読み込んで表示するプログラムを追加した。



loop do と end で囲む部分はスクラッチでいえば「ずっと」のブロックだ。囲まれた部分はプログラムを中断するまでずっとループし続ける。

socket.recv(100) で、ポート番号 42001 から流れてくるメッセージを十分な長さ(100バイト)受け取っている。

そして puts message.unpack("H*")[0] でメッセージをバイトで表示している。unpack("H*")[0] は16進文字列に変換する命令だ。

これを実行して、試しに「◯◯を送る」ブロックで a というメッセージを送ってみる。



「a を送る」をクリックするたび、何やら謎めいた文字列が表示されているのがわかるだろうか。メッセージの内容は良いとして、どうやらスクラッチから Ruby のプログラムに何らかのメッセージが送られているらしいということはわかってもらえたと思う。

メッセージの内容を読み解く



「a を送る」をクリックしたときにスクラッチから送られてきたメッセージは


0000000d62726f61646361737420226122


だ。これは送られてきたメッセージを16進文字列で表示したものだ。

読みやすくするため数字2つずつで区切ってみる。


00 00 00 0d 62 72 6f 61 64 63 61 73 74 20 22 61 22


Scratch Wiki の Remote Sensors Protocol の説明を読めばわかるのだが、スクラッチとの間でやり取りされるメッセージは、最初の4バイトとその残りとに分けられ、最初の4バイトは残りのメッセージが何バイトなのかの長さを示している。

上記の例では


00 00 00 0d


が残りのメッセージのサイズを示している部分だ。これを10進数で表すと 13、つまりその後に続くメッセージの長さは 13 バイトであることを示していて、0d に続く 62 以降のバイト(2つの文字または数字のかたまり)を数えてみれば 13 個であることがわかる。

残りのメッセージの部分


62 72 6f 61 64 63 61 73 74 20 22 61 22


は、ASCII 文字列(本当は UTF-8 なのだが英数字しか登場していないので ASCII 文字列と考えて良い)の16進数表示だ。

ASCII文字コードを頼りに、置き換えてみよう。

62 → b、72 → r、.... 20 → スペース、22 → " と置き換えていくと、


62 72 6f 61 64 63 61 73 74 20 22 61 22
b r o a d c a s t " a "


のように暗号が解ける。

スクラッチから送られてきていたメッセージは broadcast "a"(a をブロードキャスト、放送する)だったことがわかる。

「制御」カテゴリの「◯◯を送る」ブロックは実は英語では「broadcast ◯◯」ブロックなのだ。スクラッチの言語を英語に切り替えてみればそれが確認できる。

これで、「◯◯を送る」を実行すると、スクラッチから broadcast "◯◯(送るメッセージの内容)" というメッセージが送られてくる、ということがわかったかと思う。

Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

スクラッチ(1.4)で Romo を動かしたり、Sphero を動かしてみたりしている。

» iPhone がロボットになる Romo を Scratch でコントロールしてみました

» Sphero を Scratch(スクラッチ)から動かせるようにしたのでこどもでもプログラミングできるよ

「凄い!これってどうやっているんですか?」とその仕組みを大人からもこどもからも良く聞かれる。「スクラッチの「遠隔センサー接続」を使っていて、詳しくはScratch Wikiに載っています」と答えてはいたのだが、ページは英語で書かれているし解説もかなりシンプル過ぎていて、これでわかってください、というのも酷だったので、これから何回かにわけて「遠隔センサー接続」の仕組みについて日本語でできるだけ丁寧に解説してみたいと思う。

シリーズ全エントリーはこちら↓

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)

» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)

なぜ「遠隔センサー接続」を使うとスクラッチ以外のものが動かせるのか?



そもそもなぜ「遠隔センサー接続」を使うとスクラッチ以外のものが動かせるのか、説明しよう。

たとえばスクラッチから Romo を動かすには、スクラッチから Romo に何らかの命令を送る必要があるのだが、そのためにはスクラッチと Romo が何らかの形でつながっていなくてはならない。

しかし、スクラッチでの操作は、いつもはスクラッチの中で閉じている。何のことを言っているかわからないかもしれないが、たとえば、「制御」カテゴリのなかの「○○を送る」というブロックで考えてみよう。

「○○を送る」ブロックで送った命令は、同じ「制御」カテゴリの「○○を受け取ったとき」ブロックで受け取る。これがスクラッチの中で閉じている、ということだ。スクラッチで送った命令は同じスクラッチの中でしか、普通は受け取れない。

けれどもスクラッチの「遠隔センサー接続」を有効にすれば、「○○を送る」ブロックで送った命令がスクラッチの中だけではなく、スクラッチ以外の別のプログラムでも受け取れるようになるのだ。

たとえば「前進」という命令をスクラッチから受け取ったら Romo を前進させるプログラムをスクラッチとは別に用意しておく。「遠隔センサー接続」を有効にしたスクラッチの「『前進』を送る」ブロックを使えば、「前進」という命令が Romo を動かすプログラムに届き、そのプログラムが Romo を前進させる。

スクラッチから Romo を動かすのに必要な Scratch2Romo や、Sphero を動かす Scratch2Sphero などはすべて、スクラッチからの命令を受け取ってそれぞれ Romo や Sphero など対応するものを動かす橋渡しをするプログラムなのだ。

「遠隔センサー接続」でできること



「遠隔センサー接続」を有効にしたきに、スクラッチとつながったプログラムに対してできることは以下の2つだ。

1. いままで説明したように「○○を送る」で送った命令をスクラッチ以外のプログラムにも送ることができる

2. 「すべてのスプライト用」の変数に値を入れると、その変数の名前と新しくセットされた変数の値の情報を、スクラッチ以外のプログラムに送ることができる

スクラッチとつながったプログラムから逆に、スクラッチに対して以下の2つのことができるようにもなる。

1. スクラッチとつながったプログラムからスクラッチに対して、「○○を送る」と同じ仕組みの命令を送ることができる。スクラッチではこの命令を「○○を受け取ったとき」ブロックで受け取ることができる

2. 自分で好きに名前を付けたセンサーをつくり、その値をスクラッチとつながったプログラムから変えることができる。スクラッチでは、「調べる」カテゴリの「○○センサーの値」ブロックで値を受け取ることができる

このように「遠隔センサー接続」を有効にすれば、スクラッチ → スクラッチ以外のプログラム という一方向だけでなく、スクラッチ以外のプログラム → スクラッチ という方向に対しても情報を送ることができ、双方向のやり取りができるようになる。

「遠隔センサー接続」を有効にするには



スクラッチの「調べる」カテゴリの一番最後の2つのブロック「○○センサーの値」か「ボタンが押された」のブロックの上で右クリックして現れる「遠隔センサー接続を有効にする」を選ぶ。




次回予告



さて次回は、スクラッチからスクラッチとつながった他のプログラムに対して命令を送っている様子、反対にスクラッチとつながった他のプログラムからスクラッチに対して命令を送っている様子を実際に見てみたいと思う。

デジラボおきなわ第3弾「クリエーターズキャンプ」にメンターとして参加してきました

先週末ですが、沖縄で開催されたデジラボおきなわ第3弾「クリエーターズキャンプ」にメンターとして参加してきました。

デジラボおきなわ クリエーターズキャンプは、第1弾、第2弾でソフトウェア、ハードウェア開発を学んだ小・中・高校生達が2日間の合宿で一からプロダクトを作る、あるいはそれまでの準備期間で作り上げたプロダクトの仕上げをおこない、最終日に発表するというハッカソン形式のイベント。

CoderDojo Okinawaの主催者であり、Ruby on Rails チュートリアルを翻訳した Yasslab こと安川さんと僕は、主に小学生を対象とした「スクラッチでピタゴラ装置を作ろう!」(Making Rube Goldberg Machine with Scratch) というプロジェクトのメンターとして参加しました。

2日間といっても最初の日はイベントの説明や各プロジェクトの紹介などがメインだったので、開発期間は実質1日。最初に定番のねこ逃げでスクラッチのおさらいをした後、それぞれの担当部分のプロジェクトを作り上げていきます。

ピタゴラ装置は全員のプロジェクトがうまく連携しあわないと成功しないので、自然と直接つながる隣同士とは協力しあわないと完成しないところがミソ。とかくプログラミングというと、集中してのめりこんでしまうので、ワークショップ中まったく参加者同士の交流がないといったことになりがちなのですが、このテーマだとコミュニケーションが必須というところが良いところだと思います。

こうして完成した作品を動画におさめ、発表のときに使用しました。



ゴールしたときのこども達の歓声に何度観ても笑みがこぼれます。

成功の裏側には数多くの失敗が。。。成功版もいいですが、こちらの NG 版も僕は好きです。エンジニアリングとは失敗の連続だということも学んでもらえたんじゃないかなあ。

「スクラッチでピタゴラ装置を作ろう!」NG集 from Yohei Yasukawa on Vimeo.



2年前 Scratch@MIT でおこなわれ、僕も参加した教師向けのワークショップを参考に、OtOMO でおこなったスクラッチでピタゴラスイッチマシーンを作ろうを、今回は Raspberry Pi の上で動くスクラッチと電子部品数点で実現してみました。

安価にとても手軽に実現でき、ワークショップのネタとしておすすめで、安川さんがインストラクター向けのドキュメントを用意しているので興味ある方はぜひ参考にしていただきたい。

» ラズベリーパイ版「スクラッチでピタゴラ装置を作ろう!」(インストラクター向け)

さてさて最終発表会では、各プロジェクトが発表し、最後には各スポンサーから賞が手渡されたのだが、残念ながら「ピタゴラ装置」チームは賞を逃してしまいました。

まあ確かに、イベント概要に


自分自身のアイデアを活かして、実際に社会や家庭の課題を解決する製品、「プロダクト」の開発にチャレンジ


とあり、


おうちの人、地域の人、世界の誰かの課題や悩み、困っていることを解決したり、誰かをハッピーにするものが望ましい


とあるので、「ピタゴラ装置」には分が悪かったかな?

でも、発表会の聴衆を楽しませ、そして何より参加している子供たちがハッピーなのは負けていないと思いました。

しかし、大賞を勝ち取った沖縄県西原市西原東中学校チームの「Scratch GPIO + Raspberry Pi でドラムの自動演奏」は文句なく圧巻でした。

Scratch GPIO を使ってドラムをスティックを動かすことを想像するのはそれほど難しくありません。そのアイデアを思いつくことは簡単かもしれない。しかし、それをここまで完成度高く実現した例は初めて見ました。アイデアよりも実践が大切、MIT も説くDemo or Die の精神を目の当たりにした思いで、演奏中感慨で思わずちょっと泣きそうになってしまいました。

最初から最初まで、ドラムを演奏しているのは人間ではなく Raspberry Pi の上で動くスクラッチのプログラムです。



教えにいったのに、実際には沖縄の子どもたちにいろいろと教えてもらった感じです。

おまけ↓ 沖縄の海はやっぱり綺麗でした。

プロフィール

株式会社まちクエスト代表、つくる社LLC代表。

Raspberry Piではじめる どきどきプログラミングを書きました。

Amazonから図書館検索 Libron、iPhoneアプリ ひらがなゲーム かなぶん を作っています。

Twitter @jishiha

最近のエントリー

アーカイブ