この話の続き。
確認方法
ADコンバータの入力インピーダンス(内部抵抗)が低いようながどうにも気になるので、ちょっとした確認実験。
この接続であれば、A0をanalogRead()すれば中間値の511になるはず(分解能が10ビットの場合)。これがどうなるかを見てみようという話。
実験
実験回路
10kΩ×2だけでなく、他の値でも確認してみる。一つは 4.7kΩ×2。これは割とよくあるであろうと思われる10kΩの可変抵抗を接続した状態と同じ(ちょうど真ん中を指した状況)。もう一つは、やや極端に100kΩ×2。これだとADコンバータの入力インピーダンスの影響が大きくなるはず。これらをジャンパピンで切り換えられるようにしたものを作る。下の回路図がそれで、抵抗値は実際に作ったものをDMMで実測した値。おまじない的にパスコンも付けた。
測定
Arduino UNO R3
まず、比較のためにArduino UNO R3(互換機)で測定する。
ソースコードと実行結果は以下の通り。
期待通りに511が得られた。4.7kΩ×2でも、10kΩ×2でも、100kΩ×2でも同じだった。
Arduino UNO R4 Minima
では、この実験の目的であるArduino UNO R4 Minimaで測定。
ソースコードは基本的な内容は同じだけど、ADコンバータの分解能を切り換えられるので、10ビットと14ビットをそれぞれ5回ずつ測定して切り換えるように変更した。
まずは4.7kΩ×2の場合。
10ビットの場合は510、あるいは、509。本来の511とほぼ同じではあるが、ちょっと小さい。509だとすると、511に対して0.4%ほど小さい。
14ビットの場合は本来は8191であるが、実際に得られたのは8156~8161。こちらも率にして約0.4%小さい。また、以前から読取り値がふらつくのが気になっていがた、ここでも再現した。
続いて、10kΩ×2。コードは同じなので、結果だけ。
10ビットの場合も14ビットの場合も、いずれもさらに小さい値になった。ふらつきも同様。
三つ目の100kΩ×2。
10ビットで473前後、14ビットでは7590前後。率にして、どちらも7%強。やはり、誤差はかなり大きくなる。
それから、分解能を切換えた直後の計測ではそれ以降よりも少しだけ大きな値が出る傾向があることにも気づく。分解能切替後にdelay(1000)で1秒もの待ち時間を与えているにも関わらず。分解能切換え後は一度空読みが必要なのかも。そんなことよりも、入力インピーダンスの低さによる影響のほうがずっと大きいが。
まとめ
Arduino UNO R4 MinimaのADコンバータは内部抵抗が小さいため、測定値が小さめになってしまう。これを軽減するにためには測定対象のインピーダンスをできるだけ小さくする。このため、Arduino UNO R3用に作ったものをそのままつなぐと結果が異なる可能性がある。
4.7kΩ×2でも誤差が出ることがわかったので、可変抵抗をつなぐなら、例えば1kΩ辺りの物を使うのが良いのかもしれない。消費電力が大きくなってしまうが。
また、Arduino UNO R4 MinimaではADコンバータの分解能を14ビットまで設定できるが、測定値のふらつきが大きくて実用的ではない。10ビットならふらつきは小さいので、結局のところ10ビットで使うのが無難。
余談
Arduino UNO R4 Minimaはメモリの使用量が多い。サンプルコードのBlink(いわゆるLチカ)をコンパイルした場合、Arduino UNO R3だと、
最大32256バイトのフラッシュメモリのうち、スケッチが924バイト(2%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2039バイト使うことができます。
Arduino UNO R4 Minimaだと、
最大262144バイトのフラッシュメモリのうち、スケッチが53632バイト(20%)を使っています。
最大32768バイトのRAMのうち、グローバル変数が4552バイト(13%)を使っていて、ローカル変数で28216バイト使うことができます。
というように、フラッシュメモリもRAMも大きく食ってしまう。とはいえ、絶対量がR3よりもはるかに多いので、ユーザが使用できる量はR4の方が多いのだけど。
【追記】追加実験
コメント