Arduinoで可変抵抗を読む|配線と値の取得を徹底解説
可変抵抗(ポテンショメータ)は、つまみを回すと抵抗値が連続的に変化する部品です。ArduinoのanalogRead()と組み合わせれば、回転角度を数値として扱えます。本記事では、配線の基本からコードの書き方までを解説します。さらに、取得した値を用途に合わせて変換する方法まで、初心者の方に向けて順を追って紹介します。
01可変抵抗とは|analogReadとの関係
可変抵抗(ポテンショメータ)の仕組み
可変抵抗は、つまみを回すことで内部の抵抗値が変化する部品です。ボリュームやポテンショメータとも呼ばれます。オーディオ機器の音量つまみを思い浮かべると、イメージしやすいでしょう。この抵抗値の変化を利用すると、回転角度に応じて電圧を連続的に変化させられます。
なぜアナログピンで読み取るのか
タクトスイッチのようなデジタル入力は、HIGHかLOWかの2値しか扱えません。しかし、可変抵抗が出力する電圧は違います。0Vから5Vまで連続的に変化するのです。この連続的な値をコードで扱うには工夫が必要です。digitalRead()ではなくanalogRead()を使う必要があります。ArduinoのA0〜A5のようなアナログ入力ピンは、このために用意されています。連続的な電圧を数値に変換してくれるのです。
タクトスイッチの読み取りを一通り学んだSさんは、次のテーマに興味を持った。「押す・押さない」ではなく「どれくらい回したか」を知りたくなったのだ。そこで可変抵抗の存在を知り、analogReadで値を取得してみた。すると、つまみの角度に応じて0から1023まで滑らかに変化する数値を得られた。デジタル入力とアナログ入力の違いを実感できる、良い題材です。
02analogReadの基礎知識

0〜1023という数値の意味
Arduino Unoには「ADC(アナログ-デジタル変換回路)」が内蔵されています。これは電圧を数値に変換する回路です。Arduino公式のanalogRead()リファレンスによると、このADCは10ビットの分解能を持ちます。10ビットとは、2の10乗、つまり1024段階という意味です。0Vのときは0、5Vのときは1023という数値が得られます。その間の電圧は、比例した数値として返されます。
電圧との対応関係
公式リファレンスでは、電圧の刻み幅も説明されています。5V÷1024、つまり約4.9mV刻みで電圧を読み取れるとのことです。これはかなり細かい精度です。人の手でつまみを回す用途であれば、十分すぎるほどの分解能だと言えるでしょう。
| つまみの位置 | 入力電圧の目安 | analogRead()の値 |
|---|---|---|
| 最小(片方の端) | 0V | 0 |
| 中間 | 約2.5V | 約512 |
| 最大(反対側の端) | 5V | 1023 |
※どちら側が最小・最大になるかは、配線のつなぎ方によって変わります。
03配線方法:Arduinoと可変抵抗

3本足の接続
一般的な可変抵抗には、3本の足があります。両端の2本は電源用です。それぞれ5VとGNDにつなぎます。中央の1本は「ワイパー」と呼ばれます。ここが、回転角度に応じて変化する電圧の出力です。このワイパーを、ArduinoのアナログピンであるA0などにつなぎます。
両端の接続順序について
両端のどちらを5V、どちらをGNDにつなぐかは、動作上どちらでも構いません。ただし、つなぎ方によって結果が変わります。つまみを右に回すと値が増えるか減るか、という対応が変わるのです。実機で動かしながら、自分の配線での対応を確認しておくとよいでしょう。
編集部の見解として、可変抵抗の配線で迷ったら1つだけ覚えておいてください。「両端は電源、真ん中は出力」という役割です。3本足のうち、どれが電源でどれが出力かさえ間違えなければ、大きなトラブルにはつながりません。
04基本のコード|analogReadで値を読み取る
最小構成のコード
配線ができたら、コードで値を読み取ってみましょう。analogRead()にピン番号を渡すだけです。それだけで、0〜1023の値を取得できます。
// 可変抵抗の値をシリアルモニタに表示するコード
const int potPin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(potPin);
Serial.println(value);
delay(100);
}
シリアルモニタで値を確認する
このコードを書き込んだら、シリアルモニタを開いてみましょう。つまみを回すと、0から1023の間で数値が滑らかに変化する様子を確認できます。値がまったく変化しない場合は、配線を見直してください。多くの場合、原因は決まっています。ワイパー(中央のピン)ではなく、電源側のピンをアナログ入力につないでいるのです。
05値を変換する|map()関数の使い方

