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本です。
- USBケーブルを抜き、ボードに電源が入っていない状態にする。
- 可変抵抗をブレッドボードに挿す。3本の足がそれぞれ別の列に入るようにする。
- 片側の端の足を、ボードの5Vにジャンパー線でつなぐ。
- 反対側の端の足を、ボードのGNDにつなぐ。
- 真ん中の足を、ボードのA0につなぐ。
- 真ん中の足が5VやGNDにつながっていないことを、指で配線をたどって確かめてからUSBをつなぐ。
最後の確認には理由があります。真ん中の端子を5Vに、端の端子をGNDにつないでしまうと、つまみをGND側に回し切ったときに、5VとGNDがほぼ0Ωでつながり、短絡(ショート)になります。可変抵抗が熱を持ったり、ボードやUSBの電源に負担をかけたりする原因になるので、真ん中の端子はアナログ入力端子だけにつなぐ、と覚えておきます。

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










