【Raspberry Pi】Raspberry Piにxboxコントローラを繋いでみました

はじめに

こんにちは、がんがんです。
最近はRaspberry Pi Mouseの実験を行っています。
PS3コントローラをBluetooth接続してラズパイマウスを動かそうと試みたのですが、Bluetoothのペアリングがなかなかうまくいきませんでした…。
そのため、まずは有線のxboxコントローラをつないでみて動くかどうかを確認していこうと思います。

目的

環境

有線で接続してみる

とりあえず、試しに有線接続してlsusbコマンドを実行してみます。
無事に接続されていればxboxが表示されると思います。

$ lsusb

pygameを用いてgamepadの入力コマンド確認

日経BPの雑誌を参考にしてxboxの入力を確認してみます。コードは以下の通りです。
ボタンの総数やアナログスティックの入力を表示させるというものです。動作確認としては便利ですね。

import pygame

BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
WIDTH = 320
HEIGHT = 240

def main():
    pygame.init()
    surface = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.joystick.init()
    print("get_count: {}".format(str(pygame.joystick.get_count())))

    joystick_id = 0
    joystick = pygame.joystick.Joystick(joystick_id)
    joystick.init()
    print("get_name: {}".format(joystick.get_name()))
    print("get_numaxes: {}".format(str(joystick.get_numaxes())))
    print("get_numbuttons: {}".format(str(joystick.get_numbuttons())))
    print("get_numhats: {}".format(str(joystick.get_numhats())))

    myfont = pygame.font.Font(None, 30)
    myclock = pygame.time.Clock()
    endflag = 0

    while endflag==0:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: endflag=1

        ax = joystick.get_axis( 0 )
        surface.fill(WHITE)
        bitmaptext = myfont.render("axis: {}".format(str(ax)), True, BLACK)
        surface.blit(bitmaptext, (50, 100))
        pygame.display.update()
        myclock.tick(60)
    
    pygame.quit()

if __name__ == "__main__":
    main()

無線でも繋いでみる

次は無線での接続を試みてみます。まずはドライバをインストールし、再起動します。

$ sudo apt-get install xboxdrv joystick

次に、bluetoothctlコマンドを用いてペアリングを行います。

$ sudo bluetoothctl

xboxコントローラの接続ボタン(コントローラの説明書参照)を3秒以上長押ししてペアリングモードにします(点滅の速度が変化)。そして、ラズパイのBluetoothアイコンよりAdd Deviceを選択するとDevice名がターミナル上に表示されます。


Xbox Wireles Controllerと表示されていればRaspberry Piがコントローラを認識していることが分かります。先ほど開いたBluetoothアイコンよりXbox Wireless Controllerを選択し、Pairを選択します。
しばらくすると、Connected successfullyと表示されたら完了です。

動作確認(ターミナルより)

動作確認は以下のコマンドで行えます。

$ jstest /dev/input/js0

ボタンの入力に合わせて入力が遷移していくのが分かります。

動作確認(GUI画面より)

設定Add/Remove Software[joystick]の検索joystick testing and configuration toolにチェックOKをクリックの手順を踏み、jstest-gtkをインストールします。

起動画面はこんな感じです。コントローラの入力が可視化して分かりますし、キャリブレーションも出来るためすごく便利ですね。
f:id:gangannikki:20190809172107p:plain

まとめ

今回はRaspberry PiXboxコントローラを有線・無線接続してみました。これでRaspberry pi Mouseを動かすための準備ができました。次は、コントローラの入力に合わせたモータ制御をさせていきます。

また、現在失敗中のラズパイ×PS3コントローラも引き続き解決していきます。