この記事は、
M5Stack Cardputer
を、小型のBLEキーボードにしてしまうまでを書いたものです。正しくはV1.1ではなくて初代を使っているのですが、きっと動くんじゃないかと思います。ぜひスマホのキーボードにどうぞ!
お急ぎの方は、最後にplatformio.iniを張っておきますので、そちらをまるっと使ってください。
作ってみたものは、
M5PuterKey
です。
開発環境
- macOS 15.5
- PlatformIO
- Arduino framework
依存するライブラリなど
- M5CardPuter
- M5Unified
- ESP32 BLE Keyboard
- NimBLE-Arduino
基本的にはこの4つのライブラリを導入できれば動くはずです。が、そう簡単ではなかったので、順番に解説していきましょう。
そもそもBlueTooth接続ができない?
一見接続できるのですが、接続が失われると再接続できません。実際にデータをやり取りできていないので、本当に接続できていたのかどうか、ちゃんと検証していません。
調べてみると、どうやらNimBLEというものを使う必要があるとのこと。ということで、NimBLEライブラリを単体で動かしてみました。どうやらちゃんと動くようです。
ところが、キーボードライブラリと同時に使うとコンパイルが通りません。NimBLEライブラリが大幅に変更されているようで、まだこちらに追いついていない模様。
ということで、ライブラリのバージョンを1.4.3に固定します。これであっさりBLEキーボードとしては動くようになりました。
Cardputerライブラリとの問題
次はCardPuterライブラリを組み込んで、本体のキーが押されたらそれっぽいコードをBLE送信するテストを行います。
一見順調に見えていたのですが、KEY_BACKSPACEを送信するとなぜか*
が送信されてしまいます。
追ってみると、BLE KeyboardライブラリとCardputerライブラリの中に同じ文字列で違う数値のコードを発見しました。前者はconst uint8_tで後者は#defineです。どちらも定数で宣言されていればコンパイルエラーになって気がついたのでしょうが、#defineで単純に文字列置換されちゃったので気が付きませんでした。
ということで、Cardputerのライブラリ側を修正します。まず、
.pio/libdeps/m5stack-stamps3/M5Cardputer/src/utility/Keyboard_def.h
にある、#defineの定数っぽいものを全部const uint8_tにしちゃいます。これで衝突すればエラーになるはずです。
…、というか確実にエラーになるので、このキー定義を丸ごとm5ネームスペースに放り込んじゃいます。
.pio/libdeps/m5stack-stamps3/M5Cardputer/src/utility/Keyboard.h
を読むと、Keyboard_def.hをインクルードしている場所があります。これを、
namespace m5 {
の後に移動させます。
当然、これだとKeyboard.cppのコンパイルが通らなくなります。ということで、
.pio/libdeps/m5stack-stamps3/M5Cardputer/src/utility/Keyboard.cpp
に、
using namespace m5;
を追加します。関数定義が始まる直前に追加する必要があります。
注意点
Cardputerライブラリ内のキー定義をプログラム中で参照するときは、
m5::KEY_ENTER
のように、m5プレフィックスを付けて参照する必要があります。…、というかそうすることで名前の衝突を避けるようにしたのですから。
サンプルのplatform.ini
ということで、上記の修正をしたものをGitHubに置きました。これを使ってビルドするサンプルを書いておきます。
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
;board_build.f_cpu = 80000000L
framework = arduino
build_flags =
-DARDUINO_USB_CDC_ON_BOOT=1
-DUSE_NIMBLE
lib_deps =
m5stack/M5Unified@^0.2.5
t-vk/ESP32 BLE Keyboard@^0.3.2
https://github.com/ji6czd/M5Cardputer
h2zero/NimBLE-Arduino@^1.4.3
monitor_speed = 115200
識者の方にお願い
とりあえずこれで目的は達成していて、編集も必要最低限だとは思うのですが、「いやいやこうするべきなんじゃない?」とかありましたらコメントくださるとうれしいです。追ってPRを出そうかと思っています。
Happy Hacking!