ロータリーエンコーダ(ホイールエンコーダ)の使い方。
2022.10.14
マウスに良く使われているロータリーエンコーダ(ホイールエンコーダ)。
これの使い方を調べてみたいと思います。
↑ロータリーエンコーダというとこれが一番有名ですが、
捻るタイプのエンコーダなので今考えている用途には使えません、
今回はもっと小型でマウスのホイールと同じものを使います。
最近のマウスは、このようなパーツでホイールを検知しているようですね。
一昔前は回転する網が何回光を遮ったかを検知する構造で
センサーが露出しているタイプだったのに、
今はこれらの機能が内包し小型化がすすんでいるという。
進化が早いです(;´Д`)
さて、このロータリーエンコーダーは3ピンです。
1本が電源線、2本が信号線。
先人の知恵を借りるためにネットで使用例を検索してみると、
電源線をGNDにつなげている人が多く見えます。
しかもそのようなソースに限って、
pinMode(1, INPUT);
となっています。
中学レベルの電気しか学んでいない私は「え?インプット?入力?なのにGND?」
とちょっと疑問に思ってしまうのですが、
GNDのマイナス電圧を利用するん?とか考えてしまいますよね?
これが
pinMode(1, INPUT_PULLUP);
だったなら理解はできますが・・・。
しばし悩んだら、
pinMode(1, INPUT);
digitalWrite(1, HIGH);
と2行がセットになっていることに気が付きました。
INPUTなのに、HIGHを出してる。
このパターンでも、INPUT_PULLUPと同様に内部抵抗(最小20KΩ~最大50KΩ)
がオンになるという話。
Arduinoではあまり推奨していない方法だけど、
こういった使い方もできるんだねと。
話はそれましたが、電源線はGNDに繋いで問題ないようです。
そうそう、Arduinoはモデルによって割り込みが使えるピンが違います。
私が良く使うモデルだけ載せておきます。
UNOとMEGAとMicroとLeonardoの4つがわかればok
今回のテストで使うUNOは2ピンと3ピンね。
動作の検証なので、とりあえずシンプルに接続。
2本の信号を組み合わせて回転の方向と量を検知する仕組み。
ソースはとりあえずこんなところかな。
ロータリーエンコーダーの回転量(位置)を導き出す関数だけど、
今回はどの程度の速さで処理できるのか見たかったので、
シリアルモニターに表示させてみました。
1ノッチ動かすだけでも数回割り込みしているのがわかる。
結構デリケートなのね。
カチッって言うノッチの振動で判定がぶれるのかな。
これは割り込み処理内で位置情報だけ確保しておいて、
LOOP内で適切なタイミングで移動量を計算させて使用したほうが安定しそうだ。
これの使い方を調べてみたいと思います。
↑ロータリーエンコーダというとこれが一番有名ですが、
捻るタイプのエンコーダなので今考えている用途には使えません、
今回はもっと小型でマウスのホイールと同じものを使います。
最近のマウスは、このようなパーツでホイールを検知しているようですね。
一昔前は回転する網が何回光を遮ったかを検知する構造で
センサーが露出しているタイプだったのに、
今はこれらの機能が内包し小型化がすすんでいるという。
進化が早いです(;´Д`)
さて、このロータリーエンコーダーは3ピンです。
1本が電源線、2本が信号線。
先人の知恵を借りるためにネットで使用例を検索してみると、
電源線をGNDにつなげている人が多く見えます。
しかもそのようなソースに限って、
pinMode(1, INPUT);
となっています。
中学レベルの電気しか学んでいない私は「え?インプット?入力?なのにGND?」
とちょっと疑問に思ってしまうのですが、
GNDのマイナス電圧を利用するん?とか考えてしまいますよね?
これが
pinMode(1, INPUT_PULLUP);
だったなら理解はできますが・・・。
しばし悩んだら、
pinMode(1, INPUT);
digitalWrite(1, HIGH);
と2行がセットになっていることに気が付きました。
INPUTなのに、HIGHを出してる。
このパターンでも、INPUT_PULLUPと同様に内部抵抗(最小20KΩ~最大50KΩ)
がオンになるという話。
Arduinoではあまり推奨していない方法だけど、
こういった使い方もできるんだねと。
話はそれましたが、電源線はGNDに繋いで問題ないようです。
そうそう、Arduinoはモデルによって割り込みが使えるピンが違います。
私が良く使うモデルだけ載せておきます。
UNOとMEGAとMicroとLeonardoの4つがわかればok
今回のテストで使うUNOは2ピンと3ピンね。
動作の検証なので、とりあえずシンプルに接続。
2本の信号を組み合わせて回転の方向と量を検知する仕組み。
ソースはとりあえずこんなところかな。
ロータリーエンコーダーの回転量(位置)を導き出す関数だけど、
今回はどの程度の速さで処理できるのか見たかったので、
シリアルモニターに表示させてみました。
1ノッチ動かすだけでも数回割り込みしているのがわかる。
結構デリケートなのね。
カチッって言うノッチの振動で判定がぶれるのかな。
これは割り込み処理内で位置情報だけ確保しておいて、
LOOP内で適切なタイミングで移動量を計算させて使用したほうが安定しそうだ。