このアナログ入力機能の概要と使い方、そして使用する際の注意点をまとめていきたいと思います。arduinoのアナログ入力機能アナログ入力ピンについてarduinoの14番~19番ピンの6本のピンは、アナログ入力端子として割り当てられています。(0番~13番のデジタルI/Oと同様に使うことも出来ます)アナログ入力ピンとして使う場合は、デジタルピンとは別のピン番号で指定をします。それぞれアナログピン0番~5番として割り当てられているので、0とか3とか5とかといった具合に指定します。inの0~5とシルクがプリントされているので迷うことは無いかと思います。ちなみに、これらのアナログ入力ピンはAT-MEGA168のPC0~PC5端子に該当します。これらの端子に各種センサーなどを繋ぎ簡単なスケッチを書くことで、入力電圧を計測することができます。ちなみに、arduino-miniやnanoでは8本がアナログ入力に使用可です。アナログ入力の命令についてアナログ入力を行う関数はarduinoの標準機能に取り込まれています。以下の簡単な関数の式で利用することができます。(戻り値はint型)ピン番号に指定したアナログ入力端子からの入力電圧を数値化して返す関数です。0~5のアナログピン番号です。分解能で値を読み取ることが出来ます。0V~5Vの入力電圧はそれぞれ0~1023の値となって取り込まれることになります。4.995Vまでです)入力する電圧がおよそ0.0049V(=5V/1024)上昇するごとに取り込む値が1増える計算になります。AD変換で得た値が100であれば、100×0.0049V=0.49Vが入力されたという計算です。アナログ参照電圧は以下の命令によって3種類から選択することが出来ます。使用する場合は注意が必要です。MEGA8の場合は2.56V)内蔵1.1Vを使った場合、入力に使える電圧は0V~1.1Vとなります。1.099Vです)外部参照電圧を使う場合も同様です。正確な数値が得られないだけです。5V(Avccの電圧)を超えてはいけません。3軸加速度センサーを繋いで、加速度をシリアルケーブルでPC宛に送るスケッチです。delay(100);}写真は、reduino-nanoと秋月製3軸加速度センサーを繋いで実験中のものです。それをSerial.printでPC宛に送っています。接続してあり、Z軸からの入力データがLEDの明るさとなって現れるようになっています。参照電圧はデフォルトの5Vのままです。加速度0でおよそ2.5V出力となるので、アナログ入力の値はおよそ500程度になります。加速度が±2Gの範囲内まで計測でき、およそ0V~5Vの範囲内で変動することになります。温度センサーLM35arduinoに温度センサーLM35を繋いで温度を計ってみます。全角不等号に換えてあります。アナログ入力から取り込んだ値を実際の温度に換算して、PC宛にシリアル通信しているだけです。計算がとても簡単です。電圧値に戻し、それをさらに100倍して温度に換算しています。写真はreduino-nanoとブレッドボードで実際に実験中の様子です。3ピンのトランジスターのようなものがLM35です。アナログ入力の注意点プルアップ抵抗についてアナログ入力機能を使う場合、該当の入力ピンはプルアップ抵抗をオフにしてください。arduinoのアナログ入力ピンは、先述のとおりデジタル入出力ピンとしても使用することが出来ます。AVRの入力端子は、各ピンごとにプルアップ抵抗を使用/不使用を選択することができます。HIGHを出力することで設定されます。電圧が混ざりあって正しい電圧が測定できません。出力をLOWに戻してプルアップ抵抗を無効にしてください。(なお、デフォルトでは無効になっています。referenceピンから外部参照電圧を入力して使用する場合、注意が必要です。モードで使用したい場合のことです。注意を怠ると大事なarduinoを破壊する恐れがあります。このページで記述していた内容に誤りがあることが判りました。安全に利用することが可能です。安全に利用するための方法を強調文字にて追記しておきます。使用することになっているのですが、arduinoの場合はデフォルトで内蔵5V参照モードに設定されることになっています。reference用の線がIC内部でショートすることになります。内蔵1.1V参照モードでも同様です。約10秒間プログラムのアップロード待ち状態になるので、ショートしつづけるものと思われます。(もしかしたらブートローダーの実行中は外部参照モードのままかもしれません。眺めないとハッキリとは断言できません)追記:この図のに登場するFETが、プログラムでの制御方法によってはショートする可能性があります。ショートしないロジックになっていることが判りました。以下にAtmelのAT-MEGA168データシートから内部回路抜粋にに補記したものを記します。referenceピンに繋がっています。通電状態となるのですが、その時にAREF端子に電圧がかかっていると、その先の交差点でショートしてしまうわけです。この件はAT-MEGA168のデータシートにも注意事項として載せられています。Arduinoのアナログ入力機能は、標準で「内部5V参照」が使われます。Arduinoのアナログ入力処理は、以下のようにな流れで処理を行っています。(ちなみに「内部5V参照」を使う場合、この時点でようやくSFRが「内部5V参照」に変更)こうした処理タイミングのため、外部参照電圧をAREFに接続した状態でも、内部のFETはショートしないことになります。変更されてしまい、AREFに繋いだ外部参照電圧と内部参照5Vがショートすることになります。analogReference(external)を実行しておく必要があります。居酒屋ガレージさんのブログに記載されています。Warningという項目に回避方法が記載されています。間に5kΩの抵抗を挟んでください、とのことです。参照されるようになるということのようです。殆ど流れ込まないので、5kΩ程度の抵抗をつけても参照電圧には影響がないようです)ちなみに、なぜわざわざこのような仕組みになっているのかなぁ、と考えてみました。繋いでおくことで参照電圧から入るノイズを減らすことが可能と書かれています。限られたピン数で最大限の機能と性能を盛り込んでいる苦労がこの辺りに見え隠れしているわけです。ノイズ対策については下記を併せてご覧ください。ノイズ対策についてノイズ対策は大きくは2つの観点に分けられると思います。referenceピンとGNDピンの間に0.1μF程度のパスコンを挿入すること。これによって参照電圧に乗っているノイズを軽減することが出来ます。CPUコアを休止状態にして、CPUコアが発するノイズを止めるという方法です。この瞬間にに貫通電流と呼ばれる大きな電流が電源からGNDに向かって流れます)。これがAD変換の値も少し狂わせてしまいます。休止状態から回復」する機能が搭載されています。それとも通常どおりCPUはフル回転なのかは、ライブラリのソースプログラムを見ないとなんともいえません。影響を及ぼすことがあるので、よほど必要でないとCPUの休止モードは用いないようです。なんとなく用いられていないのでは?という気がするのですが...。