USB-PS2 コントローラーのボタンデータ取得
実験の目的
- コントローラーのモジュールを呼び出せるようになります。2. コントローラーの各操作で返されるデータを読み取る方法を習得します。
機能要件
コントローラーの方向キーを押すと、シリアルポートから対応するメッセージが返されること。
ハードウェアの準備
ディスプレイ × 1、Bluetooth キーボード・マウス × 1、メインコンソール × 1、USB-PS2 コントローラー × 1(レシーバーと電池を含む)
回路接続
ハードウェアモジュール
ヒント:ハードウェアモジュールの使用説明
ハードウェアシステムの全体組立
電子モジュールの紹介
物理配線
USB ワイヤレスレシーバーをメインコントローラーに挿し込みます。

クイックスタート
回路接続が完了したら、ターミナルで次のように入力します:
- ターミナルからリモート接続します。ターミナルに次のコマンドを入力して Enter を押します
ssh sunrise@192.168.8.111
sunrise
パスワードを入力して Enter を押すとログインが完了します。
- 指定のディレクトリに移動してターミナルを開き、次のように入力します:
cd ~/Desktop/Arm_Experiment/module_control_servo
上記で開いたターミナルで次のように入力し、PS2 コントローラーのデータ取得プログラムを実行します:
python get_ps2_data.py
テスト時の操作コマンドは下図のとおりです。必要に応じて参照してください。

