秋月に24クリック位相差式のロータリーエンコーダがあります。
http://akizukidenshi.com/catalog/g/gP-06357/
寝起きに目についたコレのですね、テストコードを書こうとしたんです。こんなんパルス拾うだけだろう、簡単に書けるだろう、と踏んでいたのですが大間違いで一日かかりました。慣れていればスッと書けるのでしょう。
心が折れそうになった時はもちろん先人の記事もいくつか当たりました。ですがチラ見しただけではあまり理解できず、サンプルコードをコピペしてみても欲しいのとちょっと動作が違ったり。
頑張って書いたから見てほしいです。それだけで記事にしました。
いじわるな軸の動かし方してもちゃんと1コリで1個ずつ値が増減できるんですよ。
※シグナルのタイミングは回し始めのキワではなく、かといってコツッと落ちる瞬間でもなく、中間あたりです。マウスイベントでいうと MouseDown でも MouseUp でもなく Clicked のタイミングです。
この部品はプッシュスイッチが無いタイプだという点に注意です。注文時ちょっと期待していたのは秘密です。付いているのは これ しかないのかな。
用意するもの
Arduino nano を使います(した)。デジタルピンの内部プルアップを使う事にしたので配線は三本で済みます。このロータリーエンコーダは 2.5 mm ピッチですが基板取付用のツメが干渉してブレッドボードにうまくささらないので錫メッキ線をはんだ付けし、確実に実験ができるようにします(した)。3本端子がありますが左右を D6, D7 につないで真ん中を GND に配線します。回転方向が直感と違ったら D7, D6 とピンを入れ替えましょう。
ピンを変えたい時
define してあるビットマスク、レジスタ読みのニーモニック PIN*、ビットシフト >>n の三つを適当に編集すれば動作するはずです。この辺は検索難易度が高くないので詳細は省略します。別にレジスタ読みしなくても時間には十分すぎるほど余裕あるので digitalRead で分かりやすい方が良いんでしょうけど、取りこぼしそうかなぁという不安からいっぺんにピンの値を読んだ方が確実と思って PIN を使っています。詳しいこと言おうとすると穴いっぱいあいてしまうのであまり語りたくないです( ᷇ ᵕ ᷆ )
コード
// ここから
#define cbMask 0b11000000
#define cbLeft 0b10000000
#define cbRight 0b01000000
bool rot= false;
byte dir= 0;
long val= 0;
void setup() {
Serial.begin( 115200 );
while (!Serial);
pinMode( 6, INPUT_PULLUP );
pinMode( 7, INPUT_PULLUP );
};
void loop() {
uint8_t dat= PIND&cbMask;
if ((rot)&&(dat>>6==0b11)) {
rot= false;
dir= 0;
} else if (dat== cbLeft) { dir= 2; }
else if (dat==cbRight) { dir= 1; }
else if ((!rot)&&(dir>0)&&(dat>>6==0b00)) {
rot= true;
if (dir==1) { val--; }
else if (dir==2) { val++; };
Serial.println( val );
};
};
// ここまで
コメント入れてなくてすみません。小さな ”できた” を積み重ねていった姿がこれですが自分で書いたロジック理解できてません::( ˘ω˘;;;)::
難航していた昼前当たりには「勉強だからと思うのはいったん忘れて作るべきものを作る最短ルートを通るのだ!」とか強く心に誓ったはずなんですけど、出来上がったのは夕方でした。
入力は大事だけれども決して主役ではないので特にオチはありません。なにか進展・発展があれば追記します。
ブログ、記事が増えすぎる前にどこかテキストの自由度が高いところに移りたいです…
マルチタスクと呼んで良いほどではないけど、時間を表示しつつ取りこぼしを感じないくらいにはきちんと動作します。ちょっとわかりにくいですがロータリエンコーダで OLED の明るさを変えています。
0コメント