【概要】
analogRead() は、Arduino環境において指定されたアナログ入力ピンの電圧を読み取り、それをデジタル値に変換(A/D変換)して返す標準関数である。この関数は、MCU(マイクロコントローラ)に内蔵されたADC(Analog-to-Digital Converter)モジュールを制御し、連続的なアナログ信号を離散的な整数値へと量子化する役割を担う。
【仕様】
- 引数:
int pin(アナログ入力ピンの番号。例:A0,A1等) - 戻り値:
int(変換された数値) - データ型:
int(符号なし整数の範囲で返される) - 解像度: 使用するマイコンボードによって異なる。
- Arduino Uno / Nano / Mega: 10ビット(0〜1023)
- ESP32 / Arduino Due: 12ビット(0〜4095)
- 基準電圧 ($V_{ref}$): デフォルトでは $V_{cc}$(通常5Vまたは3.3V)が基準となる。
【技術的特徴】
- ADCの仕組み: 入力電圧を基準電圧で割り、解像度を乗算することで算出される。例(10ビットの場合): $Value = (V_{in} / V_{ref}) \times 1023$
- ブロッキング動作: 多くの実装において、
analogRead()はADCの変換処理が完了するまで処理を待機(ブロッキング)する挙動を示す。高速なサンプリングが必要な場合、変換時間を考慮する必要がある。 - サンプリングレート: 関数をループ内で呼び出す際、ADCの変換速度がボトルネックとなり、ハードウェアの限界以上のサンプリング周波数は取得できない。
【注意点】
- 入力インピーダンスの影響: ADC入力端子のインピーダンスは有限である。高抵抗の分圧回路やセンサーを接続する場合、ADC内部のコンデンサの充放電速度が追いつかず、正しい値が得られない可能性がある。ソースインピーダンスの低い回路設計、またはバッファ回路(オペアンプ等)の追加を検討せよ。
- エイリアシングとノイズ: 高周波ノイズを含む信号を高速にサンプリングすると、エイリアシングが発生する。正確な計測のためには、ハードウェア的なローパスフィルタの適用や、ソフトウェアによる移動平均フィルタの実装が推奨される。
- 電圧の飽和(Clipping): 入力電圧が $V_{ref}$ を超えた場合、値は最大値で飽和する。過電圧によるADCチップの破損を防ぐため、分圧回路等を用いて入力を範囲内に収めること。
- 電源電圧の変動: $V_{cc}$ を基準電圧としている場合、電源のリップルや変動が測定値に直結する。精密な測定が必要な場合は、外部基準電圧(AREF)の使用を検討せよ。
【サンプルコード】
/*
* アナログ入力(ポテンショメータ等)の読み取りとシリアル出力
* 解像度:10ビット(Arduino Uno等)を想定
*/
const int SENSOR_PIN = A0; // 使用するアナログピン
const float REFERENCE_VOLTAGE = 5.0; // 基板の基準電圧
const int RESOLUTION = 1023; // 10ビット解像度
void setup() {
Serial.begin(9600);
Serial.println("Starting ADC Read...");
}
void loop() {
// アナログ値の取得
int rawValue = analogRead(SENSOR_PIN);
// デジタル値を電圧に変換
float voltage = (rawValue * REFERENCE_VOLTAGE) / RESOLUTION;
// 結果の表示
Serial.print("Raw Value: ");
Serial.print(rawValue);
Serial.print(" | Voltage: ");
Serial.print(voltage);
Serial.println(" V");
delay(100); // 10Hzのサンプリングレート
}
【活用例】
- ポテンショメータによる操作: ボリュームノブやジョイスティックの角度・位置情報を取得し、音量や移動量を制御する。
- 光センサー(LDR)による環境監視: 周囲の照度変化を捉え、自動照明システムの制御を行う。
- アナログセンサーのデータ取得: LM35(温度センサー)、土壌水分センサー、ガスセンサー等のアナログ出力値をデジタルデータとして処理する。


コメント