M5AtomでBLEマウスっぽいものを作った
唐突なんですが、右手の親指を動かすとめちゃめちゃ痛むようになり、リモートワークで使っているLenovoキーボードの左ボタンが押せなくなりました。
休日と業務時間外は私物のmacなので全く困らないのですが、これでは仕事ができないので、急遽マウスの左ボタンだけを別で使う機能が必要になりました。
手元にあった使えそうなもの
残念ながらUSBデバイスとして使えるものArduino Pro MicroやArduino Leonardoを持っていない。
ESP32でBLEマウスを作れると言う情報はいくつかあったので、手近なところでM5Atomを選部ことに。
最終的にできたもの
- BLEでPCと接続して、以下の動作をするもの
- M5Atom Liteのボタンを押すと左クリック
- M5Atom Liteのボタンを押すと左ボタン長押し
※ダブルクリックのことは頭になかったけど、使ってみたら無くても困らなかったので除外した。
コード
限定用途なのでたいしたものではないですが、ライブラリ「ESP32-BLE-Mouse」を使うとこんなあっさりしたコードでPCと接続できると言うのは結構衝撃でした。
姉妹品?にESP32-BLE-Keyboardというのもあるので、それぞれサンプルをチェックしていただければ使いどころはイメージできるのではと思います。
#include "M5Atom.h" #includeBleMouse bleMouse; void setup() { M5.begin(true, false, true); Serial.begin(115200); Serial.println("Starting BLE work!"); bleMouse.begin(); M5.dis.drawpix(0, 0xffffff); delay(500); } void loop() { if(bleMouse.isConnected()) { if (M5.Btn.wasPressed() ) { M5.dis.drawpix(0, 0x00f000); Serial.println("Left click"); bleMouse.click(MOUSE_LEFT); M5.dis.drawpix(0, 0x000000); }else if(M5.Btn.isPressed()){ M5.dis.drawpix(0, 0x000f00); Serial.println("press"); bleMouse.press(MOUSE_LEFT); }else if(M5.Btn.isReleased()){ M5.dis.drawpix(0, 0x000000); bleMouse.release(MOUSE_LEFT); } delay(300); M5.update(); } }
参考
M5StickCの加速度センサを利用したものではこんな作品も。
qiita.com
失念したこと
ボタンの代わりに、タッチセンサか圧力センサを使いたかったのですが、無線接続を有効にした途端にセンサの値が意図しないものになってしまい、平日深夜だったので切り捨てました。(無念)
原因
ESP32にお詳しい たなかまさゆき さん曰く、無線有効時のアナログピンはピン32以上の数字のものしか正常動作しないのだとか。。
→ピン33などでも試していたのですが、ESP32 Pico Kitなので挙動が違う可能性も??
と言うことで一旦アナログは無視することにしました。
当初は赤丸のところにタッチセンサを設置するつもりでした。
実際試してみた感想
100点ではないけれど、手の痛みを緩和する目的は果たせたのでまずまず。
しかし、今の仕事で手に負荷がかかっているのがドキュメント作成やドキュメントレビューの画面スクロールやセル移動の動きなので、本当に必要なUI/UXはキーボードやマウスではないということに気がつきました。
顧客が本当に欲しかったのは、左手用のボタン付きジョイスティックでは?
今回はLenovoキーボードの左ボタン押しすぎでドケルバン症候群になったようなのですが、普通のマウスを使うと腱鞘炎&昔患った三角繊維軟骨複合体(TFCC)損傷の再発もあり。
右手は使わず、左手でスムーズに使えるインターフェース、、Nintendo Switchのようなものが理想なのかも。
たぶん↓に筐体をつけてやるのが理想形な気がしています。
ちなみに
公私とも色んな方からオススメいただいたのがケンジントンのトラックボールでした。
安価なところではロジクールも良いらしい。
トラックボールは以前に新宿ヨドバシで色々試したものの、手が小さすぎてちょっと合わなかったのですが、普通に指を動かせるようになったら再検討しようかと思います。。(その頃にはコーディングに入って、使わなくなってる可能性もあり)