HakoHiroのアイコン画像
HakoHiro 2022年04月08日作成 (2022年04月08日更新) © MIT
製作品 製作品 閲覧数 1747
HakoHiro 2022年04月08日作成 (2022年04月08日更新) © MIT 製作品 製作品 閲覧数 1747

M5StickC BLE による、読書ページめくり

M5StickC BLE による、読書ページめくり

M5StickCをBLEキーボードとし、離れたところからAmazon Kindle(PC版)等の読書ソフトのページめくりをします。

M5Atomで作るワイヤレス譜めくりデバイス  by linclipさん
を参照させていただきました。特に、『ESP32-NimBLE-Keyboard』の記載はありがたかったです。

  • 背景

    老眼も進み、段々実際の本を読むよりも、PCで電子書籍を見る方が多くなりました。32インチモニタを使用しているので、電子書籍の方が表示も大きく快適です。ただ、あまり快適になりすぎて、モニターの前から離れられなく、椅子に座りっぱなしとなってしまいます。立っても読書ができるように、ページめくりを離れたところからできるようにしました。
    実は、先にMacの【音声コントロール】を使い 『カーソル右』、『カーソル左』の声で操作していましたが、喋り疲れるので開発しました。 どちらも共用していこうと思います。

  • ソースコード

main.cpp

// M5StickCを使い、BLEのキーボードとする // Kindle etc. のページめくり用 // ButtonA(中央) クリック:左カーソル // ButtonA(中央) 長押し:右カーソル // 左Button: 左右カーソルの入れ替え(頁送り方向反転) // 右Button: Mac用 英数キーボード認識(Z,/を送出) #include <M5StickC.h> #include <BleKeyboard.h> BleKeyboard bleKeyBoard("StickBLEkeyboard"); uint8_t directionForward = KEY_LEFT_ARROW; uint8_t directionBackward = KEY_RIGHT_ARROW; bool backwardFlag = false; void lcdShowDisconnected(void); void lcdShowConnected(void); void lcdShowPageSend(bool);    // 未使用 void macKeyBoardSelectSend(void); void setup() { M5.begin(); M5.Lcd.setRotation(3); M5.Lcd.setTextSize(2); lcdShowDisconnected(); bleKeyBoard.begin(); } void loop() { M5.update(); if (bleKeyBoard.isConnected()) { lcdShowConnected(); if (M5.BtnB.pressedFor(1000)) { // ButtonB = right side Button // 長押しで Macのキーボード種別判定用 【z /】送信 macKeyBoardSelectSend(); } if (M5.Axp.GetBtnPress() != 0) { // 本体左ボタン押下ならページめくり方向変更 if (directionForward == KEY_LEFT_ARROW) { directionForward = KEY_RIGHT_ARROW; directionBackward = KEY_LEFT_ARROW; } else { directionForward = KEY_LEFT_ARROW; directionBackward = KEY_RIGHT_ARROW; } } if (M5.BtnA.wasReleased() && backwardFlag == false) { bleKeyBoard.write(directionForward); } if (M5.BtnA.pressedFor(500)) { bleKeyBoard.write(directionBackward); backwardFlag = true; } else { backwardFlag = false; } } else { lcdShowDisconnected(); } delay(200); } void lcdShowPageSend(bool left_right) { // Now Not Use 表示調整必要 M5.Lcd.setTextColor(BLUE); if (left_right) { M5.Lcd.print("<"); } else { M5.Lcd.print(">"); } } void lcdShowConnected() { M5.Lcd.setTextColor(GREEN, BLACK); M5.Lcd.setCursor(1, 7, 1); M5.Lcd.println("BLE-Keyboard"); M5.Lcd.print("Connected "); } void lcdShowDisconnected() { M5.Lcd.setTextColor(BLACK, RED); M5.Lcd.setCursor(1, 7, 1); M5.Lcd.println("BLE-Keyboard"); M5.Lcd.print("Disconnected"); } void macKeyBoardSelectSend() { // ButtonB = 右Button 1秒長押しで // Macのキーボード種別判定用 【z /】を送信 bleKeyBoard.write('z'); delay(2000); bleKeyBoard.write('/'); }

