その内容を整理しつつ、補足します。ChaNさんのサイトで詳しく説明されています。ここでは、インクリメンタル型について触れます。オーディオコンポの「ボリュームつまみ」や「ラジオのチューニングつまみ」などで使われています。2本のデジタル線だけで接続することができます。回転角を知るためのセンサとしては、可変抵抗もよく使われます。「回転角」を知ることができます。可変抵抗は抵抗を利用しているので、回転角の範囲に限りがありますが、ロータリーエンコーダは無限に回転させることができます。その信号パターンが時系列的にどう変化したかを元に、回転角の増減を検知します。「00」→「01」→「11」→「10」→「00」...という具合に、4通りのビットパターンが繰り返されます。このパターンを10進数で表記すると、「0」→「1」→「3」→「2」→...となります。反対に回すとこのパターンが逆順に現れます。回転していない場合は、「00」→「00」のように同じパターンが出続けます。※:90度と言っても、つまみの回転角90度分ではない(4つの信号パターン一組を360度と考えたときに、その1/4で90度という意味。製品にもよるけど、たとえば1周24パルスの製品なら、つまみを1回転させる間にこの4つ一組のパターンが24回現れる)グレイコードこのビットパターンの並びを良く見てみましょう。隣り合ったデータ同士を比較すると、常に一度に1箇所(1ビット)しか変化していません。「00」→「11」のように同時に2ビット以上変化することがありません。(「グレイ」は、色ではなく、これを考案した人の名前です。回転時の微妙なタイミングによって信号が化けることが無く、信号の変化を正確にとらえることができます。物理的にはそういう事はありえません。ほんの一瞬だけ、どちらかが先に変化して、続いてもう片方が遅れて変化することになります。した信号を読み込むと、コードを誤認識してしまい、誤動作の原因となります。グレイコードを使うと、これを防ぐことができます。グレイコードを使うと、同期信号(クロック信号)などを使わずとも、データ信号だけで、ロータリーエンコーダからの信号を扱えます。後々の処理で何かと都合がよくなる場合もあります。読み込んだ「パターンの変化」から、どっちにどのくらい回ったのか(角度の変化)を、以下のように計算できます。テーブルサーチ処理によって、どっち方向に回転したのかを知ることができます。テーブルには12通りのパターンを盛り込んでおけば最小限のスペックとしては足ります。実際には、回転が速すぎて2パターン一気に進んだり、信号にノイズが載るなどすると、本来ありえない信号が入力されます。エラーとなるケースもテーブルに盛り込んでおいても良いでしょう。ソフトウェア処理であれば、これが一番素直なやり方になるでしょう。(後々プログラムを修正する際に、理解しやすいプログラムに作れる)このテーブルを使って、if文やswitch~case文などを使ってこの通りにロジックを書くのが、素直な処理と言えると思います。計算方法2:間引きもう少し手を抜く方法があります。1ステップ分「右回転/左回転」カウントする方法を採っています。これなら、全入力パターンをテーブルに記述しておく必要がなく、ソフト上の処理も単純で極めて小規模に済ませられます。1/4とか1/2とかになります。2について、処理方法を考えてみます。2ビットの入力値は、正回転、逆回転それぞれで、このように並びます。00→10→11→01→...これを踏まえ、前回拾った信号を上位2ビットに、今回拾った信号を下位2ビットにして繋ぎ、計4ビットのデータに纏めてみましょう。すると、この4ビットのデータ値(太字部分を通過するときのデータの並び)は、次のようになります。4(0x4)→...のパターンが現れます。1周4ステップのうち、これらのパターンが現れた時だけ増減すれば、単純な処理ロジックで「正逆回転」の変化量がカウントができます。他は読み捨てているともいえます。読み捨てているため、実際の物理的な回転量に対して、拾える信号の数(分解能)は1/4になります)ただし、デテントで停止するのは4つのパターン1組分を跨いだところなので、どちらの計算方法でも実用上はあまり違いは生じないでしょう。スケッチロータリーエンコーダ制御のスケッチこの方法2を元に、Arduino用スケッチにしてみたのが、以下のものです。}スケッチの処理内容スケッチの処理内容の要点をざっくりまとめます。上記の「0x7」「0xD」にあたる場合には、カウンタ(=回転位置の差分値)の増減を行います。setup関数内で、このライブラリの初期化を行っておく必要があります。割り込み周期は、ロータリーエンコーダの場合、1m秒程度に設定しておくと良いかと思います。積算処理を行って、実際の回転位置(角度)を計算します。積算値は、グローバル変数rotとして定義してあるので、メイン処理側から任意のタイミングでクリアもできます。(rotにゼロを代入するなど)暇のある方は、C++のオブジェクトに書き換えて、読み出すメソッドや、ゼロクリアするメソッドなどにしてみると使いやすいかもしれません。変数「diff」は割り込み処理内で更新されています。割り込み禁止にしておく必要があります。変数「diff」はint型のため、メモリマップ上では複数バイトにまたがって配置されています。Arduinoの場合、int型は2バイトです。アセンブラレベルで見ると、この2バイトは1バイトずつ別々に読み出しが行われます。1バイト目と2バイト目に読み出されるデータは、別のデータとなってしまいます。そのため、「noInterrupts()」「interrupts()」を使って、一時的に割り込み禁止状態でアクセスする必要があります。関数「rotary_value()」の内部では、割り込み禁止で変数「diff」を参照しています。ロータリーエンコーダ制御の課題つまみを手で回すタイプのロータリーエンコーダは、センサーの接点が接触することで、通電/絶縁(オン/オフ)を制御しています。した制御には、グレイコードが役立っていることについては既に触れました。接触センサ特有の問題を生じることがあります。チャタリングに関すること問題の一つは、チャタリングです。信号が安定するまでの微小時間にオンとオフが「バタバタ」と切り替わります。バウンシング(bouncing)とか呼びます。(短時間ばたつくことはあってもすぐに収まり)、コード値が致命的に誤認識されておかしな値を入力するといったことにはなりません。一般的なチャタリング対策を行っておけば、短時間のばたつきについても特段気にする必要もないでしょう。上記のプログラムでは、1ミリ秒ごとに割り込みでサンプリングすることで、チャタリングを除外しています。(なお、「計算方法2」で間引く場合、正転・逆転の双方が、同じコードを跨ぐ値を採る必要があります。正転側は「01→11」に、逆転側は「11→01」に変化している部分であり、お互いがちょうど逆向きの組み合わせと判ります。このように同じコードを跨ぐ組み合わなら、チャタリングが発生してもお互いが補完し合うので、誤動作を防ぎます。お互いが補完し合わないので、カウンタが片方向に勝手に複数回進んでしまい、誤動作を起こします。逆に言えば、補完しあう組み合わせであれば、「0x7」「0xD」以外でもかまいません。順方向「00→01」と、逆方向「01→00」を組み合わせた、「0x1」「0x4」の組み合わせでも同様に動きます。チャタリングの影響は、回路構成やソフト側の読み取り処理の工夫で、このようにトラブルを未然に防ぐことが可能です。接触不良に関することもう一つは、接触センサの寿命に関わる問題です。接触センサは、物理的に接したり、離れたりすることで、信号のオン/オフが切り替えられます。導電体が接触や摩擦を繰り返すと、いずれ擦り切れて、信号のオン/オフを上手く伝えられなくなってきます。本来は通電状態となる必要があるときに、上手く通電できない状態が発生することが生じます。正しいグレイコードが出力できなくなる恐れが生じます。すると、正しくカウント処理の結果がおかしくなり、誤動作を起こします。接触センサであれば、これは原理上避けられません。いわゆる寿命というものです。新品で購入後、数年で接触が駄目になりました。(それ以降、リモコンでボリュームを設定しています)寿命は、製品によって異なります。当然ながら、安いものは短く、長寿命のものは一般的に高価です。信頼性が重要な用途の場合、やはり少し高くても、長寿命のものを選んでおくのが安全でしょう。RSコンポーネンツで長寿命タイプを探してみました。ものは3万回転程度のようです。モノによっては明示されていないものなどもありました。用途に合わせて、どのくらいの寿命に設定するのかを考えて、選ぶ必要がありそうです。光学式ロータリーエンコーダ非接触な光学式ロータリーエンコーダなお、ロータリーエンコーダには、光学的に検知するタイプのものもあります。光学タイプは、モータやギヤボックスの出力軸のように、常時回転している軸の回転角を正確に把握する用途で使われます。ソフトの処理上は、接触式のものと基本的に変わりはありませんが、耐久性などの点で性格が異なります。はあっという間なので、接触センサは適しません。接触式が毎秒数百~千回程度のセンスにしか対応できないのに対して、光学式は数桁速い速度まで追従します。LEDの発光寿命(通常時間で規定される)によって寿命が設定されます。LEDを常時点等させたままでも、数年~10年程度は動作可能です。LEDを点灯させる必要があるため、そのための電源が必要になります。オーディオコンポのボリュームのように、手で摘んで回転するといった用途には、光学センサのタイプは皆無です。モータ以外にの用途モータ以外にも、PC用のマウスの中にも、光学式のロータリーエンコーダが使われています。初期のマウス(中にボールが入っているマウス)では、ボールの回転を検知する部分で使われていました。最近のマウスでは、センターホイール(スクロールホイール)の内部で、光学式のものが使われています。こちらのサイトでは、マウスを分解して、Arduinoで読み出す実験を行っていました。寿命ロータリーエンコーダを選ぶ上でポイントとなるのは、まずはやはり寿命です。ハンダづけなどによる固定の強度などによって、モノ全体の寿命に影響します。サイズと形状さらに、寿命の長さの観点に加え、他にも選択の視点があります。シャフトの長さや太さなどのバリエーションです。スルーホールなのか表面実装なのか、といった点もここに含められるでしょう。どのように力学的負荷が掛かるか...といったことを踏まえて選択します。操作感もう一つは、クリック感(デテント)があるかどうかといった点です。クリック感でフィードバックできるものと、そうしたクリック感がないものがあります。オーディオ機器のボリュームなどは、そうしたクリック感が無いほうが、高級感が得られます。した観点から、「寿命」「サイズや形状」「クリック感有無」あたりを踏まえて選択します。全体の質感なども、使い勝手などに影響するので、その辺りも加味しておくとよいでしょう。Design入門書WebIOPi・WiringPiでWebと電子回路を連動Arduino1.0対応です。お手にとって眺めて頂けるとうれしいです。