analogReference

動作

analogRead関数で端子の電圧を読み取るときの基準電圧(リファレンス電圧)を設定します。ただし、この関数は利用できないボードがありますので注意が必要です(ESP32やRaspberry Pi Picoでは利用できません)。

例えば5V動作のArduino Uno R3では、デフォルトでは5Vが基準電圧になっています。analogRead関数を実行すると、0Vのときに0、5Vのときに1023という数値で読み取ります。

この基準電圧はanalogReference関数で変更することができます。例えば、基準電圧を1.1Vに変更すると、0Vのときに0、1.1Vのときに1023という数値で読み取るようになります。つまり、基準電圧を下げると、狭い電圧範囲をより細かく読み取ることができます。

例えば、1℃あたり6.25mV変化するアナログ温度センサーの電圧を読み取る場合、基準電圧5V・10ビット分解能では、1ステップが約4.89mV(5V÷1023)刻みのため、1ステップ=0.78℃(4.89÷6.25)になります。つまり0.78℃より細かい変化は読み取れないことになります。

基準電圧を1.1Vに変更すると、1ステップが約1.07mV(1.1V÷1023)刻みのため、1ステップ=0.17℃(1.07÷6.25)になります。つまり、0.17℃の変化が読み取れることになります。

このように、低い電圧範囲のセンサーをより細かく測定したいなどの場合に、analogReference関数で基準電圧を変更すると効果的です。

補足

選択できる基準電圧はArduinoボードごと(マイコンごと)に決まっています。具体的には「補足:analogReferenceで指定できる基準電圧」をご参照ください。

なお、ESP32Raspberry Pi Picoなどのボードでは利用できませんので注意が必要です。ESP32とRaspberry Pi Picoはハードウェア的に基準電圧を変更できないためです。詳細は補足セクションをご確認ください。

書式

analogReference(type);
引数type使用する基準電圧の種類を定数で指定します。
指定できる定数はボードによって異なります。代表的なボードの定数は次のとおりです(詳細は「補足:analogReferenceで指定できる基準電圧」を参照)

Arduino Uno R3:
DEFAULT(5V)
INTERNAL(1.1V)
EXTERNAL(AREFピン電圧)

Arduino Uno R4:
AR_DEFAULT(5V)
AR_INTERNAL(1.5V)
AR_INTERNAL_1_5V(1.5V)
AR_EXTERNAL(AREFピン電圧)

Arduino Zero:
AR_DEFAULT(3.3V)
AR_INTERNAL(2.23V)
AR_INTERNAL1V0(1.0V)
AR_INTERNAL1V65(1.65V)
AR_INTERNAL2V23(2.23V)
AR_EXTERNAL(AREFピン電圧)
戻り値なし

主な用途

  • 出力電圧範囲が低いアナログセンサー(温度センサー、フォトダイオードなど)を高精度で読み取る
  • ボードの電源電圧の変動の影響を受けずに高精度測定を行う
  • 外部の高精度基準電圧IC(リファレンスIC)を使用して測定精度を上げる
外部基準電圧を使用する場合の注意点

Arduinoボードの「AREFピン」に外部から電圧を供給する場合、analogRead関数を呼び出す前に必ずanalogReference(EXTERNAL)(またはAR_EXTERNAL)を実行する必要があります。(AREF:Analog Reference)

この設定を行わない状態でAREFピンに外部電圧を供給すると、マイコン内部で生成された基準電圧とAREFピンの外部電圧がショートしてしまい、マイコンを破損する可能性があります。

安全対策として、外部電圧は5kΩ程度の抵抗を介してAREFピンに接続することが推奨されています(詳細は「実践テクニック:外部基準電圧を安全に使用する」を参照)。

補足

analogReference関数は、通常setup関数の中で1回だけ呼び出します。

基準電圧を変更した直後の数回分のanalogReadの読み取り値は、ADC内部回路の基準電圧が安定するまでに少し時間がかかるため正確でない場合があります。安定した値を取得したい場合は、基準電圧変更後にanalogReadを数回実行して、最初の値は捨てる方法が有効です。

補足

ピンの電圧をより細かく読み取る方法には、「基準電圧を下げる(analogReference関数)」方法と、「分解能を上げる(analogReadResolution関数)」方法の2種類があります。それぞれ特徴がありますので、用途に合わせて使い分けてください(詳細は「補足:基準電圧の変更と分解能の変更の使い分け」を参照)。

使用例

次のコードにより、analogRead関数の基準電圧を変更することができます。

// Arduino Uno R3 / Nano / Mega などAVR系ボードの場合
analogReference(DEFAULT);   // 動作電圧(5V または 3.3V)を基準電圧に設定(デフォルト)
analogReference(INTERNAL);  // 内蔵1.1V基準電圧(ATmega328Pの場合)に設定
analogReference(EXTERNAL);  // AREFピンに供給した外部電圧を基準電圧に設定

// Arduino Uno R4 の場合
analogReference(AR_DEFAULT);   // 動作電圧(5V)を基準電圧に設定(デフォルト)
analogReference(AR_INTERNAL);  // 内蔵1.5V基準電圧に設定
analogReference(AR_EXTERNAL);  // AREFピンに供給した外部電圧を基準電圧に設定
ポイント

ボードによって指定できる定数が異なる点に注意してください。

AVR系ボードでは「DEFAULT」「INTERNAL」「EXTERNAL」のように接頭辞なしで指定しますが、Uno R4やZero、MKRシリーズなど新しいボードでは「AR_DEFAULT」「AR_INTERNAL」「AR_EXTERNAL」のように「AR_」が付きます(Analog Referenceの略)。

スケッチを別のボードに移植する際は、analogReferenceに指定する定数の修正が必要になることがあります。

サンプルスケッチ

以下の回路とスケッチは、基準電圧を1.1Vに変更して可変抵抗の値を読み取ります。

本来であれば、低電圧出力のアナログ温度センサーなどを使用した方がわかりやすいですが、シミュレータの部品ラインナップの関係上、次の回路とスケッチをサンプルとしました。

この回路では、ハードウェア的には可変抵抗のツマミが一番左側のとき0V、一番右側のとき5Vの出力になります。この出力電圧をA0端子で読み取ります。

基準電圧がデフォルト設定、つまり5Vの時は、ツマミを一番右側(5V)にするとanalogReadの読み取り値は1023になります。しかしこのスケッチではanalogReference基準電圧を1.1Vに変更しています。そのため、つまみを一番右側から20%程度動かしただけでanalogReadの読み取り値は1023になります。

このようにanalogReferenceを使用すると、小さい電圧範囲を細かく読み取ることができます。

ボタンをクリックするとシミュレーターが動作します。スケッチを変更することもできます。変更した場合、シミュレーションを一度 ボタンをクリックして停止してから再度シミュレーターを開始してください。