PS4コントローラのキーイベント取得(Raspberry Pi 3B + Bluetooth + ds4drv)

この記事では、Raspberry Pi 3 MODEL BとPS4コントローラ(以下では、「DS4」とします。)をBluetooth接続し、「Linux Input Subsystem」経由でキーイベントを取得する方法を紹介します。

取得したキーイベントを解析することで、押されたボタンの種類やボタンの状態(押された or 離された)を識別することができるため、以下のような方におススメの方法になります。

  • DS4で操作可能なゲーム・ロボット製作に興味がある方
  • 既存のパッケージを使用するのみで、PS4コントローラのキーイベントを取得できるようにしたい方
「Linux Input Subsystem」は、以下の記事で紹介している方法に従ってセットアップした「Raspbian」(Raspberry Pi上で動作するOS)に標準搭載されています。「Raspbian」に限らず「Linux Input Subsystem」が利用できるOS搭載マシンであれば、同様の方法でDS4のキーイベントが取得可能です。
関連記事

この記事では、Raspberry Piの購入後に実施する以下の2点について、書いています。 1. OS(Raspbian)インストール 2. 初期セットアップ この記事は以下のような方向けのものになります。 Raspberr[…]

raspberry-pi-initial-set-up
広告

1. 概要

Bluetooth接続したDS4のキーイベントを取得するには、「ds4drv」というpython実行環境で動作するドライバーを使用します。

「ds4drv」はOSSとしてGitHub上で公開されており、その概要は以下のREADMEで紹介されています。

ds4drvのREADME

2. 実行環境

  • 開発マシン: Raspberry Pi 3 MODEL B
  • OS: Raspbian Buster with desktop(Release date: 2019-09-26)
  • 接続機器: DS4(DUALSHOCK 4 CUH-ZCT2J)
  • プロトコル(Bluetooth接続): bluez
  • 設定ツール(Bluetooth接続): bluetoothctl

3. 事前準備

3-1. Bluetooth接続

この章では、Bluetooth機能を有効化し、DS4とペアリング、接続する手順を記載します。

Raspberry Pi 3 MODEL Bには、bluezのプロトコルを使用したBluetooth機能が標準搭載されています。他のマシンを使用する場合は、Bluetooth機能が利用可能かを事前に確認してください。

3-1-1. Bluetooth機能の有効化

bluetooth-function-power-on

  1. ターミナル上で「bluetoothctl」と入力し、設定ツールを起動する
  2. 設定ツールへのコマンド入力が求められたら、「power on」と入力する
  3. 「Changing power on succeeded」と出力されることを確認する

※この手順以降は、全て設定ツールに対するコマンド入力となります。

3-1-2. ペアリング

bluetooth-pairing-device

  1. 「scan on」と入力する
  2. DS4のペアリングモードで起動する(ライトバーが白く点滅し始めるまで、「PS」ボタンと「SHARE」ボタンを同時に長押しする)
  3. 「Device {MACアドレス} Wireless Controller」と出力されることを確認する
  4. 「pair {③で確認したMACアドレス}」と入力する
  5. 「Pairing successful」と出力されることを確認する

(DS4のペアリングモード時のライトバー)

ps4-controller-pairing-mode

3-1-3. 信頼できる機器として登録

bluetooth-trust-device

  1. 「trust {手順3-1-2の③で確認したMACアドレス}」と入力する
  2. 「Changing {手順3-1-2の③で確認したMACアドレス} trust succeeded」と出力されることを確認する

3-1-4. 接続テスト

bluetooth-connect-device

  1. DS4の電源を入れる
  2. 「Device {手順3-1-2の③で確認したMACアドレス} connected: yes」と出力されることを確認する

(DS4の接続時のライトバー)

connect-ps4-controller-image

DS4が他の機器とペアリングされている状態では、他の機器と自動的に接続される可能性があります。その場合は、事前にRaspberry Piと有線接続し、他の機器とのペアリングを解除した上でこの手順を実施してください。

3-2. ds4drv実行環境セットアップ

この章では、ds4drv実行環境のセットアップについて、説明します。

前述のとおり、ds4drvはpython実行環境で動作するドライバーのため、pythonインタプリタをインストールする必要があります。

その際に、pipも合わせてインストールしますが、これはds4drvがpipで取得可能なパッケージであるためです。

さらに、この章ではds4drvの動作確認用にjoystickパッケージをapt-getでインストールします。

3-2-1. 前準備(パッケージ情報の更新)

ターミナル上で以下のコマンドを実行します。

3-2-2. パッケージのインストール

ターミナル上で以下のコマンドを実行します。

(python3, pip)

(ds4drv)

(joystick)

4. Bluetooth接続 ~ キーイベント取得方法

4-1. Bluetooth接続

手順3-1と同じ手順で、Raspberry PiとDS4をBluetoth接続します。

4-2. ds4drv実行

手順4-1とは別のターミナルを起動し、以下のコマンドを実行します。

接続が成功すると、ターミナルに「[info][controller 1] Connected to Bluetooth Controller ({MACアドレス} hidraw*)」と出力されます。
実行時に「–hidraw」オプションを指定することで、ペアリングされている機器との接続を明示することが可能です。このオプションを指定せずとも、接続は可能ですが、接続候補が複数存在する場合や電源不足の際に接続安定しない問題を確認しています。

4-3. キーイベント取得(確認)

「Linux Input Subsystem」経由で取得されたキーイベントは、「/dev/input/js[0-9]+」に書き込まれます。

取得したキーイベントは、以下のコマンドで確認することができます。

(DS4以外の入力デバイスを接続していない場合 -> js0)

(出力例 -> 8 axes + 13 bottons)

run-jstest-with-ps4-controller

「js[0-9]+」の「[0-9]+」は、接続されている入力デバイスの個数に依存します。出力結果が想定外(ボタン数が少ない等)の場合は、「[0-9]+」の数字を変えて、「jtest」を再実行してください。DS4以外の入力デバイスを接続していない状態でも、リモートデスクトップ使用環境ではマウスのキーイベントが「js0」に割り当てられている可能性があります。
広告

5. 参考記事

pythonライブラリ「Pygame」でDS4のキーインベントを解析する方法を、以下の記事で紹介しています。

関連記事

この記事では、「Raspberry Pi 3 MODEL B」とpythonライブラリ「PyGame」を使用して作成した、PS4コントローラ(以下、「DS4」とします)のボタン入力を解釈するアプリケーションを紹介します。 [outli[…]

connect-ps4-controller-image

以下の記事では赤外線リモコンの信号を受信し、押されたボタンを識別する方法を紹介しています。DS4のコントローラの代替とすることも可能ですので、興味のある方はこちらもご覧ください。

関連記事

「Raspberry Pi」はLinuxOS相当のOS上でブラウザ操作やプログラミングが直接可能でありながら、汎用入出力(GPIO)ピンを標準搭載しているため「センサー系」「駆動系」との接続、制御が容易に可能なコンピュータです。 こち[…]

広告