Programming Tips blog

テキトーにTIPSを紹介します

ラズパイ + Python + PySDL2でPlayStation3ゲームコントローラ(DualShock3)のインデックスをチェックする(ゲームコントローラクラス版)

はじめに

 DualShock3(PlayStationゲームコントローラ)について、どのキーに何番が振られているのか、調べます。
 ここではPySDL2のゲームコントローラクラスを利用しています。

環境

ソフトウェア

F310r設定

 F310rは裏のスイッチを「X」(X input)にします。
 また、表の「MODE」は消灯にします。

PIPインストール

apt install -y python3-pip

PySDL2インストール

pip3 install -U --break-system-packages PySDL2

pysdl2-dllインストール

pip3 install -U --break-system-packages pysdl2-dll

ソースコード

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

##########
# インポート
##########

import ctypes
import time
from sdl2 import *


##########
# クラス
##########

# ゲームコントローラクラス
class GameController:
	def __init__(self):
		SDL_Init(SDL_INIT_GAMECONTROLLER)
		self.axis = {}
		self.button = {}
	
	def update(self):
		event = SDL_Event()
		while SDL_PollEvent(ctypes.byref(event)) != 0:
			if event.type == SDL_CONTROLLERDEVICEADDED:
				self.device = SDL_GameControllerOpen(event.cdevice.which)
			elif event.type == SDL_CONTROLLERAXISMOTION:
				self.axis[event.caxis.axis] = event.caxis.value
			elif event.type == SDL_CONTROLLERBUTTONDOWN:
				self.button[event.cbutton.button] = True
			elif event.type == SDL_CONTROLLERBUTTONUP:
				self.button[event.cbutton.button] = False
			else:
				print("BUTTON No:" + str(event.cbutton.button))
				print("EVENT TYPE:" + str(event.type))


# メイン関数
def main():
	gamecontroller = GameController()
	while True:
		gamecontroller.update()
		time.sleep(0.1)
		print(gamecontroller.axis)
		print(gamecontroller.button)
		print(SDL_GameControllerName(gamecontroller.device))
		print(SDL_GameControllerMapping(gamecontroller.device))
		print(SDL_CONTROLLER_BUTTON_MAX)
		print(SDL_CONTROLLER_AXIS_MAX)
		print("-----")
	return


# メイン関数
# 備考:main()に投げるだけ
if __name__ == "__main__":
	main()

hid.ignore_special_drivers=1

 下記を/boot/firmware/cmdline.txtに追記する必要があります。

hid.ignore_special_drivers=1

中華製のDual Shock3

 中華製のDual Shock3は、買うたびにLinuxが認識したり、認識しなかったりとまちまちなので使わない方がいいです。

 ランキングに参加しています。下記バナーをクリックしていただけるとありがたいです。