GAINERと加速度センサとFunnelでKeynoteのスライドをめくる
1000speakers:7@仙台#1ではコミュニティー枠で東北のコミュニティーの紹介を話したんですが、それだけでは技術的な話がないので、GAINERと加速度センサとFunnelとRubyで、Keynote.appのスライドをめくるというのをデモしました。
GAINERのボタンを押すときに、加速度センサが載っているブレッドボードを
- 向こうに傾けると:スライドがスタート
- 手前に傾けると :スライドがストップ
- 右に傾けると :スライドが次へ
- 左に傾けると :スライドが戻る
という仕組みです。
Gainerと加速度センサーをブレッドボードを使って組みました。加速度センサーの説明書や「+GAINER」のP.110を参考にしました。
もっと長さのちょうど良いジャンプワイヤーを使えば、見栄の良い回路を組むこともできます。もちろんブレッドボードが無ければ、直接半田付けをすれば良いのですが、次回の使い回しが大変になりますね。
加速度センサーのアップ写真。このセンサーがX軸Y軸Z軸の加速度を出力してくれます。かわいいですね♪
そしてFunnel Serverを立ち上げて、Gainerを認識していることを確認します。
Keynoteでプレゼンしたいスライドを開いておいて、以下のプログラムをターミナル等から実行すると動作すると思います。
#!/usr/bin/ruby
$LOAD_PATH.push('lib')
require 'funnel'
include Funnel
gio = Gainer.new
gio.button.on RISING_EDGE do
ain0 = gio.ain(0).value
ain1 = gio.ain(1).value
if ain1 > 0.7
slide('show next')
elsif ain1 < 0.3
slide('show previous')
elsif ain0 < 0.3
slide('start')
elsif ain0 > 0.7
slide('stop slideshow')
end
end
def slide(appscript)
<<-`EOC`
osascript -e '
tell application "Keynote"
#{appscript}
end tell'
EOC
end
sleep(60*15)まず、FunnelのRuby用ライブラリを読み込みます。今回はプログラムファイルと同階層にlibフォルダを作って置きました。
次にGAINERの基板に付いているボタンが押された事(RISING_EDGE)をトリガーにして、アナログ入力の値を読み込みます。Funnelを使うことによって、すごく簡単に書くことができます。
今回使ったのは3軸加速度センサなのでX軸Y軸Z軸の3つの出力があります。アナログ入力0、アナログ入力1、アナログ入力2にそれぞれのピンが接続されているのですが、今回はX軸とY軸だけを見ればよいので、X軸が接続されているain(0)と、Y軸が接続されているain(1)の値を得ています。
そして、それぞれの値によって、スライドをnext/prev/start/stopしています。
Keynote.appを動かすにはAppleScriptを作ってMacのosascriptコマンドを実行しています。
次のスライドに進む時は
tell application "Keynote"
show next
end tell'
というAppleEventをosascriptコマンドでKeynoteに送ってあげると、スライドが1枚めくれます。
osascriptは、シェル等からAppleScriptを実行するためのコマンドです。詳しくは
$man osascript にて。

