【Raspberry Pi】ラズパイとxboxコントローラでLEDのLチカをさせてみる
はじめに
こんにちは、がんがんです。
前回の記事でxboxコントローラをRaspberry Piに接続することに成功しました。
gangannikki.hatenadiary.jp
今回はボタン入力の確認としてLチカをさせていこうと思います。
目的
- xboxコントローラ(無線)を使ってLEDのLチカ
- 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のモータをコントローラから操作していきます。