ESP32を使って、PS4コントローラとBluetooth接続する:ライブラリ修正編 その1
はじめに
以前の記事で、ESP32とPS4コントローラのBluetooth接続をしました。コンパイルエラーが多発して結構苦労しました。
ライブラリに問題があって、そのままだとコンパイルエラーが出てしまうので、海外の方の動画を参考にライブラリに手を加えてエラーを回避していました。GitHub上では、エラーの修正を求めるリクエストがされていますが、一年ほど更新されていません。
そこで、今回はオリジナルのリポジトリからフォークして、ライブラリに修正を加えました。初GitHubです。このライブラリなら以前のように手を加えなくても使えると思います。新たなエラーが出てくるかもしれませんが…
▼修正を加えたライブラリ
https://github.com/404background/PS4-esp32
▼以前の記事はこちら
すでにインクルードしたライブラリを削除する
PS4-esp32-masterのライブラリをまだインクルードしたことがない方は大丈夫なのですが、すでにインクルードした方で新しくライブラリをインクルードしたい場合は、既存のものを削除する必要があります。
環境によってはファイルの場所が違う可能性がありますが、標準ではPC→ユーザー→ユーザー名→ドキュメント→Arduino→librariesにPS4-esp32-masterが入っていると思います。これを消去すれば削除できます。
▼Arduino IDEの環境設定の画面。コンパイル時の警告表示を多くしておくと、どこのファイルを参照しているのかなどが表示されるので、デバッグに便利です。

修正箇所一つ目
前回の記事に載せていた、海外の方のコンパイルエラーを回避する方法をもとに、修正を加えました。ps4_spp.cファイルの修正です。
※Arduino IDEのボードマネージャーにおける、ESP32のバージョンによってはエラーがでる可能性があります。現在調査中です。動作を確認しているのはバージョン1.0.6です。
▼こちらの動画でコンパイルエラーを回避する方法が紹介されています。
▼エラーの一部を引用するとこんな感じです。esp_bt_gap関連のものでエラーが出ます。
PS4-esp32-master\src\ps4_spp.c:87:30: error: 'ESP_BT_CONNECTABLE' undeclared (first use in this function)
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_NON_DISCOVERABLE);
▼ps4_spp.cの86~90行目です。ここを修正しました。
#if CONFIG_IDF_COMPATIBILITY >= IDF_COMPATIBILITY_MASTER_D9CE0BB
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_NON_DISCOVERABLE);
#elif CONFIG_IDF_COMPATIBILITY >= IDF_COMPATIBILITY_MASTER_21AF1D7
esp_bt_gap_set_scan_mode(ESP_BT_SCAN_MODE_CONNECTABLE);
#endif
▼修正したものがこちら
//#if CONFIG_IDF_COMPATIBILITY >= IDF_COMPATIBILITY_MASTER_D9CE0BB
// esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_NON_DISCOVERABLE);
//#elif CONFIG_IDF_COMPATIBILITY >= IDF_COMPATIBILITY_MASTER_21AF1D7
esp_bt_gap_set_scan_mode(ESP_BT_SCAN_MODE_CONNECTABLE);
//#endif
修正箇所二つ目
二つ目は、過去に使われていたPS4コントローラのプログラムをダウンロードして、コンパイルしたときに出たエラーです。これまで出ていなかったエラーなのですが、急に出てきました。うまくすり抜けていたのかもしれません。
▼エラーを抜粋したものがこちら
PS4Controller.cpp:47:61: error: format '%x' expects argument of type 'unsigned int*', but argument 3 has type 'uint8_t* {aka unsigned char*}' [-Werror=format=]
if (sscanf(mac, ESP_BD_ADDR_STR, ESP_BD_ADDR_HEX_PTR(addr)) != ESP_BD_ADDR_LEN) {
▼PS4Controller.cppファイルのフォーマットにエラーがあるとのことなのですが、GitHubのIssuesでも同じような指摘がされていました。
指摘していた方は、このライブラリのベースとなっているesp32-ps3からコードをコピーしてきたと言っています。
▼その一部がこちら
if (sscanf(mac, ESP_BD_ADDR_HEX_STR, ESP_BD_ADDR_HEX_PTR(addr)) != ESP_BD_ADDR_LEN){ log_e("Could not convert %s\n to a MAC address", mac); return false; }
エラー部分と比較すると、ESP_BD_ADDR_STRではなくESP_BD_ADDR_HEX_STRになっています。つまりここが16進数でないため問題がおきているのではないかと考えて、ESP_BD_ADDR_HEX_STRに変更して、以下の定義を追加しています。これでうまくいきました。
▼PS4Controller.cppに追加した定義
#define ESP_BD_ADDR_HEX_STR "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"
サンプルの追加
エラーの修正に加えて、使いやすいサンプルを追加しました。
- GetBluetoothMacAddress
ESP32のMACアドレスを取得するためのプログラムです。プログラムを書き込んで、シリアルモニターで見ることができます。
▼オリジナルはこちら
https://github.com/un0038998/PS4Controller_ESP32
- bt_remove_paired_devices
ESP32のサンプルスケッチとしてArduino IDEに追加されるプログラムです。前回の記事にも寄せられていたのですが、ESP32とPS4コントローラを複数個接続すると、プログラムの書き込みはできるものの接続できないことがあります。
PS4コントローラは接続中にライトが点滅して、接続できたらライトがついたままになるのですが、一瞬接続できたのに切れるという症状がみられました。
同じような状況になったら、このプログラムで登録しているデバイスを削除してみてください。
▼18行目のREMOVE_BONDED_DEVICESの値を0から1に変更すると削除できます。
#define REMOVE_BONDED_DEVICES 0 // <- Set to 0 to view all bonded devices addresses, set to 1 to remove
最後に
今回はこれまで使っていたPS4-esp32ライブラリの修正をしましたが、知らないだけでそもそも問題ないライブラリが既に存在しているんじゃないかなと思っています。オリジナルのライブラリはフォークしているリポジトリが現時点で66個もあって、その中にあるかもしれません。
また、今回修正したライブラリでエラーが起きたようであれば、GitHubでもコメント欄でもいいので、報告していただけると助かります。GitHubを使うのは今回が初めてなので、対応が遅れるかもしれませんが、慣れていこうと思います。
接続できたという報告でもありがたいです。よろしくお願いします。
“ESP32を使って、PS4コントローラとBluetooth接続する:ライブラリ修正編 その1” に対して1件のコメントがあります。