半年くらいまえにちょっとやってうまくいかず放置していたロータリーエンコーダの実験、うまくできたので整理。

環境:MacOSX 10.10 / Arduino IDE 1.0.6 / Seeeduino Lite(Arduino Leonardo互換)

ロータリーエンコーダはA相とB相の状態を見て回転方向を調べる。C端子はGND、AとBは10KΩでプルアップすることになっているが、ピンのプルアップ設定でよい。

2014rot1

コードは以下を参考に少し変えた。A相の変化で割り込みを使ってBの変化を読み方向を決める方式。
Leonardo系はpin2の割り込み番号がUNO系の0と違って1なので注意。

ロータリーエンコーダーを使ってみる(忘れないページ)
arduinoでロータリーエンコーダを使う (創ったり投げたり。)

https://gist.github.com/houmei/6524d5254652c7460a6e

私の環境では大量のテキストを連続してArduino IDEのシリアルモニタに送るとArduino IDEが応答なしになってしまう現象があった。なので、適当にdelay()を入れ、数値も変化した場合のみ送ることにした。
元のソースでは回転方向を'R'、'L'でいったん記録し、続くif文で++または--している。'R'を+1、'L'を-1にして続きでそのまま加算してやれば簡単になると思って改変したら'R'方向(ClockWise)の動きが渋くなってしまった。なんでプラス方向だけスッポ抜けることがあるのか不明だが調査保留とした。

追記:
Arduino IDE1.0.6の最新ファームを純正Arduino Leonardoに書き込んで実験→再現。Arduino UNOでも再現。

 さて以前やったときなぜうまくいかなかったか。ひとつはロータリーエンコーダの理解不足でカチカチと動かした時にA相B相の状態が固定になると思っていた。しかしクリックできる所で止まるとA,BともCとの接続はOFFになる。
 もうひとつはロータリーエンコーダによる端子配列の違い。

 これは上からC,B,Aの順。秋月電子のキットから流用したもの。
2014rot2

 これは上からB,C,Aの順。どこで買ったか忘れた。最近見かけるLED内蔵の透明な軸のタイプもこれ。
2014rot3

 これを間違って配線すると、片方向にしか回らないという現象が発生する。