2017年3月8日水曜日

Arduino のアナログピンで複数のスイッチの情報を取得してみた

概要

Arduino には 6 ピンもアナログピンがあります
がたくさんのスイッチを使う場合、それぞれでアナログピンを使うとすぐになくなってしまいます
今回は複数のスイッチの情報を 1 つのアナログピンで受け取って、どのスイッチが押されたのか判断する回路を組んでみたいと思います

環境

  • Mac OS X 10.11.3
  • Arduino IDE 1.6.7

配線

全体の配線図は以下の通りです
arduino_single_analog_circuit.jpg

オレンジが Arduino のアナログ 0 ピンにつながっています
黄色と黒が GND につながっています
赤が Arduino の 3.3V です

あとは 470Ωの抵抗をスイッチの数分、直列につなぎます
今回非常に残念ながらタクトスイッチが 1 つしかないのでスイッチは横に移動しながらアナログピンの値を取得していきました
arduino_single_analog_circuit_hint.jpg
※こんなイメージです
取得したら矢印のほうにタクトスイッチを動かす

スケッチ

単純にアナログリードしてシリアルモニタに出力するスケッチにしました

void setup() {
  Serial.begin(9600);
}

void loop() {
  int a = analogRead(0);
  Serial.println(a);
  delay(500);
}

できたら Arduino に書き込んで動作確認してみましょう

動作結果

おそらく以下のようになったと思います
スイッチは図の右から 1 つ目として数えていきます

  • 押していない時 = 659
  • 1 つ目押した時 = 0
  • 2 つ目押した時 = 328 ≒ 659 * 1/2
  • 3 つ目押した時 = 438 ≒ 659 * 2/3
  • 4 つ目押した時 = 493 ≒ 659 * 3/4
  • 5 つ目押した時 = 526 ≒ 659 * 4/5
  • 6 つ目押した時 = 548 ≒ 659 * 5/6

いわゆる分圧回路というやつで直列に繋がれた抵抗の間の電圧を取っていくと抵抗分、電圧が下がるという仕組みを使っているんだと思います

今回の場合は同じ抵抗を使ったので電圧の下がり具合が二次関数的な値になりました
なので、このままスイッチを直列に繋げていくとアナログの値が 659 に非常に近くなり、どのスイッチを押したのかが値だけだと判断が難しくなります
おそらく、9個目のスイッチで 659 * 8/9 = 585、10 個目のスイッチで 659 * 9/10 =593 の値になると思われるので、電圧が安定しない回路 ( 電源リソースが電池やバッテリーのもの ) だとアナログの値にブレが出てしまうので 9 個目と 10 個目どちらなのかがわからなくなるという感じです

なので今回の方法だと 5, 6 個くらいのスイッチを目処に使ってもらうといい感じになると思います

最後に

紹介は以上です
マイコンボードによってはアナログピンが 1 つしかないのもあるので、知っておくとかなり便利な技だと思います

また以下の参考サイトに記載されていましたが、次のスイッチにつなぐときの抵抗の値を適切な値にすることで取得できる電圧の値を線形にすることができるみたいです
そうすることでブレなくアナログの値を取得できるようになるのでそれにもチャレンジしてみたいと思います

参考サイト

0 件のコメント:

コメントを投稿