Macbook タグの一覧です(1 件)

MacBookのモーションセンサーでテトリスをやってみた

昨年の11月にLet’s Note W5からMacBookにチェンジした時に、最後までMacBookとThinkpadどちらにするか悩んだのですが、Thinkpadいいなあと思ってたのはこちらの記事を以前から読んでいたから。
もちろんMacBookにも緊急モーションセンサーがあるのは知っていて、購入した時から、いつかモーションセンサーを使って何かやってみようと思っていました。で、ようやくやってみたのがこの動画です(ちょっと見難いです><)。




このblogで数回ネタとして書いていますが、このところPythonが楽しくて、今回もぜひPythonでやろうと思い、緊急モーションセンサーの挙動をPythonで取得するものを捜してたら次のサイトにたどり着きました。

MacBookの緊急モーションセンサーの情報を取得するにはAMSTrackerを使用します。インストール等については上記マイコミジャーナルのサイトをご確認下さい。AMSTrackerを次のように実行すると

AMSTracker -u 0.5

このように3つの数字が表示されます。一番左の数字が左右、真ん中の数字が垂直、右の数字が前後と、それぞれの動きを表示しています。MacBookを動かすと、それぞれの数字が動くことがわかります(終了する場合はControl-C)。
amstracker_01

また、次のように -s を付けて実行すると

AMSTracker -u 0.5 -s

0.5秒毎に数値が出力されます(終了する場合はControl-C)。
amstracker_02

この数値をPythonスクリプトで読み取り、AppleScript経由でキーストロークをコントロールしています。

AMSTracker -u 0.3 -s | python  tilt_control_osx.py

このように実行してから、ここにあるフラッシュ版テトリスを操作しています。終了はターミナル上でControl-Cを押します。
作成したコードは、へっぽこですが一応掲載させていただきます(スクリプトは何度も実行して成功しているものですが、実施は自己責任でお願いします)。
実際に実行する場合、気を付けていただきたいことは

  • AMSTracker のセンサー値の取得間隔は0.3秒にしていますが、うまくいかないようでしたら、0.1〜0.5くらいで調整してみて下さい。
  • THRESHOLD(しきい値)の数値30は私の経験に基づく数値で、それ以下にして実行すると敏感になりすぎてMacBookをコントロール出来なくなる可能性があります。
  • DOWNキーはMacBookを手前に引く(AMSTrackerの3番目の数値がプラス値になる)のですが、時々高いマイナス値が出ます。それによってDOWNコントロールをするつもりで逆にUPする場合があります。
  • コードにdebug用キーストロークをコメントアウトしてあります。そちらの挙動をターミナル上で確認してから実行するとわかりやすいかもです。

Geekな方々には、いまさら感のあるネタかもしれませんが、自分でもなんとか出来たのでうれしいです。コードに関してはもっとうまく書けると思うので、もう少し考えてみようと思います。

# coding: utf-8
# thanks Matt Webb: http://interconnected.org/home/2005/03/04/apples_powerbook
# thanks Naoki Tomita: http://e8y.net/blog/2006/10/26/p135.html
# Download AMSTracker from http://www.osxbook.com/software/sms/amstracker/
# Put AMSTracker and tilt_control_osx.py in the same directory. Go to this directory 
# in the Terminal and type:
# ./AMSTracker -u 0.3 -s | python tilt_control_osx.py
# Hit ctrl-c to exit.

THRESHOLD = 30 # lower numbers makes this more sensitive
X_AXCIS = 0 # three dimensions: sideways: 0, vertical: 1, forward/back: 2
Y_AXCIS = 2 # three dimensions: sideways: 0, vertical: 1, forward/back: 2

import sys, os

def run_command(command):
    script = os.popen('osascript', "w")
    script.write('tell application "System Events"\r\n')
    script.write('%s\r\n' % command)
    script.write('end tell\r\n')
    script.close()

while 1:
    try:
        line = sys.stdin.readline()
        x, y = int(line.split()[X_AXCIS]), int(line.split()[Y_AXCIS])
        if abs(x) > THRESHOLD or abs(y) > THRESHOLD:
            if x > 0 and abs(x) > abs(y):
                run_command('keystroke(ASCII character 28)') # move left
                #run_command('keystroke "l"')
            elif x < 0 and abs(x) > abs(y):
                run_command('keystroke(ASCII character 29)') # move right
                #run_command('keystroke "r"')
            elif y > 0 and abs(y) > abs(x):
                #run_command('keystroke "d"')
                run_command('keystroke(ASCII character 31)') # move down
            elif y < 0 and abs(y) > abs(x):
                #run_command('keystroke "u"')
                run_command('keystroke(ASCII character 30)') # move up
    except KeyboardInterrupt:
        sys.exit(0)
    except:
        pass

その他参考させていただいたサイト


PAGE TOP