このネタは、良くある複数スイッチを抵抗ネットワークでデコードして、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); }