Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Organization

Sphero gem で Sphero を操作してみる

この記事は Sphero Advent Calendar 2013 の2日目のエントリーです。

Sphero って何? という方は1日目のエントリーをご覧くださいませ。

会社の勉強会でKidsRubyの紹介をしたら、なぜか社内にSpheroが増えつつあります。
iPhoneやAndroidから公式アプリで動かすだけでなく、各種言語のライブラリで操作ができる。
困ったらAPI仕様が公開されているので確認できる。
なんて楽しいガジェット!
そして可愛い!

というわけで、 Ruby で Sphero を操作してみます。

あらかじめ Sphero gem を使えるようにしておきましょう。
gem install sphero でもなんでも、お好みの gem 管理方法でインストールしてください。
(わたしの環境だと、別途 serialport という gem をインストールしないとSpheroと接続できませんでした)

そしたらまずは、 Bluetooth で Sphero と接続します。
Sphero をタップして(我が家のSpheroは、割と強めに叩かないと起きてくれないのですが)起動します。
Sphero とデバイス接続できれば、 /dev の下に /dev/tty.Sphero-XXX-XXX-SPP のように Sphero の tty デバイスができているはず。
もしうまく Sphero と接続できない場合は、 iPhone など別の奴が Bluetooth で接続してしまってないか確認してみてください。

Sphero は、どこかから接続されていない間は、固有の3色の色で順番に点滅します。
赤-青-緑、のように。
点滅せずに、明るい青い色で光り続ける時は、Bluetooth接続中です。
赤い色が点滅している時は充電切れなので、大人しく充電させましょう。

ちなみに、未接続時に光る3色が、 /dev/tty.Sphero- の次の3文字になっているようです。
赤-青-緑なら /dev/tty.Sphero-RBG-XXX-SPP となります。

さて、 Sphero のデバイスは無事みつかったでしょうか?
Ruby から Sphero を動かすのは簡単です。

Sphero.start('/dev/tty.Sphero-XXX-XXX-SPP') do
  roll(100, 0)
  keep_going(1)
end

これで、Spheroは直進します。

roll(speed, heading) は heading の向きへ speed の速さで転がります。
speed は 0 から 255 まで指定できます。
heading は 0 から 359 まで、つまり角度の指定ができます。

keep_going(duration) は duration で指定した秒数、現在動作している状態( roll 中なら roll の状態)を続けます。

ブロックの中身は、startメソッドの中で instance_eval に渡され、 Sphero クラスのインスタンスのコンテキストで実行されます。
Sphero::FORWARD などの定数は、 gem の README の通りにはそのままは呼び出せないはず。
(バージョンによってはうまくいってしまうこともありますが、そちらはバグ扱いの挙動だそうです ⇒ 参照)
定数が使いたい場合は Sphero::FORWARD のようにクラス名から指定すると良いです。

Sphero.start は自分(つまり Sphero クラス)のインスタンスを作成し、ブロックを受け取っていた場合は instance_eval し、そして close して終了します。
File.open などと同じですね。
そして、やはり File.open などと同じく、ブロックを渡さなかった場合には、インスタンスを返すようになっています。

つまり、さきほどのコードは、以下のようにも書けます。

s = Sphero.start('/dev/tty.Sphero-XXX-XXX-SPP')
s.roll(100, 0)
s.keep_going(1)
s.close

走行中のSpheroは heading=(heading) で向きを変えることができます。

Sphero.start('/dev/tty.Sphero-XXX-XXX-SPP') do
  roll(100, 0)
  keep_going(1)
  heading = 90
  keep_going(1)
  heading = 180
  keep_going(1)
  heading = 270
  keep_going(1)
  heading = 0
end

走行を止めたい時は stop です。

s = Sphero.start('/dev/tty.Sphero-XXX-XXX-SPP')
s.roll(100, 0)
s.keep_going(1)
s.stop
s.close

Spheroの発光色を変える方法は2通りあります。
Sphero::COLORS という定数で、色名が設定されていますので、その色名を指定する方法。

Sphero.start('/dev/tty.Sphero-XXX-XXX-SPP') do
  color('cyan')
end

rgb では、直接数値の指定ができます。
先ほどの color は、実のところ rgb のショートカットです。

Sphero.start('/dev/tty.Sphero-XXX-XXX-SPP') do
  rgb(0, 255, 255)  # color('cyan') と同色です
end

color の第2引数、 rgb の第4引数に true を指定すると、ユーザの色として設定が保持されるそうです。
(デフォルトは false なので、一時的な変更扱いされるみたいです)

こんなふうに、Rubyからの操作はとても簡単です。
SpheroのAPIもSphero gemも、もうちょっと色々できるのですが、それについてはまた今度……今度があれば。
待てない! もっと色々やってみたい! という場合は、Sphero gem のコードを読んでみてください。
ファイル数も多くないし、コードも読みやすく、何ができるかすぐわかると思います。

さて、3日目はjishihaさんのSphero を Scratch(スクラッチ)から動かせるようにしたのでこどもでもプログラミングできるよです!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
16
Help us understand the problem. What are the problem?