〇Arduinoのアナログピン

アナログピンという名前が付いていますのでなんだかアナログが入出力できるイメージがします。
色々調べていくと、アナログの電圧を測定する事は出来ますが、純粋なアナログ出力はできないようです。
要するにADコンバーター(アナログ-デジタル変換回路)付きのデジタルピンと考えた方が良いと思いました。

アナログピンA0はデジタルピン14番として使用もできますし、A0としても利用できます。
どういうことかとヘッダーを覗いて見ると、
const static uint8_t A0 = 14;
const static uint8_t A1 = 15;
const static uint8_t A2 = 16;
const static uint8_t A3 = 17;
const static uint8_t A4 = 18;
const static uint8_t A5 = 19;
const static uint8_t A6 = 20;
const static uint8_t A7 = 21;

UNOではこのように指定されているためです。
A0と書こうが14と書こうがどっちでも変わりないということです。
ただ、MEGAなどの他のボードでは値が変わってくるため、再利用を考えるならA0と書いたほうがいいですね。


■アナログピンのデジタルピンとしての利用
▼デジタル出力

アナログピンA0にデジタル出力をしています、LEDを付けると点灯しますし、普通にデジタルピンとして出力できます。
void setup() {
  pinMode(A0, OUTPUT);
}

void loop() {
  digitalWrite(A0,HIGH);
}


▼デジタル入力

GNDとA0の間に10KΩのプルダウン抵抗を取り付けて、ボタンを押されるとLEDが点灯
これもまた、デジタルピンと同じです。
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(A0, INPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, digitalRead(A0));
}


▼内蔵プルアップによるデジタル入力

スイッチをGNDとA0ピンの間に取り付けて、ボタンが押されるとLEDが点灯
デジタルピンと同じ操作です。
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(A0, INPUT_PULLUP);
}

void loop() {
  digitalWrite(LED_BUILTIN, !digitalRead(A0));
}


■アナログピンのADコンバータを使う

アナログピンには10ビットのADコンバータが付いていて、0V〜基準電圧(デフォルトでは電源電圧)までの電圧を測る事ができます。
値を読み取るのに約100μ秒の時間がかかります。
10ビットですから1024パターンの表現ができ、0〜1023までの値が返って来ます。
分解能は 基準電圧 / 1024 のようです。

まず、抵抗を使って5VとGNDを分圧し適当な電圧を作ってみます。

手元に1KΩと10KΩの抵抗がありましたので2本を電源間に接続して真ん中の電圧を計算してみます。
上の分圧の計算式にR1を1KΩ、R2を10KΩで当てはめて計算してみます。
(10÷(1+10))× 5 = 4.54V
分解能が1024パターンのため、
(1024÷5)× 4.54 = 約 929

真ん中の端子部分をアナログピン(A0)に接続して値を読み出すと、929付近の値が取得できるはずです。




▼アナログピンからの読み出し

analogRead(ピン番号)関数を使いAD変換の値を読み出します。
ポートの設定などは一切無くいきなり読み出す事が出来ます。
void setup() {
  Serial.begin(9600);
}
   
void loop() {
  Serial.println( analogRead( A0 ) ); 
  delay(100);
}

実際に動作させ、シリアルモニタを開いてみると、誤差はありますがかなり近い値が取得できました。
たぶん、抵抗の部品としての誤差や、電源が不安定のためAD変換の基準電圧がずれる為など考えられます。



▲トップページ > マイコンなど