M5StackではEspressif Systems社製の「ESP32」が使われていますが、ESP32のアナログ入力(analogRead)は精度が悪いと言われています。
これまで、精度の高いアナログ入力が必要な機会はあまりなかったので、analogReadを使用していても特に問題は感じなかったのですが、今回ちょっとしたきっかけで「analogReadMilliVolts()」という関数があることを知りました。
この関数は、キャリブレーションされた精度の高いアナログ電圧値をミリボルト単位で取得できるというものだそうです。
生のアナログ値を電圧値に補正する必要もなく、そのうえ精度も高いということで、とても便利に使えそうです。
そういう訳で、今回は「analogRead」と「analogReadMilliVolts」の測定結果を比較してみようと思います。
スケッチはこちらです。
#include <M5Stack.h>
void setup() {
M5.begin();
pinMode(36, INPUT);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextDatum(4);
}
void loop() {
int val1 = analogRead(36);
int val2 = analogReadMilliVolts(36);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.drawNumber(val1, 160, 60, 8);
M5.Lcd.drawNumber(val2, 160, 180, 8);
delay(2000);
}
同じアナログ入力信号(36番ピン)の電圧値を「analogRead」と「analogReadMilliVolts」で測定し、LCD画面に表示するだけのものです。
乾電池4本の出力に可変抵抗を付けて出力電圧を変更できるようにし、それをテスターとM5Stackにつなぎます。
テスターで出力電圧の値を確認し、そのときM5Stackに表示されている2種類の値を記録します。
それらの関係をExcelでグラフ表示してみました。
結果は以下のとおりです。
「analogRead」では2.5V以上で傾きが変わってしまっていますが、「analogReadMilliVolts」では、0.1V〜3.1Vの範囲でほぼ一直線になっています。
「analogReadMilliVolts」を使うことで、精度の高いアナログ値を取得できることが確認できました。
なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。