ボタンやスライダー入力などのコンポーネントを使用して多くのプロジェクトを制御できますが、ビルドにノブが必要な場合はどうすればよいでしょうか?プロジェクトでロータリー入力が必要な場合は、ポテンショメータまたはロータリーエンコーダの2つの選択肢があります。
ポテンショメータ はノブの位置に応じて抵抗が変化するため、よりシンプルで確実な選択肢となることが多いのですが、(今のところ)時計回りまたは反時計回りにしか回すことができません。どちらの方向にも連続的に回転できるものが必要な場合は、ロータリー エンコーダが最適です。どちらを選ぶか迷っている場合は、エンコーダとポテンショメータの比較に関する当社の説明が答えを見つけるのに役立つかもしれません。
エンコーダー には、次の2つの基本的なスタイルがあります。
1.インクリメンタル エンコーダー は、直交配置の一連のパルスを使用して、シャフトがどの方向にどれだけ回転するかを示します。
2.アブソリュートエンコーダ は本質的に角度位置を認識します。
この記事では、最も一般的に見られるタイプのエンコーダーであるインクリメンタル エンコーダーに主に焦点を当てます。単一出力エンコーダー (別名タコメーター) も利用可能ですが、シャフトの移動距離のみを示し、方向は示さないため、あまり役に立ちません。より詳しい説明については、エンコーダーの種類に関する記事をご覧ください。今日は、インクリメンタル エンコーダーの基本的な仕組みと、それをArduinoボードと接続する方法について説明します。
直交エンコーダ: チュートリアルと概要
キャプション: エンコーダ信号AおよびBの直交図。Bの立ち上がりエッジとAの低信号は、このパターン上で右への移動を示します。一方、Bが高でAが立ち下がりエッジの場合は、左への移動を示します。
ほとんどのエンコーダーの中心となるのは、安定して段階的にパルスを発する「A」および「B」出力です。これらの出力は、必要に応じて電源とグランドと結合されます。A出力とB出力は「直交エンコード」されており、各信号のデューティ サイクルは50% (半分の時間はオン、半分の時間はオフ) です。仕組みは次のとおりです:
- 各デューティ サイクルは、他のデューティ サイクルに対して90° 位相がずれています。つまり、一方の出力が状態変更にかかる時間の半分を経過すると、もう一方の出力も変化します。
- 接続された マイクロコントローラ または専用ボードは、これらのパルスを回転の増分に変換し、パルスシーケンスはシャフトがどの方向に回転したかを示します。
上の図に示すように、Aが低い状態のときにB信号が上昇すると、このパターン上の位置は右に進んでいます。ただし、Aがすでにハイ状態にあるときにB信号が上昇すると、左に進みます。A信号の上昇と下降と組み合わせると、各ラインに4つの異なる状態が生成されます。
信号Aにも同じ信号パターンが使用可能で、8つの異なる遷移が可能で、各方向に4つずつ遷移できます。このパターンを円形に折り返して繰り返すと、直交ロータリー エンコーダの基礎が完成します。
1.B上昇、A低下
2.Bは下落、Aは上昇
3.B上昇、A高
4.Bが下がっている、Aが低い
Arduinoでロータリーエンコーダを使用する
Arduinoと2種類のエンコーダーを組み合わせます。
- 接触エンコーダ: 小型で、一般的にインターフェースデバイスとして使用されます。
- 光学式エンコーダ (LPD3806-600BM-G5-24C): ベアリング サポート付きの大型スタイルで、通常はモーターの速度測定に使用されます。
小さいエンコーダーを使用している場合は、次の手順を実行します。
1.中央の線をアースに接続します。
2.一方の外部接続をD2に接続し、もう一方の外部接続をD3に接続します。正電圧は必要ありません。
より大きなエンコーダの場合は、次の手順に従います。
1. 赤い電源ラインを +5Vに接続し、黒い線をアースに接続します。
2.AラインとBライン (緑と白) をArduino D2とD3に配線します。
3.接続、電圧要件、および配色は実装によって異なる場合があることに注意してください。
Arduinoエンコーダー コード
画像: ジェレミー・S・クック
エンコーダーのAラインとBラインが回転によってどのように脈動するかを理解したら、有用な出力を得るには、この入力をコードに変換するだけです。このステップは理論的には簡単ですが、実際には難しい場合があります。サンプル コードはこちら でご覧いただけます (テストに役立つ3Dプリント可能なトップも付属)。上部は完璧ではありませんが、方向的には正確であり、エンコーダーがどのように動作するかを示しています。Arduinoのマイクロコントローラは、どちらかのラインにおける高と低の間の遷移を感知すると、両方のラインの状態を比較し、必要に応じて増分を加算または減算します。
多くのArduinoボードでは、割り込みを生成できるATmega328の入力はD2とD3のみなので、必ずこれらを選択してください。つまり、ここで遷移が見られると、プログラムのロジックがそれを呼び出すのを待たずに、すぐに読み取りルーチンに入ります。
millis() デバウンス コードも考慮してください。このコードは、遷移中に状態が急速に変化し、短時間で急速に接続および切断される可能性のある入力に対応します。このコードは一部のアプリケーションでは問題なく動作し、エンコーダーの動作を理解するのに役立ちますが、100% の精度で読み取り値を取得するのは簡単ではありません。
Arduinoエンコーダライブラリの使用
Arduinoエンコーダー コードはエンコーダーの動作を理解するのに役立ちますが、プロジェクトでエンコーダーだけを使用する場合は、Paul Stoffregenの既製のライブラリを活用してください。開始方法は次のとおりです。
1.GitHubから エンコーダ ライブラリ をダウンロードします。
2.Arduino IDEで、[スケッチ] ==> [ライブラリを含める] ==> [.ZIPライブラリの追加] に移動し、「Encoder-master.zip」を追加します。
3.インストールされると、[ファイル] ==> [例] ==> [エンコーダー] の下に4つのプログラムがリストされます。「Basic」サンプルをロードし、Arduinoボードに転送します。
4.前と同じようにエンコーダーのプラスとマイナスを接続しますが、今回はAとBの信号線をD5とD6に配線します。
5.9600ボーでシリアル モニターを開くと、位置の増分と減分が正確に表示されます。
光学式エンコーダと同様に、位置は何も操作しなくても変更できるはずです。さらに楽しむには、同じボーレートでArduino IDEのシリアル プロッタを開きます。単に位置番号を伝えるのではなく、値のグラフを自動的に作成します。
カスタム インターフェイスとして使用する場合でも、速度や距離を測定する場合でも、エンコーダーはArduinoプロジェクトに優れた回転入力方法を提供します。他の多くの種類のデバイスよりもセットアップに少し手間がかかりますが、その結果は十分に価値があります。