メモ - AD変換でスイッチをたくさん扱う

多数のプッシュスイッチがあって同時押しを考慮しない場合、AD変換でなんとかしようという試みは割と一般的だが、なんとなく不思議な回路が用いられていることが多い。

synapse.kyoto

wiki.dfrobot.com

ここらへんの回路を見て言っている。

これでいい気がする。

youtube.com

実験では袋の表示を見間違えて270Ωを使っている。うまく行っているのでヨシ! 計算上でも問題なさそう。下の図は100kΩ込で計算している

スイッチ 分圧比 3.3V電源 5V電源 10bitADC 8bitADC
1 0.92 3.02 4.58 939 235
2 0.83 2.75 4.17 853 213
3 0.75 2.47 3.75 768 192
4 0.67 2.20 3.33 683 171
5 0.58 1.92 2.92 597 149
6 0.50 1.65 2.50 512 128
7 0.42 1.37 2.08 427 107
8 0.33 1.10 1.67 341 85
9 0.25 0.82 1.25 256 64
10 0.17 0.55 0.83 171 43
11 0.08 0.27 0.42 85 21
12 0.00 0.00 0.00 0 0

一応両者にメリット・デメリットがある。

  • 今回の方式
    • メリット
      • 部品の種類が少ない(抵抗が2種類だけで良いし、場合によっては抵抗アレイを導入できる)
    • デメリット
      • 部品点数が1つ増える(抵抗が(SW数+1)個、抵抗アレイを入れれるとその限りではない)
      • 消費電力の最大値が大きい(同時押しが発生するとVcc/R[mA]の消費電力が発生する)
  • 一般的な方式
    • メリット
      • 消費電力の最大値が大きくない
      • 部品点数が多くない(抵抗はSW数と同じだけで済む)
    • デメリット
      • 一般的ではない抵抗値が必要になる場合がある(E系列で丸めてしまって問題ない場合が多数なのでそこまでデメリットではない)
      • 部品の種類が多く必要になる(抵抗のバラ売りはないor高い、大量製造の場合、結局調達コストは変わらなくなるのでデメリットではなくなる)

要するに使い分けということになる。

ちなみにAD変換でなくても、INとOUTが切り替えできるGPIOか、INとOUTの2ピンが使える状況だったら、こんな回路でも行ける気がする。

  1. GPIOを出力・Highにしてコンデンサを充電
  2. GPIOを入力にしてLowになるまでの時間を図る(タイムアウトも考慮する、したらまた充電する)
  3. 放電にかかった時間から抵抗値(つまりどのスイッチが押されたか)を計算する。

古いマイコン入門書とかで見た気がする。