M5StickCで「布団から手を出さずに読書アプリのページをめくるやつ」を作る

f:id:moyashipan:20200122000123j:plain

アプリで本を読んでいる時に、指で画面をタップせずにページをめくりたい!
それをM5StickCだけで実現してみました。

制作動機

ウチでは猫を飼っています。布団に入って横になりながらiPadで本を読みたいのですが、飼い猫が僕の左ワキで寝たがるので姿勢が限られてしまいます。
そのため「横になった状態でiPadを持ってページをめくる」という動作が難しくて困っていました。

iPadを持つことに関しては枕元の周辺に立て掛けたり固定したりすれば解消するのですが、ページめくりに関しては画面に手を伸ばさないといけません。
左腕が猫に封じられており、右手を伸ばす姿勢はつらい。さらに冬はできるだけ布団から手を出したくない。

そんな風に、猫を愛でながらiPadでの快適な読書を実現できないものかと考えていました。

M5StickCをBluetooth接続のキーボードにしよう

いくつかの案が思いつきましたが、

  • 無線で使えてゴチャゴチャしない
  • ジャマにならないサイズ
  • 手元が見えなくても操作しやすい
  • 動作をカスタマイズできる
  • 費用が安い

といったことを重視して「M5StickCをBluetooth接続のキーボードにする」方法を選択しました。

この選択に至るまでの経緯が知りたい方は以下の記事をご覧ください。

moyashipan.hatenablog.com

アプリごとのキーの仕様について

さて、iPad(やiPhone)に市販のキーボードを接続して試してみるとわかるのですが、

  • AmazonKindleアプリは「上下キー」「左右キー」
  • Appleのブックアプリは「PageUp, PageDownキー」「左右キー」

でページをめくれます。

Kindleは下キーを押せば次のページに行くということです。
しかし左右キーを押した場合には、本の開き方向によって次ページへ行くか前ページへ戻るかが違います。
さらにAppleのブックアプリは上下キーでは反応しません。

そのようなアプリの事情とM5StickCの少ないボタン事情を考慮して、以下のように複数のモードと長押しによる挙動の切り替えを実装してみました。

フルキーボードアクセスがONだとダメなアプリもある

(2021/10/12 追記)
「同じようにキーボードを繋いでもKindleで動作しない」という報告があったのですが、「アクセシビリティ」の「フルキーボードアクセス」という設定をOFFにすると良いそうです。

モード

  • KindleMode: 下キー, 上キー
  • AppleBookMode: 右キー, 左キー
  • MangaMode: 左キー, 右キー

f:id:moyashipan:20200122000147j:plain

起動時とモード切り替え時に、現在のモードが液晶パネルに表示されます。
(電力を節約するために、正面ボタンを押すと消えるようにしてあります)

操作方法

  • 正面ボタンを短く押す: 次へ
  • 正面ボタンを長く押す: 前へ
  • 右側面ボタンを短く押す: 次のモードへ切り替え
  • 右側面ボタンを長く押す: KindleModeへリセット

ソースコード

コードはgistに公開しました。

gist.github.com

利用しているアプリによっては違うキーを割り当てたい場合もあると思います。 その場合は KeyConfig configs[] の部分を書き換えて使ってください。

また、利用しているライブラリについては以下の記事が参考になりました。合わせてご覧ください。 neocat.hatenablog.com

使ってみた結果と考察

今回の仕組みは、充電されたM5StickCで80分ほど動作しました。
寝る前の読書のためなのでそれぐらいもてば十分かなと思って使っています。

もっと長持ちさせたい・便利にしたいという場合には

  • 公式が販売しているバッテリーベースを追加する ja.aliexpress.com
  • バッテリー残量が減ってきたら ⌘+H を押させて、iPadのホームに戻る動作で気付けるようにする
  • M5Stickに振動モーターをつないで、バッテリー残量が減ってきたら振動で気付けるようにする

といった工夫ができるかもしれません。

最後に

今回はカスタマイズ可能なページめくり用デバイスとしてM5StickCを活用してみました。
もし似たようなニーズを抱えている方は、この機会にM5StickCをいじってみてはいかがでしょうか。