ロータリーエンコーダーを使った回転型デバイスの製作

# はじめに

以前から考えていた、[ロータリーエンコーダー](https://www.fa.omron.co.jp/guide/technicalguide/34/24/index.html)を使った**回転型デバイス**を製作した。
指でクルクル回して操作する便利なガジェットである。

![IMG_7740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/a5fcaa7d-9cad-60ec-7aae-34277e2ed26a.png)

だが、実際に使ってみると、設計段階ではわからなかった「使い易さ(使いにくさ)」に気づく。欲を言うと、それを反映した2号機を製作して評価したいところであるが、自分使いとしては、当初の目的を果たしており十分使えるので、一旦これでよしとする。
ここでは、設計段階で考えたことと、使ってみて初めて気づいた「使い易さ」をまとめておく。


# 主要パーツ

今回のデバイスで使用した主要パーツは以下の通り。


| 主要パーツ | 目的 | 備考 |
|:-:|:-:|:-:|
| [ロータリーエンコーダー](https://tech.alpsalpine.com/prod/j/html/encoder/incremental/ec12e/ec12e2420801.html) | 今回はクリックタイプを選択 | ノンクリックタイプやノブの押し下げスイッチを持つものもある  |
|ダイヤル |直径38mmオーディオ用ボリュームつまみ|軽く回すために大径がよい |
| マイコン（ATMega32u4）| HIDデバイスの実現  |ライブラリはHID-Projectを使用  |
| モーメンタリスイッチ （プッシュスイッチ） | トリガーを与える  | ハードウェアとソフトウェアの両面で重要な脇役  |
| ディスプレイ  | デバイスの状況を伝える  | LEDでも代用できるが、より直接的に伝えるには文字が良い  |
|ケース | 縦7cm x 横5cm x 高さ3cm|小さ過ぎた感|

プッシュスイッチを3つ付けていて、便宜上、左から**F**unctionボタン、**A**lterボタン、**M**odeボタンと名付けている。

なお、ロータリーエンコーダーの制御は、[こちらの記事](https://jumbleat.com/2016/12/17/encoder_1/)を参考にさせていただいた。


# モード

このデバイスは下表に示す**動作モード**を持ち、Mボタンを押しながらダイヤルを回すことでモードを切り替えることができる。

| モード | 主な機能 | Fボタンの機能 | Aボタンの機能 |
|:-:|:-:|:-:|:-:|
| マウス  | マウス移動。<br>次のX、Y、Wheelが実際のモードである  |   |   |
| X  | マウスの左右の移動  | 一度押すとマウスの左ボタンロック、もう一度押すとロック解除  | 押している間だけ、マウスの上下の移動  |
| Y  | マウスの上下の移動  | 一度押すとマウスの左ボタンロック、もう一度押すとロック解除  | 押している間だけ、マウスの左右の移動  |
| Wheel  | マウスホイールの上下  |   |   |
| カーソル  | カーソル移動（矢印キー）(<font color=red>※</font>)。<br>次のRow、Colが実際のモードである  |   |   |
| Row  | カーソルの上下移動  |   | 押している間だけ、カーソルの左右移動  |
| Col  | カーソルの左右移動  |   |   押している間だけ、カーソルの上下移動 |
| Zoom  | 拡大・縮小  | 実際のサイズ（100%）  |   |
| Page  | ページアップ・ページダウン  |   |   |
| Tab  | タブ移動(<font color=red>※</font>)<br>Tab・BackTab(Shift+Tab)  |   |   |
| Find | 検索 次・前|新たな検索||
| Volume| 音量の上げ・下げ|一度押すとミュート、もう一度押すとミュート解除||
|Media|Play Next・Previous|一度押すとポーズ、もう一度押すとポーズ解除||
|Browser|ページ戻る・進む|ホームに移動||


<font color=red>※</font>）カーソル移動とタブ移動は、キーボードのcontrol/option/commandキーを併用することで、アプリによりさまざまな機能がグルグルで実現できて便利。

<br><br>



# 考察その１：クリックタイプかノンクリックタイプか

当初はノンクリックタイプのロータリーエンコーダーを使い[4倍の分解能で回転数を検知](https://jumbleat.com/2017/04/20/encoder_2/)して制御しようと考えていたが、結果的にはクリックタイプを使うことにした。理由は、[こちらのノンクリックタイプロータリーエンコーダー](https://tech.alpsalpine.com/prod/j/html/encoder/incremental/ec12e/ec12e2430803.html#)の軸が半端なく重く、とても繊細な制御ができると思えなかったからだ。
クリックタイプを改造してノンクリック化する記事もあるが、1周24クリックが逆に繊細な制御にはちょうど良い感じがしたので、クリックタイプとした。

**軸を回す必要トルク**
　ノンクリックタイプ：25±15mN･m
　クリックタイプ：3～20mN･m

カタログ上の数値では分かりにくいが、ノンクリックタイプ はΦ38mmのダイヤルをつけて回しても結構な力が必要であった。クリックしないので回し終わってその位置に留まるために、これぐらいのトルクを必要とさせたのだろう、と自分なりに解釈。

ノンクリック化改造するかどうかは、今後様子を見て考えることにする。


# 考察その2：モード切り替えスイッチの使い方

このデバイスは複数の動作モードがあり、その切り替え方として次のいくつかを事前に考察した。

- モードの切り替えをスイッチだけで行うか、ダイヤルの回転で行うか
- モード選択のスイッチはモーメンタリかオルタネイトか

モードの切り替えをスイッチだけで行うとすると、目的のモードになるまで、何度もスイッチを押すか、モードの数だけスイッチを用意することになる。
せっかくの回転型デバイスなのでダイヤルを回してモードを選択したい。そのため、モード選択に入るためのスイッチを一つ用意する。


# 考察その3：モード選択のスイッチはモーメンタリかオルタネイトか

スイッチの[ハードウエアメカニズム](https://ac-blog.panasonic.co.jp/モ-メンタリ-オルタネイト-スイッチの動作の違いについて)の話ではなく、モード選択におけるスイッチの役割の話である。（使用したスイッチはモーメンタリである[プッシュスイッチ](https://www.aitendo.com/product/4199)）

ここでいう**オルタネイト**とは、**①**一度モードスイッチを押してモード選択に移行しておいて、**②**ダイヤルを回し希望するモードに変更、**③**もう一度モードスイッチを押して、モード選択を終了する。という使い方である。

もう一方の**モーメンタリ**とは、モードスイッチを押し下げている状態が**モード選択**であり、**①**モードスイッチを押し下げたまま、**②**ダイヤルを回し希望するモードに変更、**③**モードスイッチから指を離してモード選択を終了する。という使い方である。ちょうど、マウスの左ボタンを押しながらマウスを動かす**マウスドラッグ**の発想である。

片手で操作したいので、後者の**モーメンタリ式**とした。もう一度押すのではなく、指を離すだけの方が使い易いと考えたからだ。


<br>
**これ以降は使ってみて気づいたことである。**

# 考察その4：モード切り替えMボタンの位置

Mボタンは一番右のスイッチに割り当てているが、これを押し下げたままダイヤルを回すのが簡単ではなくしっくりこない。片手デバイスとしてなら、ケース側面につけた方が使い易かったとも思う。現在のスイッチ位置で役割を入れ替えるのは、プログラムの書き換えだけでできるので、左からMボタン、Aボタン、Fボタンに入れ替えて様子をみるつもりである。もしくは、**オルタネイト式**にすればボタンの位置はそれほど問題にならなくなるので、これもプログラム書き換えで試してみることにする。

もう一点、使用したプッシュスイッチは、ストローク1mm程度でONとなるが、そのままさらに2mmほど沈み込むタイプであった。タクトスイッチぐらいの浅いストロークのスイッチを使えば、使い勝手が変わってくると思う。


# 考察その5：ダイヤルの取り付け位置

今回のダイヤルの取り付け位置はケース後方であるが、このケースサイズなら、ケース前方の方がよかったと感じている。ダイヤルを回すときに手のひらがケースに当たっていた方が、安定した操作ができるという意味である。現実にはディスプレイやスイッチがあるので、簡単な話ではない。もっと大きなケースにしてケース中央に配置するとか、ここは人間気学的にも色々ありそうな感じがした。本物のプロダクトなら、いくつかモックアップを作って比較評価するところだと思う。
今回はケース底面に滑りどめシートを貼って安定感を確保したので、ケースに触れずともダイヤルを回すことができる。


# さいごに

人間には、**慣れ**とか**コツ**とか、物理的制約を超えた知恵で克服できる場合もあるので、もっと使い込んで最適解を見つけたいと思う。
なお、PC側にドライバソフト（サポートソフト）を置けば、今回のようなディスプレイを不要にできるので、真四角のケースのど真ん中にダイヤルを置き、F/A/Mボタンは、ストロークの浅いスイッチをケース側面の3箇所に配置すると、もっと使い易い感じもする。2号機として製作を考えても良いかも。

視点を変えて、マウスホイールに色々な機能を割り当てることができる多機能マウスを製作する方が、使い易さ的には有利な気もする。


> 今回のパーツ代はマイコンボードも含めた合計で3300円ほど。約半分がアルミ削り出しのオーディオ用ボリュームつまみの費用である。今回はアルミ削り出しの高級品にこだわった。

ガジェット作りは飽きない。


<br>

# その後

**2021.9.30追記**
その後、以下の変化があったので追記しておく。

1. HID-ProjectのMouse APIを拡張して、マウスホイールの横スクロールをサポートした。（横スクロールのHIDディスクリプタは[こちらの記事](https://wararyo.com/2019/06/horizontalscroll2/)を参考にさせていただいた）
1. 円形のプリント基板を作成し、ボタンは大型のタクトスイッチに変更、数を4つに増やした。直径80mmにしたが少々窮屈なので100mmで設計した方が良かったかなと思う。マイコンは裏面実装し、基板の円周上に24個と各ボタンに1つづつの合計28個のフルカラーシリアルLED([WS2812C-2020](https://akizukidenshi.com/catalog/g/gI-15068/))をハンダ付けできる回路/ランドも用意した。（下記の写真はシリアルLED省略版）

![IMG_8170.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/15606d16-641b-0b6d-1f88-594fc51b4086.png)


<br>


**2021.10.2追記**
さらに[こちらの記事](http://elm-chan.org/docs/tec/te04.html)を参考に、ロータリーエンコーダーの読み取り精度を4倍にした。クリックとクリックの間の4位相をカウントすることで、よりクイック感が増した。ゆっくり回せば4位相の1つづつの変化を捉えられ、非常に良い。より繊細な操作が可能になった。

また、4つ目のボタンには、デフォルトのモードに一発で戻す機能を割り当てた。デフォルトモードは横スクロールに変更。

<br>

**以上**