Arduinoで実験 (アナログ値の読み取り)

2013/04/25

ボリュームといった方がなじみがあるが回転(ロータリー)式や平行移動(リニア)式の可変抵抗器をポテンショメータというらしい。 半固定抵抗等も可変抵抗器で、入力を抵抗で分圧する。

分圧回路は、5Vの信号を 3.3Vに変換する際等に必要となり、抵抗分割の法則を用いて算出する。 以下はその数式次の通り。

5Vの信号を 3.3Vに変換するには (3.3/5.0) の関係を作れば良いのだがズバリの抵抗値でなくともある程度マージンがあるので近似値で良さそうです。(R2=9.1K, R1=4.7K)

上記の比率を変更できる抵抗器が可変抵抗と呼ばれ R1+R2の値(最大の抵抗値)と可変カーブが規格としてあります。

103 は 10 の 3乗を表し 1-3 間の抵抗値が 10kΩであることが解ります。


◆ 値を読み取る

Arduino でアナログ値を読み取るには A0 ~ A5 の ANALOG IN の端子を使用します。 実験スケッチでは読み取った値をシリアル通信で送信しています。

種別 定格・品番 個数 備考
マイコン Arduino UNO 1  
半固定抵抗 10kΩ 1  

//
// 07-01 アナログ入力実験スケッチ
//

void setup() {
  Serial.begin(9600);
  Serial.println("START");
}

void loop() {
  Serial.println(analogRead(0));  // 読み取ってそのまま送信。
  delay(100);
}

AnalogRead() 関数を使用する際には pinMode() の設定は不要です。 analogRead() のピン番号は A の 0 ~ 5 となります。

実験からわかるように、左に回しきったら抵抗値が 0になるので、analogRead() の最大値 1023 が得られ、右に回しきると抵抗値が 10kΩになり、読み取る値が 0 となる。

実験データでわかるように、つまみを回していなくてもある程度の数値のばらつきが発生する。 map() 関数等を使用して分解能を落として使用するのが一般的です。

//
// 07-02 map()関数を使用して分解能を落とす実験スケッチ
//

#define val_MIN 10
#define val_MAX 0
#define def_MIN 0
#define def_MAX 1023

void setup() {
  Serial.begin(9600);
  Serial.println("START");
}

void loop() {
  int b = analogRead(0);
  b = map(b, def_MIN, def_MAX, val_MIN, val_MAX);
  Serial.println(b);
  delay(100);
}

上記の使い方だと、実際につまみを回す動作と得られる値が直感的に結びつきます。