Arduino nanoを使ってアナログ入力の動作確認
Arduino nanoのADCを確認します。
nanoにはADCが8ポート実装されており、それぞれ電源電圧5V / 10bit(1024段階) = 4.88mVの分解能があるようです。
前回のLEDプログラムに組み込めば可変抵抗器で点滅や明るさをコントロールできますね。
始める前に注意点
今所有しているArduino nanoはV3.0です。
別バージョンとは少し異なる点があります。
アナログ入力A0~A7が入れ替わっているのが分かります。
シルクに記載されていますが間違えないように。
用意したもの
前回の流用品
- Arduino nano
- PC(Windows 10)
- Arduino IDE
- USBケーブル(Aオス-ミニBオス)
アナログ入力の確認に追加した部品は以下
- 可変抵抗器 10kΩ
- 抵抗器 10kΩ
- 抵抗器 2kΩ←途中で追加
- 抵抗器 220Ω←途中で追加
- ブレッドボード
- ジャンパー線
アナログ入力回路を考える
簡易的な接続図も用意しました。
アナログ入力は基準電圧(デフォルト+5V)を対して10bit、1bit 4.88mVの分解能をもっています。A2は10KΩの固定抵抗で約1.65V、A0は可変抵抗10kΩを操作して3.3~1.65Vを読み取る構成となっています。3.3V-A0間が0Ωの時A0が読み取る値は1023、10kΩの時はA0は511になります。A2は固定ですので511のままです。
プログラミングする
プログラムはArduino.ccのリファレンスを参考に作り上げます。
https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
analogRead(Pin)を使いA0とA2を読み取る。
Pinに入れる数値は前回のデジタルピンと同じくA0なら0、A2なら2。
簡単に取得した値を表示するように作り出来上がったプログラムを書きこんで実行!
1秒ごとにA0とA2の階調と計算より求められた電圧が表示される。
が、値がおかしい。
1s辺りはA0=A2=1.65Vを示すはずだが取得値が434となっている。
電源電圧 5V / 1024 = 4.88mV
434 × 4.88mV = 2.12V
全然違いますね…。
それにボリュームを最小にしても3.3V付近とはならず。
10sは848とあり4.14Vとなっています。
困りましたね。
初めはプログラムミスかと思ったんですが問題なさそうでした。
で電圧周りを調べることに。
すると、3.3Vは正常だったんですがUSB電源に問題がありました。
USB電源は4.4V程度で内部5V電源は4.13Vとなっていました。
(+5V AUTO SELECTORのD1、Vfが0.38Vmaxだからかな)
動かすだけであればATmega328/Pは動作電圧1.8V~5.5Vで範囲内なので問題ないのですが、供給している電源が5Vに安定する安定化電源を使わない限りアナログ入力を取得したところで正確な電圧値を求めるのは無理そうです。(マイコン自体に電源電圧値を取得できるならいいのですが)
回路の見直し
仕方なくレギュレーターで安定している3.3V電源を使用することに。
変更点を回路図に赤線で記載。
可変抵抗が接続されている3.3VをAREFへ繋げる。
そしてプログラムのsetupにanalogReference(EXTERNAL)を追加する。
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/
これでアナログの基準電圧はAREFに印加された電圧になる。
AREFが3.3Vとなったことで1023がおおよそ3.3V、511辺りが1.65V
一見良さそうなんですが、実際の測定値だと誤差1.7%。
こんなものですかね(多分
でも、VREFを使うと5V読みたい時どうするのか。基準3.3Vだからそれ以上は測れない。
もうちょい考えて次の手段に。
回路の再見直し(多分完成)
回路はこんな感じ。
AREFは未接続で電源電圧を基準に出来ます。
アナログA0はそのまま分圧で3.3V~0Vを測定する構成です。
左側の分圧回路は5Vを1/10にしてA7で測定出来るようにしてます。
なぜ、基準電圧1.1Vにして測定するのか。
1.1Vが他電源より正確であることを期待し、デフォルトの基準電圧である電源5Vが実際にいくつか測定するのです。(実際はUSBが4V:0.396….V それに抵抗、電圧誤差で結果はバラツキがありますが)
方法としては、Arduino起動時のsetup中にアナログ基準電圧を内部電源1.1Vに設定します。
A7の値(実際の電圧の1/10になっている)を取得後、値を10倍して大体の電源電圧を求めます。
再度アナログ基準電圧をデフォルトに戻してA0を測定するというもの。
で、やってみたらそれらしく出来た。
VCCはVINのこと。実際にテスターで測っても4.05Vとなってていい感じ。
でも、何度も起動してもVCCは4.00Vと出る…おかしい。
で、float使ってなかったのと基準電圧1.1V周りの計算式を見直したらミスがあった。
(基準電圧1.1Vで取得した値じゃなく測定からの”4″Vを入れてた….ぅゎぁ)
けれど、うまくいかないという現実。
問題点の解決
長いこと悩んだ結果分かったのが基準電圧を決めるanalogReference();がsetup内で正常に動作せずINTERNALへ変わらなかった。(その影響で上の電源測定値”4″Vで計算して測定値に近い値が出ていた。)
最終的にINTERNAL(内部電圧基準)を設定後、1秒ディレイを入れてから電圧値を取得した後にDEFAULT(電源電圧基準)に戻すことで解決。内部のセレクタが切り替わるタイミングが悪かったのかな?
更に、周りの影響か静電容量関係か分かりませんが、アナログ入力を1回読み取りだと若干低い値になるのでfor文で3回繰り返して測定値に近い値を出しています。
・電源5V
測定値:4.05V
取得値:3.942V
誤差 :2.7%
・アナログ入力A0
測定値:0V, 1.540V, 2.510V, 3.276V
取得値:0V, 1.505V, 2.561V, 3.338V
誤差 :0%, 2.3%, 1.9%, 1.8%
それっぽく動いているので大丈夫そう。
けど、色々頑張ってやってみたけどどうなんだろうね。
面倒なことやってますな~って上級者から言われそう。
と言うか、ご指摘待ってます~。
今回のプログラムはここ。