4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

アナログ入力の解説

Last updated at Posted at 2020-07-16

はじめに

ここでは、Arduino UNOで アナログ入力 の実験をします。

目次へ戻るには ここ をクリック

※本ページは実験のテキストです。

アナログ入力

デジタル入力の解説 では、デジタル入力 の機能を説明しました。
特定のピンに接続されたスイッチのON(5V)/OFF(0V)状態を読み込み、シリアル通信でPCへ送信しました。

今回は、アナログ入力 です。
デジタル入力では、ONかOFF、5Vか0Vという二値しかありませんでしたが、
アナログ入力ではその中間の電圧、すなわち3.3Vとか1.06Vなどの値を受け取ることができます。

具体的には、下図のように、
aios_board.png
可変抵抗をブレッドボートに配置し、
可変抵抗の状態をシリアル通信でパソコンに送信する
というプログラムをテストします。
また、次回の アナログ出力 で使うためのLEDも配置します。

実際の作業としては
•【ハードウェアの作業】ブレッドボードに電子部品を配置し、適切に配線する
•【ソフトウェアの作業】配線した状態に合わせて、プログラムを作成する

の2つの作業を行います。

ブレッドボートに部品を並べる

必要な部品を写真に示します。
aios_parts.png

  • 可変抵抗(スターターキットのものは10kΩ)
  • LED(何色でもよい)
  • 抵抗(220Ω) 赤赤茶 (抵抗早見表
  • ジャンパ線(適当に)

が必要です。


それでは、下の画像を参考に、ブレッドボードに配線してください。
aios_image.png

回路図としては以下のようになっています。
aios_sch.png

参考までに、筆者が配線した写真を示します。
aios_board.png

今回も、配線作業で注意すべき点をいくつか挙げておきます。

LEDの向きに注意

ダイオードは、アノード(A)からカソード(K)へしか電流が流れません。逆流はできません。
したがって、LEDの向きを間違えると、電流が流れないので点灯しません。
LED(Light Emitting Diode)は足の長いほうがアノードなので、注意しましょう。
aios_led.png

可変抵抗は真ん中が大事

可変抵抗の足は、二等辺三角形を作っています。
このとき、底辺にあたる部分が抵抗の両端、頂点が可変部になります。
aios_vr.png
底辺の両端に+5VとGND(0V)を接続し、頂点をアナログ入力ピンに繋ぐことで、0~5Vの電圧を計測できるのです。
接続を間違えると、予期せぬ動作をしてしまう(綺麗に値が変化しないなど)ので注意しましょう。

サンプルスケッチを読み込む

では次に、ソフトウェア側の作業を行います。

可変抵抗の状態を読んでシリアルで送信するプログラムは、Arduino IDEの開発環境に予め用意されています。

それでは、サンプルプログラムを開きましょう。
[ファイル]-[スケッチ例]-[03.Analog]-[AnalogInOutSerial]を開きます。
aios_sketch.png

これまでは、[01.Basics]を使ってきましたが、今回は[03.Analog]です。
スケッチ例の名前も、「AnalogIn(アナログで入力)して、OutSerial(シリアルで出力)」と、何をやっているか明確ですね。

コンパイルと、プログラムの書き込み

それでは、Lチカのプログラムをコンパイルし、書き込んだ時と同様に、
コンパイルと、マイコンへの書き込みを行ってください。

実行結果

シリアル通信をしてみよう の時と同様に、シリアルモニタを開きましょう。

プログラムが実行されると、下図の様に、メッセージが連続して表示されます。
aios_result.png

sensor = というのが可変抵抗の値、
output = というのがLEDへ出力している値です。

これが確認できれば成功です。

数値が安定せず、色々な値が混じっている
という場合は、可変抵抗の配線にミスがあると思われます。


では、可変抵抗のツマミを右や左へ回してみましょう。
sensor = の値が変化することが分かります。
限界まで回すと、最小値の0か最大値の1023に振り切ります。
aios_limit.png

スケッチの解説

実際のプログラムは英語で書かれているので、日本語に訳したものを下記に示します。

AnalogInOutSerial.ino
/*
  アナログ入力, アナログ出力, シリアル出力

  アナログ入力ピンの値を読み込み、その結果を0~255の範囲に変換します。
  0~255の値は出力ピンのPWM(パルス幅変調)値として使います。
  また、シリアルモニターにも結果をプリントします。

  回路:
  - アナログ入力ピン0に、ポテンショメータ(可変抵抗)
    ポテンショメータの中央のピンをアナログ入力ピンに接続する
    ポテンショメータの側面のピン達は、+5V と GND に接続する
  - LED はデジタル出力ピン9と、GNDに接続する(もちろん電流制限抵抗が必要)
*/

// これらの固定値は変更してはいけません。使用するピンに名前を与えています。
const int analogInPin = A0;  // ポテンショメータに接続するアナログ入力ピン
const int analogOutPin = 9; // LEDに接続するアナログ出力ピン

int sensorValue = 0;        // ポテンショメータから読み取った値
int outputValue = 0;        // アナログ出力でPWM出力する値

void setup() {
  // シリアル通信を初期化する。ボーレートは9600bps
  Serial.begin(9600);
}

void loop() {
  // アナログ入力の値を読む
  sensorValue = analogRead(analogInPin);
  // アナログ入力の0~1024の値を、アナログ出力の使用範囲0~255に変換する
  outputValue = map(sensorValue, 0, 1023, 0, 255);
  // アナログ出力値を変更する
  analogWrite(analogOutPin, outputValue);

  // シリアルモニターに結果をプリントする
  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t output = ");
  Serial.println(outputValue);

  // アナログ->デジタル変換のために2ミリ秒のウェイトが必要
  delay(2);
}

それでは、それぞれの関数を見ていきましょう。
次回の アナログ出力 で解説する部分は割愛しています。
今回は アナログ入力 だけ。

まずはグローバル変数とsetup関数です。

グローバル変数とsetup関数
// これらの固定値は変更してはいけません。使用するピンに名前を与えています。
const int analogInPin = A0;  // ポテンショメータに接続するアナログ入力ピン

int sensorValue = 0;        // ポテンショメータから読み取った値

void setup() {
  // シリアル通信を初期化する。ボーレートは9600bps
  Serial.begin(9600);
}

アナログ入力に使うピンA0に、int型の固定値(const)analogInPinという名前を付けています。
可変抵抗から読み取った値は、int型の変数sensorValueに格納します。

次に、setup関数の内部では、
Serial.begin関数で、シリアル通信を9600bpsで初期化しています。
デジタル入出力の際には、pinMode関数によるピンの初期化がありましたが、
アナログ入出力では何も書く必要がない、というのが特徴ですね。

アナログ入力のピンは、デジタル入出力とは反対側にあります。
aios_pinout.png
デジタル入出力は0~13という名前が付いていますが、
アナログ入力はA0~A5というように、アナログを表すAが付いていますね。
アナログ出力に関しては次回説明します。


次はloop関数を見ていきます。

loop関数
void loop() {
  // アナログ入力の値を読む
  sensorValue = analogRead(analogInPin);

  // シリアルモニターに結果をプリントする
  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t output = ");
  Serial.println(outputValue);

  // アナログ->デジタル変換のために2ミリ秒のウェイトが必要
  delay(2);
}

analogRead関数は、アナログ入力モ専用のピンの値を読み取る命令です。
解説:analogRead解説

analogRead関数が返す値は、5Vのとき1023、0Vのとき0です。
なのでint型の変数sensorValueには、0~1023の値が入ります。

次は、Serial.print関数およびSerial.println関数で、文字列や変数値を表示しています。
C言語のプログラミング経験者であれば、

printf( "sensor = %d\t output = %d\n", sensorValue, outputValue );

と書く方が理解しやすいと思います。
しかし、Arduinoには、Serial.printfという関数はないので、
文字列だけを表示するSerial.printと、変数の中身を表示するSerial.printを別々に書かなければなりません。

最後に、delay関数を使って2ミリ秒のウェイトを入れています。
analogReadで使うアナログ->デジタル変換機能は、瞬時に値を読み取れるものではなく、
コンデンサ等に一旦蓄えた後に、比較計算を行う装置を経由するので、変換時間がかかるのです。

まとめ

アナログ入力では、

  • analogRead でピンの状態を読む
  • analogReadで取れる値は0~1023
  • アナログ入力はA0~A5という、それ専用のピンがある。
  • アナログ入力には変換時間が必要なので、数ミリ秒の待ち時間を入れる

という事が分かったと思います。

目次 へ戻って次の作業を行ってください。 

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?