map()の基本構文
analogRead()が返す0〜1023という範囲は、そのまま使うには不便な場合があります。例えば、LEDの明るさを指定するanalogWrite()は0〜255の範囲を必要とします。このようなときに使うのがmap()関数です。Arduino公式のmap()リファレンスによると、この関数の働きは明快です。ある範囲の数値を、別の範囲の数値に変換してくれます。
// map()の基本的な使い方
int value = analogRead(A0); // 0〜1023の範囲で取得
int brightness = map(value, 0, 1023, 0, 255); // 0〜255の範囲に変換
変換先の範囲は自由に指定できる
変換先の範囲は、用途に応じて自由に指定できます。例えば、サーボモーターの角度に変換したいとしましょう。0〜180度の範囲であれば、次のように書きます。
int value = analogRead(A0);
int angle = map(value, 0, 1023, 0, 180); // サーボの角度用に変換
サーボモーターの制御方法については、下記の記事で詳しく解説しています。
整数計算による誤差に注意
公式リファレンスには注意点も書かれています。map()は整数の計算を行うということです。そのため、小数点以下は切り捨てられます。電圧のようにミリボルト単位の精密さが必要な場合もあるでしょう。そのときは、map()に頼らず自分で計算式を書くことも検討してください。
06実践例:可変抵抗でLEDの明るさを調整する

3つの関数を組み合わせる
ここまでの内容を組み合わせてみましょう。可変抵抗を回してLEDの明るさをリアルタイムに調整するプログラムが作れます。流れは3ステップです。analogRead()で値を読み取ります。map()で変換します。そしてanalogWrite()でLEDに出力します。
実装コード
// 可変抵抗でLEDの明るさを調整するコード
const int potPin = A0;
const int ledPin = 9; // PWM対応ピン(~マーク付き)を使用
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int value = analogRead(potPin); // 0〜1023の範囲で読み取る
int brightness = map(value, 0, 1023, 0, 255); // 0〜255の範囲に変換
analogWrite(ledPin, brightness); // LEDの明るさに反映
Serial.println(brightness); // 確認用に値を表示
delay(50);
}
この構成は、Arduinoの入門プロジェクトとして広く使われている定番の組み合わせです。LEDの配線や抵抗値の考え方については、下記の記事も参考にしてください。
07よくあるトラブルと対処法
症状別の対処早見表
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| 値がまったく変化しない | 電源側のピンをアナログ入力につないでいる | 中央のワイパーをアナログ入力ピンにつなぎ直す(3章参照) |
| 値が常に0または1023で固定 | ワイパーが5VまたはGNDに接触したまま | 配線とはんだ付け、接触状態を再確認する |
| map()で変換した値がおかしい | 変換元・変換先の範囲指定を間違えている | map()の引数の順序(元の範囲→変換先の範囲)を見直す |
| LEDの明るさが変化しない | PWM非対応のピンにLEDをつないでいる | ~マーク付きのPWM対応ピンに配線し直す |
| 値が細かくふらつく | 可変抵抗の特性やノイズによる微小な変動 | 複数回の平均を取るなど、数値の安定化処理を加える(FAQ参照) |
原因を素早く切り分けるコツ
Tさんは可変抵抗を配線したが、シリアルモニタの値がまったく変化しなかった。配線図を見直しても、間違いは見当たらないように思えた。そこで、3本のピンのどれをどこにつないだか、1本ずつ指でなぞって確認してみた。すると、原因がわかった。中央のワイパーではなく、電源側のピンをアナログ入力につないでいたのだ。配線し直すと、値は正しく変化するようになった。
08よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「analogRead・analogWriteの使い方」2026年, https://yofukasi-lab-wp.com/2026/07/30/analog-read-analogwrite/
- YOFUKASI LAB「Arduinoに必要な工具・部品リスト」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-tools-parts/
- YOFUKASI LAB「Arduinoでタクトスイッチ入力|配線とコード」2026年, https://yofukasi-lab-wp.com/2026/08/27/arduino-tact-switch-input/
応用・トラブルシューティング記事
- YOFUKASI LAB「Arduinoでサーボモーターを制御する方法」2026年, https://yofukasi-lab-wp.com/2026/08/18/servo/
- YOFUKASI LAB「Arduinoのシリアルモニタ活用術」2026年, https://yofukasi-lab-wp.com/2026/08/22/arduino-serial-monitor-debugging/
- YOFUKASI LAB「Arduinoのコンパイルエラー一覧」2026年, https://yofukasi-lab-wp.com/2026/07/30/error/
参考資料(外部・一次情報)
- Arduino Documentation「analogRead()」, https://docs.arduino.cc/language-reference/en/functions/analog-io/analogRead/
- Arduino Documentation「Read Analog Voltage」, https://www.arduino.cc/en/Tutorial/ReadAnalogVoltage
- Arduino Documentation「map()」, https://docs.arduino.cc/language-reference/en/functions/math/map/
※本記事は個人の学習・電子工作用途を対象にしています。実際の製品や医療機器へ組み込む場合は、電気安全・製品規格の専門家に別途ご相談ください。
コメント