Node-REDのノードを開発してみる その4(dualshock4ノード)
はじめに
今回はNode-REDと、PS4のコントローラであるDUALSHOCK 4で通信できる、dualshock4ノードを開発してみました。
2年ほど前からESP32とDUALSHOCK 4で通信して、ロボットを操作していました。Node-REDとも通信できるようにすると、さらにできることが増えるのではないかと思っています。
▼今回開発したノードは、Node-REDのフローライブラリに公開しています。
https://flows.nodered.org/node/@background404/node-red-contrib-python-dualshock4
▼以前の記事はこちら
実装の方針
以前の記事にて、Pythonのpygameを利用してDUALSHOCK 4と通信していました。今回もpygameを利用します。
▼PythonによるDUALSHOCK 4との通信については、以下の記事をご覧ください。
python-venvノードと同様に、ノードのインストール時にPythonの仮想環境を作成します。このときに、pygameもpipでインストールします。
▼python-venvノードについては、開発の変遷とともにノードの仕組みをQiitaに書きました。
https://qiita.com/background/items/d2e05e8d85427761a609
venvノードを利用して通信していたときは、各入力のプロパティ毎に値を引き出していました。
▼ノードが大量に必要です。
必要なノードを減らすために、コントローラの入力ごとに出力が分かれるようにします。どのピンがどの入力に対応しているのか分かりやすいように、マウスをホバーすると出力ピンの説明が表示されるラベルも使用します。
▼例えばexecノードでは、stdoutやstderrと表示されます。
実際に実装していると、必要な入力だけ出力ピンとして出せるようにしたかったのですが、ラベルは動的に割り当てられないようでした。
▼ノードの開発に関するページでは、ラベルが動的に生成されないという記述がありました。
https://nodered.jp/docs/creating-nodes/appearance
複数の出力ピンを持ったノードと、出力が一つだけのノードに分けて実装することにしました。
ノードを開発する
ChatGPTに相談しながら開発していたのですが、Node-REDのノードの開発についてはあまり詳しくないような雰囲気があります。情報が少ないのでしょうね。
▼以下のノードの開発に関するドキュメントを参照して開発しています。
https://nodered.jp/docs/creating-nodes
▼コードはGitHubのリポジトリをご覧ください。
https://github.com/404background/node-red-contrib-python-dualshock4
出力が一つだけのノードを開発しました。
▼以下のように使えます。
▼受信したデータを見ると、コントローラの入力ごとにプロパティが分かれています。
▼例えばL3とR3だけ選んだ状態だと、その値だけ出力されます。
出力ピンごとに入力が分かれているノードも開発しました。
▼以下のようにダッシュボード関連のノードを直接接続できます。
▼マウスをホバーさせると、ボタンの名前が表示されます。
▼こちらは取得周期だけ設定できます。
動作を確認してみる
実際にダッシュボード画面を見ながら動作を確認してみました。
▼反応も速そうでいい感じです。
▼通信できました。
最後に
DUALSHOCK 4と通信できるノードが意外と無かったのですが、python-venvノードでの経験を活かして開発することができました。
作っている途中に気づいたのですが、Node.jsでもDUALSHOCK 4と通信できるようです。こちらだとPythonの手順を省いて使えそうですね。
▼npmでdualshockと調べたら、パッケージがありました。
https://www.npmjs.com/package/dualshock-controller
▼Node-REDのfunctionノードで通信するフローのサンプルもありました。これも試してみたいところです。
https://flows.nodered.org/flow/8d8e3e3e20bf2e70dee0bcf1b2a2b31a