Yamaguchi Mini Maker Faireの出展中、フライトヨークやペダルでアナログ値をどうやって入力しているのかを何度か聞かれたので、簡単に説明します。
OpenStickのアナログ入力はPIC18F2550マイコンに搭載されているA/D変換器を用いており、10本までアナログ入力端子を使用する事ができます。 このA/D変換器はアナログ入力端子の電圧を10bitの分解能(=1024分割)で数値に変換するのですが、この時の基準となるのがVREF+とVREF-で、VREF+の電圧値を最大値、VREF-を最小値とし、この間を1024で均等割りした電圧とアナログ入力端子の電圧が一致する値に変換します(なんか言葉で表しにくい)。
OpenStickではVREF+を5V、VREF-を0Vに設定しているので、アナログ入力端子が0Vの場合、変換結果は(誤差を無視すると)0となり、5Vならば1023、中間値では電圧に比例した数値となります。
結局、アナログ入力端子に0~5Vの電圧を入れてやれば良いという事になるので、フライトヨークでは(安直に)下図の様な可変抵抗で角度に応じた0~5Vを作り出しています。
実際の構造はこんな感じです↓
なお、PIC18F2550のマニュアルによるとアナログ端子に与える電圧は5KΩ以下のインピーダンスでなければ精度が悪くなると書かれているので、可変抵抗は5~10KΩ程度のものを使用しています(抵抗値をうんと下げると理屈の上では精度は向上するが、無駄に電流が流れるので程々にすべきでしょう)。
可変抵抗にはAカーブ、Bカーブ、Cカーブ等の種類があります。これは回転角に対する抵抗値の変化をプロットした場合のカーブを示すもので、この内ほぼ直線的に変化するBカーブを用います。
また、0V~5Vの電圧を入力できるなら可変抵抗以外でも同様に動作します。例えばAcceleStickでは加速度センサーの出力を下図の様にオペアンプで適度な電圧に変換してOpenStickに与えています。
なお、上にも書きましたがPIC18F2550のA/D変換器の分解能は10bitです。しかしOpenStickでは下位2bitは捨て、8ビット分のデータとしてPC側に渡しています。
(ちなみに市販のジョイスティックも8bitでした。ヨークやペダルではあまり分解能は要らないと思ってこうしていますが、もし分解能をあげる用途があれば教えてください)