スポンサーリンク
ものづくり・DIY

Arduinoで可変抵抗を読む|analogReadと分圧のしくみ、map()でLEDの明るさを変えるまで

analogReadのしくみ:0〜1023は何を表すか

電圧を数値に変える部品

Arduino Unoのボードの「A0」から「A5」と書かれた端子は、アナログ入力端子です。ここにかかった電圧を、ボードに載っているマイコンの中のA/D変換器(アナログ・デジタル変換器)が数値に変えます。スケッチで analogRead(A0) と書くと、A0の電圧を測った結果が整数で返ってきます。

スポンサーリンク

デジタル入力の digitalRead が「ある電圧より高いか低いか」の2択だったのに対し、analogRead は電圧の大きさを段階に分けて読みます。Unoでは、0Vから基準電圧(通常は5V)までを1024段階に分け、0から1023の数値で返します。1024という数は2の10乗で、これを「分解能が10ビット」と表現します。

数値と電圧の対応

読み取った値と電圧のおおよその対応は、次のとおりです。

analogReadの値 電圧の目安(基準5V) 可変抵抗の位置の例
0 0V(GNDと同じ) GND側に回し切った
256 約1.25V 4分の1
512 約2.5V 真ん中
768 約3.75V 4分の3
1023 5V付近 5V側に回し切った

1段階あたりの電圧は「5V÷1024」で約4.9mVです。つまり、Unoのアナログ入力は約5mV刻みで電圧を見分けていることになります。可変抵抗のつまみの位置を読むには十分細かく、手で回したときの小さな違いもきちんと数値に表れます。

基準電圧とボードの違い

アナログ入力の「上限」は基準電圧で決まります。Unoでは、何も設定しなければボードの電源電圧(約5V)が基準になります。USBの電源電圧は少し上下するため、基準も同じように揺れます。可変抵抗の両端をボードの5VとGNDにつないでいれば、可変抵抗にかかる電圧と基準電圧が一緒に揺れるので、位置を読む用途では影響がほとんど出ないのが利点です。

3.3V系のボードでは基準電圧が3.3Vになり、可変抵抗の両端も3.3VとGNDにつなぎます。また、ボードによってはアナログ入力が12ビット(4096段階)以上だったり、スケッチから分解能を変えられたりします。使うボードの公式資料で、アナログ入力の電圧の範囲と分解能を確かめてください。

アナログ入力端子には、0Vからそのボードの電源電圧までの範囲の電圧だけをかけます。範囲を超える電圧やマイナスの電圧をかけるとボードを傷めることがあります。ここで扱うように、可変抵抗の両端をボードの5V(3.3V系なら3.3V)とGNDにつないでいれば、範囲を超えることはありません。

スポンサーリンク

読み取りの速さ

analogRead 1回にかかる時間は、Unoでは0.1ミリ秒程度です。1秒間に数千回読める計算なので、手でつまみを回す操作を読むにはまったく問題のない速さです。一方で、短い時間に何百回も読む必要がある用途、例えば音の波形を細かく記録するような使い方には向かない、というくらいに考えておけば十分です。

配線とはじめのスケッチ

配線の手順

まずは、可変抵抗の値を読んで、パソコンの画面に表示するところまで進めます。用意するのは、Arduino Uno、ブレッドボード、B10Kの可変抵抗、ジャンパー線3本です。

  1. USBケーブルを抜き、ボードに電源が入っていない状態にする。
  2. 可変抵抗をブレッドボードに挿す。3本の足がそれぞれ別の列に入るようにする。
  3. 片側の端の足を、ボードの5Vにジャンパー線でつなぐ。
  4. 反対側の端の足を、ボードのGNDにつなぐ。
  5. 真ん中の足を、ボードのA0につなぐ。
  6. 真ん中の足が5VやGNDにつながっていないことを、指で配線をたどって確かめてからUSBをつなぐ。

最後の確認には理由があります。真ん中の端子を5Vに、端の端子をGNDにつないでしまうと、つまみをGND側に回し切ったときに、5VとGNDがほぼ0Ωでつながり、短絡(ショート)になります。可変抵抗が熱を持ったり、ボードやUSBの電源に負担をかけたりする原因になるので、真ん中の端子はアナログ入力端子だけにつなぐ、と覚えておきます。

可変抵抗の配線(1. 電源を切る、2. 端の足を5Vへ、3. 反対をGNDへ、4. 真ん中をA0へ、5. たどって確認)
真ん中の足はA0だけにつなぐ。

値をシリアルモニタに表示する

配線ができたら、次のスケッチを書き込みます。

const int potPin = A0;

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

void loop() {
  int value = analogRead(potPin);
  Serial.println(value);
  delay(100);
}

書き込んだら、Arduino IDEのシリアルモニタを開き、通信速度をスケッチと同じ9600に合わせます。つまみを回すと、0から1023のあいだで数値が変わるのが見えるはずです。回す向きと数値の増減が自分の感覚と逆なら、両端の足(5VとGND)を入れ替えます。スケッチを変えずに向きが逆になります。

delay(100) は、表示が速すぎて読めなくなるのを防ぐためのものです。0.1秒ごとに1回表示されます。アナログ入力端子は pinMode で設定しなくても analogRead で読めるので、setup には通信の開始だけを書いています。

シリアルプロッタで動きを見る

Arduino IDEには、シリアルで送った数値をグラフにする「シリアルプロッタ」があります。上のスケッチのまま開くと、つまみを回すにつれて線が上下するのが分かります。数値の列を目で追うより、値がなめらかに変わっているか、途中で飛んでいないか、止めているときに揺れていないかが一目で分かるので、この後のふらつき対策を試すときにも役立ちます。

次のページへ値を使いやすく変換する:電圧の計算とmap()
スポンサーリンク
  1. 秋の戸口に並ぶかぼちゃの明かりとかぶ、麦束
  2. 資料を手に落ち着いて話し合う二人
  3. ノートパソコンと資料、外付け記憶装置がある机
  4. 冬の木で越冬する卵のうやミノムシ、テントウムシ
  5. 青い折り鶴と三角に折った紙、無地の折り紙