- プログラムの実行後、PS2 コントローラーのさまざまなキーを押して、ターミナルの出力結果を観察します。ターミナルには次のように出力されます
--------------------------------------------------------------------------------------
_ _ _ _______ _
| | | | (_) |__ __| | |
| | | |_ __ _ | | ___ _ __ __ _ ___| |__ _ _ __ _ _ __ __ _
| | | | '_ \| | | |/ _ \| '_ \ / _` |/ __| '_ \| | | |/ _` | '_ \ / _` |
| |__| | | | | | | | (_) | | | | (_| | (__| | | | |_| | (_| | | | | (_| |
\____/|_| |_|_| |_|\___/|_| |_|\__, |\___|_| |_|\__,_|\__,_|_| |_|\__, |
__/ | __/ |
|___/ |___/
--------------------------------------------------------------------------------------
---------------------
自定义字体初始化完成
---------------------
---------------------
PS2初始化完成
---------------------
---------------------------------------------------------------------------------------
PS2手柄平放俯视图
._______________________________________________________________________________________.
| L2: R2: |
| L1: R1: |
| |
| Up Y |
| | | |
|Left----+----Right X----+----B |
| | SELECT START | |
| Down A |
| MODE |
| (-32767) (-32767) |
| | | |
| | | |
| | | |
|(-32767)--------+-------> X(32767) (-32767)-------+--------> X方向(32767) |
| | | |
| | | |
| | | |
| v v |
| Y方向(32767) Y方向(32767) |
| |
| 左侧摇杆 右侧摇杆 |
|_______________________________________________________________________________________|
---------------------------------------------------------------------------------------
Left Shoulder:0 L2:0 Up:0 Down:0 Left:0 Right:0 Right Shoulder:0 R2:0 Y:0 A:0 X:0 B:0 Select:0 Start:0 Mode/Xbox:0 Left Thumb:0 Right Thumb:0 | LX: 0 LY: 0 RX: 0 RY: 0
Left Shoulder:0 L2:0 Up:0 Down:0 Left:0 Right:0 Right Shoulder:0 R2:0 Y:0 A:0 X:0 B:0 Select:0 Start:0 Mode/Xbox:0 Left Thumb:0 Right Thumb:0 | LX: 0 LY: 0 RX: 0 RY: 0
Left Shoulder:0 L2:0 Up:0 Down:0 Left:0 Right:0 Right Shoulder:0 R2:0 Y:0 A:0 X:0 B:0 Select:0 Start:0 Mode/Xbox:0 Left Thumb:0 Right Thumb:0 | LX: 0 LY: 0 RX: 0 RY: 0
Left Shoulder:0 L2:0 Up:0 Down:0 Left:0 Right:0 Right Shoulder:0 R2:0 Y:0 A:0 X:0 B:0 Select:0 Start:0 Mode/Xbox:0 Left Thumb:0 Right Thumb:0 | LX: 0 LY: 0 RX: 0 RY: 0
Left Shoulder:0 L2:0 Up:0 Down:0 Left:0 Right:0 Right Shoulder:0 R2:0 Y:0 A:0 X:0 B:0 Select:0 Start:0 Mode/Xbox:0 Left Thumb:0 Right Thumb:0 | LX: 0 LY: 0 RX: 0 RY: 0
実験結果
コントローラーの対応するキーを押すと、ターミナルに対応するデータが表示されることを確認できます。以下は左キーと L2 キーを押したときに表示されたデータです(緑色の文字を参照)。

ソフトウェア設計
ソースコードのダウンロード
(HumansX サポートより提供)
プログラムコード
コードの構成:
| コード | 機能 |
|---|---|
| get_ps2_data.py | USB-PS2 コントローラーモジュールのデータを取得するサンプルプログラム |
| custom_font.py | フォントと出力メッセージの設定 |
具体的なコード:
プロジェクトの完全なコードは(ソースコードのリンク)からダウンロードしてください。
"""
--------------------------------------------------------------------------------
功能:PS2手柄数据获取
日期:2025-06-06
--------------------------------------------------------------------------------
"""
import time
import queue
import inputs
import threading
from src.joy import joy_module
from src.arm_control import custom_font
# =======================================加载自定义字体
time.sleep(1)
font = custom_font.CustomFont()
print(font.color_text(font.compony_msg, color="cyan", bold=True))
print(font.color_text(font.font_load_success, color="green", bold=True))
# =======================================创建线程
arm_command_queue = queue.Queue(maxsize=1)
joystick_action_move = False
# =======================================监听器实例
gamepad = joy_module.GamepadListener(device_path='/dev/input/js0')
gamepad.start()
print(font.color_text(font.ps2_load_success, color="green", bold=True))
# 按钮高亮函数:按下=绿色,否则灰色
def format_button(name, pressed):
if pressed:
return font.color_text(f"{name}:1", color="green", bold=True)
else:
return font.color_text(f"{name}:0", color="bright_magenta")
# 维护四个摇杆状态
axis_states = {
'Left Stick X': 0.0,
'Left Stick Y': 0.0,
'Right Stick X': 0.0,
'Right Stick Y': 0.0
}
# 按键状态
button_states = {
'Left Shoulder': False,'L2': False,'Up': False,'Down': False,'Left': False,'Right': False,
'Right Shoulder': False,'R2': False,'Y': False,'A': False,'X': False,'B': False,
'Select': False,'Start': False,'Mode/Xbox': False,
'Left Thumb': False, # 左摇杆按下
'Right Thumb': False # 右摇杆按下
}
try:
print(font.color_text(font.ps2_module_commond, color="cyan", bold=True))
while True:
# 更新状态
events = gamepad.return_status(clear_queue=True)
for event in events:
if event['type'] == 'button':
button_states[event['name']] = bool(event['value'])
elif event['type'] == 'axis':
if event['name'] == 'D-pad X':
button_states['Left'] = (event['value'] == -32767)
button_states['Right'] = (event['value'] == 32767)
elif event['name'] == 'D-pad Y':
button_states['Up'] = (event['value'] == -32767)
button_states['Down'] = (event['value'] == 32767)
elif event['name'] == 'LT':
button_states['L2'] = (event['value'] == 32767)
elif event['name'] == 'RT':
button_states['R2'] = (event['value'] == 32767)
elif event['name'] in axis_states:
axis_states[event['name']] = event['value']
#获取四个摇杆值并对摇杆值也加颜色(示例:左右摇杆分别用黄色和青色)
left_x = font.color_text(f"LX:{axis_states['Left Stick X']:6.0f}", color="yellow")
left_y = font.color_text(f"LY:{axis_states['Left Stick Y']:6.0f}", color="yellow")
right_x = font.color_text(f"RX:{axis_states['Right Stick X']:6.0f}", color="cyan")
right_y = font.color_text(f"RY:{axis_states['Right Stick Y']:6.0f}", color="cyan")
#把按钮状态转成 0/1 并组合成一行字符串,构建带颜色的按钮字符串
buttons_str = " ".join([format_button(name, pressed) for name, pressed in button_states.items()])
# 打印所有按钮状态和摇杆值
print(f"{buttons_str} | {left_x} {left_y} {right_x} {right_y}")
time.sleep(0.05) # 稍微降低刷新频率,防止输出过快
except KeyboardInterrupt:
print("\n程序退出")
finally:
gamepad.stop()
インターフェースドキュメント
さらに詳しくは、以下の API インターフェースドキュメントを参照して二次開発や最適化を行うことができます。
ロボット本体インターフェースの全体紹介
お問い合わせ
資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。
ドキュメント