このネタは、良くある複数スイッチを抵抗ネットワークでデコードして、1本
のポートで読み込む為のガジェットで目新しさはあまり無い。
原理と動作は、分圧する抵抗を適切に選んで、直線性を維持する事で(直線性
が確かならデコードするソフトが楽なだけではあるけども・・)、かなり多く
のスイッチをデコードする事が可能となる、ただし、入力は排他的で、上位の
スイッチが常に優先される仕様となる。
※A/D変換の分解能を10ビットとした場合、抵抗ネットワークの直線性誤
差が+-10%の範囲なら5個のスイッチを認識できる事になる。
(計算方法が間違ってるかもしれないが・・)
※又、一般に流通している抵抗値には、限りがあるので、微妙な抵抗値を使っ
たネットワークは作りにくい為、あまり多くのスイッチを並べる事は難しいと
思われる。
方向スイッチ:

※試作では、6.8Kが無かったので、3.3Kを2個直列にした。
変形として、ネットワークのトポロジーを変えて、複数同時押しが可能なよう
なものも作れる、ただし、多くのスイッチを判定するのはより難しくなる。
スイッチ判定:
enum class SWITCH : uint8_t {
RIGHT,
UP,
DOWN,
LEFT,
A,
B
};
// 4つのスイッチ判定(排他的)
auto val = adc_.get(2);
val >>= 6; // 0 to 1023
val += 128; // 閾値のオフセット(1024 / 4(SWITCH) / 2)
val /= 256; // デコード(1024 / 4(SWITCH)
switch_bits tmp;
if(val < 4) {
tmp.set(static_cast(val));
}
ABスイッチ:

※もっと賢い抵抗値の選び方もあると思うので、参考程度に・・
// 2つのスイッチ判定(同時押し判定)
val = adc_.get(3);
val >>= 6; // 0 to 1023
if(val < 256) {
tmp.set(SWITCH::A);
tmp.set(SWITCH::B);
} else if(val < 594) {
tmp.set(SWITCH::A);
} else if(val < 722) {
tmp.set(SWITCH::B);
}