ページ順送り、逆送りの判定にフラグを使っています。フラグなど使わないで、スッキリとしたいところですが、動いているので良しとします。表示ももっとなんとかと思ったのですが、所詮手の中で操作しますので、表示なんか見てられないのでごく簡単にしました。

PlatformIOの初期設定ファイル

[env:m5stick-c] platform = espressif32 board = m5stick-c framework = arduino monitor_speed = 115200 lib_deps = m5stack/M5StickC@^0.2.5 h2zero/NimBLE-Arduino@^1.2.0 https://github.com/wakwak-koba/ESP32-NimBLE-Keyboard.git

ご存知、ライブラリ関係の初期設定ファイルです。
monitor_speedを設定(monitor使用しない場合は不要)
LibraryにM5StickC、githubのNimBLE-Keyboardを追加しています。

ESP32-NimBLE-Keyboard
これは、有名所のESP32 BLE Keyboard libraryからフォークしたライブラリーです。実は、ESP32 BLE Keyboard libraryでは、BLEの通信は認識するのですが、キーボードとして上手く動作できませんでした。当方のPCがMacの為もあるかとは思いますが、こちらのNimBLEを使用してMacでもキーボードとして使用できました。

Mac システム環境設定
接続ボタン押下により認識します。

必要に応じ、Mac システム環境設定>キーボード>Bluetoothキーボードを設定
から、キーボード種類 (英語、日本語)を選択してください。そのためには、『z』,『/』キーを押さないといけないのですが、
M5StickCの右Buttonを1秒長押しで『z』,『/』キーを送出します。

上記設定済みでキーボードとして接続したら、Kindle等の読みたい本を開いてください。
あとは、ボタンA(大きなM5ボタン)をクリックすると、ページ進み、0.5秒長押しするとページ戻りとなります。また、ページの進み方向は本体左のボタン押下で逆転します。

  • 感想

    • ESP32-NimBLE-Keyboard:素晴らしい。元のライブラリーよりずっとスッキリしています。このようなライブラリーが充実して、かつWebに公表されていて助かります。 linclip様の記事も参考になりました。

    • PlatformIO:このようなライブラリーをどんどん試せて快適極まりないです。ライブラリー間の干渉(混ぜるな危険)を気にしないで、プログラム毎に環境を簡単にローカルに設定できるのは地味にありがたいです。

    • M5StickC:サイズも小さく、またボタンも各種あり、かつ、BLE込み、極めつけは充電式電池付きがありがたい。これでケーブルを引っ張っていたら、操作感が悪すぎます。

    • 肝心の使用具合:立って読書できるのは快適、かつ健康に良いです。

  • 今後の方針

  • 実は、元々は、AppleWatchでジェスチャーでコントロールしようと考えていました。それを諦めたわけではないのですが、しばらくXcode,Swiftを扱っていない内にすっかり様変わりしていて、追いつくのが大変です。どのような手法でやればよいのか調査だけで手間がかかっています。AppleWatchでBLEコントロールのアプリも前にAppleStoreに出したこともあるのですがね・・・なにか良い方法をご存知の方は教えていただければ幸いです。

  • 現在立って読書ができるようになりましたが、更に寝転んでも読書をしたいと思ってヘッドマウントディスプレイを手配中です。当然この場合にも 本M5StickCページめくりは大活躍する予定です。

  • 付記:Mac音声コントロール

おまけで、Macの場合の音声コントロールの設定方法を説明します。
システム環境設定> アスセシビリティ> 音声コントロール> コマンド ボタン押下
キャプションを入力できます

+押下で追加 『カーソル右』、『カーソル左を追加したところ』
認識精度はほぼ100%です。もっともっとこちらも活用していきたい所です。

HakoHiroのアイコン画像
函館在住のOldエンジニアです。マイコンは Z80ワンボードの頃から使っています。なにせあの頃は、ハンドアセンブルでプログラム作成していました。(ニーモニックを手書きで書き、それを表を見ながら機械語コードに落とします)おかげで リターンコード(RTN=0xC9)はいまだに覚えています。RTNまで来るとサブルーチンが一段落でホッとするので・・・ 現在は、電子工作の他に錫で色々作って楽しんでいます。
ログインしてコメントを投稿する