RL78/G13によるシリーズ・スイッチの判定

このネタは、良くある複数スイッチを抵抗ネットワークでデコードして、1本
のポートで読み込む為のガジェットで目新しさはあまり無い。

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

方向スイッチ:
dir_switch
※試作では、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スイッチ:
ab_switch
※もっと賢い抵抗値の選び方もあると思うので、参考程度に・・

    // 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);
    }

img_0837s

RL78/G13 A/D スイッチ・サンプル