【Raspberry Pi】ラズパイとxboxコントローラでLEDのLチカをさせてみる

はじめに

こんにちは、がんがんです。
前回の記事でxboxコントローラをRaspberry Piに接続することに成功しました。
gangannikki.hatenadiary.jp


今回はボタン入力の確認としてLチカをさせていこうと思います。

目的

  • xboxコントローラ(無線)を使ってLEDのLチカ
  • gpiozeroライブラリを使ってみる

環境

  • Raspbery Pi 3 Model B+
  • xboxコントローラ(bluetooth接続)
  • LED × 4つ

参考

PS3でLチカ記事ですが参考にしました。
qiita.com

gpiozeroについて
gpiozero

準備段階:gpiozeroでLチカさせてみる

今まではRPi.GPIOを使用していましたが、gpiozeroの方が楽そうだったのでこちらでGPIO操作を行ってみます。
gpiozeroのライブラリではGPIO.setup()の設定もなく、楽だなって印象です。

from gpiozero import LED
from time import sleep

led = LED(4)

for i in range(0, 10):
  print("HIGH")
  led.on()
  sleep(1)
  print("LOW")
  led.off()
  sleep(1)

実験1:コントローラの入力値の確認

まずはjstestを用いて入力の確認を行います。以下の表にまとめておきます。

ボタン 対応num ボタン 対応num
A 0 Axis0 左スティックx
B 1 Axis1 左スティックy
X 2 Axis2 LT
Y 3 Axis3 右スティックx
LB 4 Axis4 右スティックy
RB 5 Axis5 RT
ビュー 6 Axis6 十字の左右
メニュー 7 Axis7 十字の上下

実験2:Lチカさせてみる

xboxコントローラの入力に合わせてLチカを行わせます。1つのLEDだとつまらないので、4つのLEDをLチカさせます。

動作仕様

  • A:LED緑、B:LED赤、X:LED黄、Y:LED白をそれぞれ点灯させる
  • 押していない時はそれぞれ消灯する
  • LBボタンを入力すると、イルミネーション(4つのLEDが交互に点灯する)がスタートする
  • RBボタンを入力すると、プログラムが終了する
  • コントローラの接続を切ったら再起動

コード

from gpiozero import LED
from time import sleep
import struct
import subprocess

device_path = "/dev/input/js0"
EVENT_FORMAT = "LhBB";
EVENT_SIZE = struct.calcsize(EVENT_FORMAT)

#  LEDのセットアップ
led_red = LED(4)
led_green = LED(17)
led_yellow = LED(27)
led_white = LED(22)

def main():
    try:
        with open(device_path, "rb") as device:
            event = device.read(EVENT_SIZE)
            while event:
                (xbox_time, xbox_val, xbox_type, xbox_num) = struct.unpack(EVENT_FORMAT, event)
                if xbox_type == 1:
                    #  LEDの点灯フェーズ
                    #  Aボタンの入力
                    if xbox_num == 0:
                        sw1 = False if xbox_val == 0 else True
                        if sw1: led_green.on()
                        else: led_green.off()
                    #  Bボタンの入力
                    if xbox_num == 1:
                        sw2 = False if xbox_val == 0 else True
                        if sw2: led_red.on()
                        else: led_red.off()
                    #  Xボタンの入力
                    if xbox_num == 2:
                        sw3 = False if xbox_val == 0 else True
                        if sw3: led_yellow.on()
                        else: led_yellow.off()
                    #  Yボタンの入力
                    if xbox_num == 3:
                        sw4 = False if xbox_val == 0 else True
                        if sw4: led_white.on()
                        else: led_white.off()                    

                    #  ランダムフェーズ
                    if xbox_num == 4:
                        print("ランダムスタート!")
                        subprocess.run(["python3", "./Document/led_multi.py"])
                
                    #  終了フェーズ
                    if xbox_num == 5: break

                print( "{0}, {1}, {2}, {3}".format(xbox_time, xbox_val, xbox_type, xbox_num) )
                event = device.read(EVENT_SIZE)
    except IOError:
        print("再起動")
        subprocess.run(["sudo", "reboot"])
    finally:
        pass

if __name__ == "__main__":
    main()

まとめ

今回はxboxコントローラを使ってRaspberry PiのGPIOを操作していきました。
負けっぱなしは悔しいので、PS3コントローラの方も頑張って繋がるようにしていきます。

次はRaspberry Pi Mouseのモータをコントローラから操作していきます。