Pythonでゲームパッドを操作して、ラズパイを操作しよう。挑戦編

ラズパイことraspberry piは電源ボタンを切るボタンなどがないから、余っているゲームパッドでマシンを操作できるようにしたい。

それを実現する言語のチョイスだが、簡単かつ軽量にそしてLinuxと親和性が高いということでPythonを使って見ようと思う。

Pythonは実際あまりつかったことが無いため、勉強も兼ねてやってみる。

今回はまだraspberry piでは動作確認をしていない。
まずはゲームパッドのイベントを拾って何か動作ができるようにするまでをしようと思う。

ちなみに、開発したディストロはArch Linux
Pythonは2.7を使用。

Archはさすが最新ということでpythonは3.3がデフォルトのようだけれども、
枯れたほうが初心者にも壁が低そうだから2.7にしてみた。

ゲームパッドを操作

ゲームパッドを操作するのはpygameというライブラリを使って見るとできるらしい。

Arch Linuxだとpacman(archのパッケージ管理 apt-getみたいなの)でpygameがインストールできるみたいだ。
オフィシャルページに書いてあった。

Joystickの入力を取得する – 強火で進め

そしてこのブログでジョイスティックのイベントを拾う方法が書いてあったので、僕もそれをほぼコピペして作ってみた。


import pygame
from pygame.locals import *
import time

def main() :
    pygame.init()

    while True:

        eventlist = pygame.event.get()

        eventlist = filter(lambda e : e.type == pygame.locals.JOYBUTTONDOWN , eventlist)

        print map(lambda x : x.button,eventlist)

        time.sleep(0.1)

if __name__ == '__main__':
    pygame.joystick.init()
    try:
        joys = pygame.joystick.Joystick(0)
        joys.init()
        main()
    except pygame.error:
        print 'ジョイスティックを差し込め'

参考にしたブログの方はfor文で書いていたけれど、せっかくのpythonなので
lambda式を練習してみることにした。
event.getっていうので何かのクラスらしきもののリストを取得できるので、mapを使ってbuttonというものの値だけのリストにしてみた。
filterではボタンを押した場合のイベントのみを抽出している。(ほかにも話したとか押しっぱなしとかいろいろあるんだろう)

sleepをしないとCPUが過労死しちゃうから、適切にsleepさせてみた。

これで、適当なボタンを押すとprintされるリストに番号が表示される。

その番号が押したボタンに割り当てられている番号ということだ。

同時押しをしたらリスト内に同時に押された番号がリストに表示されるし、極めて早く連打をすると同じ番号がリストに入るらしい。

BボタンとAボタンを同時押ししたら何かのイベントを発動

簡単にBとAでボタンを発動させよう。
先ほどのプログラムでBが2 Aが3だとわかったので、それを使ってみる。

とはいってもどのボタンがBとかAとか製品によって違うだろうから、お好きなボタンの番号をさっきのプログラムで調べてほしい。

import pygame
from pygame.locals import *
import time

def main() :
    pygame.init()

    while True:

        eventlist = pygame.event.get()

        eventlist = filter(lambda e : e.type == pygame.locals.JOYBUTTONDOWN , eventlist)

        eventlist = map(lambda x : x.button,eventlist)

        if 2 in eventlist and 3 in eventlist :
            print "何かのイベント発動"

        time.sleep(0.1)

if __name__ == '__main__':
    pygame.joystick.init()
    try:
        joys = pygame.joystick.Joystick(0)
        joys.init()
        main()
    except pygame.error:
        print 'ジョイスティックを差し込め'

 

これは、リストに2と3が含まれているかどうかを判定している。
だからYも一緒に押されている場合もイベント発動することになる。

で、「何かのイベント発動」と書かれたところになにかやらせたいことを書いておけばきっとうまく行くだろう。

このプログラムは随時動いていなければならないので、こんどはpythonのプログラムをデーモン化させて
OS起動時に上がってくるようにしてみよう。

スポンサードリンク

関連コンテンツ