エンコーダをしゃぶる(しゃちょ〜)

モータを制御するには、現在値を知るセンサが必要です。一般的に位置制御の場合には、ポテンショメータ(可変抵抗)、エンコーダが使われることが多く、速度制御の場合には、エンコーダやタコジェネレータが多く使われています。電流制御の場合には電流センサ、トルク制御の場合にはトルクセンサという具合。
エンコーダは、回転する円盤にスリットが入っていて、そこにLEDなどで光を当てることで、光のON/OFFをカウントしてモータの回転量を計測します。また、インクリメンタルタイプと、アブソリュートタイプがあり、前者は相対位置、後者は絶対位置が取得できます。
しかし、ロボットなどではモータに減速機を取り付けて駆動させるため、モータ1周内での絶対値取得をするメリットは少ないので、インクリメンタルタイプが良く使われています。
しかし、これだけでは回転量はカウント出来ますが、回転方向を知ることが出来ません。なので、通常は2個のLEDを、ちょっとだけズラした位置に配置し、その光のON/OFFのズレ(どっちが先にONになるか?どっちが先にOFFになるか?)で、方向を知ることになります。つまり、スリット1枚が通過するのに、信号としては
A相 0 1 1 0
B相 0 0 1 1
という4つの状態を得ることができるので、これを4逓倍(ていばい)という表現をします。ちなみに、上記を正回転とすると、
A相 0 0 1 1
B相 0 1 1 0
の時は逆回転していることになります。
エンコーダの仕様を見ると、256カウント(スリット)などと書かれていますが、値を取得すると、センサ1回転に付き1024(256の4倍)の値が取得できます。
1周360度なので分解能は0.35度ということになります。100対1の減速機を付けたモータであれば、出力軸側の分解能は0.0035度となり、非常に細かく現在値を知ることが出来ます。

速度制御の際のエンコーダは、一定時間での上記カウント変化量を使って差分で速度に変換する方法もありますが、一般的にはA相、B相のパルスの長さを計測し速度を割り出します。

さらに、エンコーダにはZ相という3相目があるものもあります。これは1周のうち1箇所だけスリットが入っていて、そのスリットを通過すると1周回ったことが分かります。よく、Z相付きのエンコーダで絶対位置を取得するというお話がありますが、減速機を付けたシステムでZ相だけで絶対位置を取得することは出来ません。
方法としては、ゼロ点付近に近傍センサを取り付け、それが反応したらその近傍のZ相を探し、その位置をゼロ点としたり、可動範囲の両端まで動かして、リミッタがかかった位置からx回目のZ相をゼロ点とするなどの方法になり、少なからず別のセンサが必要になります。
もしくは、富士通のHOAPのように、ゼロ点姿勢になるような冶具を用意し、その姿勢で電源を投入して、その姿勢をゼロ点とする方法もあります。

なんでそんな面倒なことをしてまで、エンコーダが使いたいかというと、関節の最終段に取り付けたポテンショメータで現在値を取得する方法が容易に絶対角度が取得でき、非常に簡単ですが、これだと、アナログのノイズの問題や、モータとポテンショメータ間に機械的なガタ(バックラッシュ)が生じてしまい、このバックラッシュは制御不能な箇所なので、結果として、あまり制御ゲインを高く出来ません。
高くすると、ピクついたり、最終段は動いていないのにモータだけが正逆転を繰り返し、異音が生じます。
エンコーダの場合は、多くはモータ軸に直結しているので、デジタル信号でバックラッシュがセンサとモータ間に生じないという理由で適切な制御ゲインで制御がかけられます。
ただし、バックラッシュが存在するシステムでは、モータは正しい位置に静止しているのに、バックラッシュ分だけ出力軸側がズレているという問題は残ります。