はじめに
ここでは、Arduino UNOで アナログ入力 の実験をします。
目次へ戻るには ここ をクリック
※本ページは実験のテキストです。
アナログ入力
デジタル入力の解説 では、デジタル入力 の機能を説明しました。
特定のピンに接続されたスイッチのON(5V)/OFF(0V)状態を読み込み、シリアル通信でPCへ送信しました。
今回は、アナログ入力 です。
デジタル入力では、ONかOFF、5Vか0Vという二値しかありませんでしたが、
アナログ入力ではその中間の電圧、すなわち3.3Vとか1.06Vなどの値を受け取ることができます。
具体的には、下図のように、
可変抵抗をブレッドボートに配置し、
「可変抵抗の状態をシリアル通信でパソコンに送信する」
というプログラムをテストします。
また、次回の アナログ出力 で使うためのLEDも配置します。
実際の作業としては
•【ハードウェアの作業】ブレッドボードに電子部品を配置し、適切に配線する
•【ソフトウェアの作業】配線した状態に合わせて、プログラムを作成する
の2つの作業を行います。
ブレッドボートに部品を並べる
- 可変抵抗(スターターキットのものは10kΩ)
- LED(何色でもよい)
- 抵抗(220Ω) 赤赤茶 (抵抗早見表)
- ジャンパ線(適当に)
が必要です。
それでは、下の画像を参考に、ブレッドボードに配線してください。
今回も、配線作業で注意すべき点をいくつか挙げておきます。
LEDの向きに注意
ダイオードは、アノード(A)からカソード(K)へしか電流が流れません。逆流はできません。
したがって、LEDの向きを間違えると、電流が流れないので点灯しません。
LED(Light Emitting Diode)は足の長いほうがアノードなので、注意しましょう。
可変抵抗は真ん中が大事
可変抵抗の足は、二等辺三角形を作っています。
このとき、底辺にあたる部分が抵抗の両端、頂点が可変部になります。
底辺の両端に+5VとGND(0V)を接続し、頂点をアナログ入力ピンに繋ぐことで、0~5Vの電圧を計測できるのです。
接続を間違えると、予期せぬ動作をしてしまう(綺麗に値が変化しないなど)ので注意しましょう。
サンプルスケッチを読み込む
では次に、ソフトウェア側の作業を行います。
可変抵抗の状態を読んでシリアルで送信するプログラムは、Arduino IDEの開発環境に予め用意されています。
それでは、サンプルプログラムを開きましょう。
[ファイル]-[スケッチ例]-[03.Analog]-[AnalogInOutSerial]を開きます。
これまでは、[01.Basics]を使ってきましたが、今回は[03.Analog]です。
スケッチ例の名前も、「AnalogIn(アナログで入力)して、OutSerial(シリアルで出力)」と、何をやっているか明確ですね。
コンパイルと、プログラムの書き込み
それでは、Lチカのプログラムをコンパイルし、書き込んだ時と同様に、
コンパイルと、マイコンへの書き込みを行ってください。
実行結果
シリアル通信をしてみよう の時と同様に、シリアルモニタを開きましょう。
プログラムが実行されると、下図の様に、メッセージが連続して表示されます。
sensor =
というのが可変抵抗の値、
output =
というのがLEDへ出力している値です。
これが確認できれば成功です。
数値が安定せず、色々な値が混じっている
という場合は、可変抵抗の配線にミスがあると思われます。
では、可変抵抗のツマミを右や左へ回してみましょう。
sensor =
の値が変化することが分かります。
限界まで回すと、最小値の0か最大値の1023に振り切ります。
スケッチの解説
実際のプログラムは英語で書かれているので、日本語に訳したものを下記に示します。
/*
アナログ入力, アナログ出力, シリアル出力
アナログ入力ピンの値を読み込み、その結果を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関数です。
// これらの固定値は変更してはいけません。使用するピンに名前を与えています。
const int analogInPin = A0; // ポテンショメータに接続するアナログ入力ピン
int sensorValue = 0; // ポテンショメータから読み取った値
void setup() {
// シリアル通信を初期化する。ボーレートは9600bps
Serial.begin(9600);
}
アナログ入力に使うピンA0
に、int型の固定値(const)analogInPin
という名前を付けています。
可変抵抗から読み取った値は、int型の変数sensorValue
に格納します。
次に、setup関数の内部では、
Serial.begin
関数で、シリアル通信を9600bpsで初期化しています。
デジタル入出力の際には、pinMode
関数によるピンの初期化がありましたが、
アナログ入出力では何も書く必要がない、というのが特徴ですね。
アナログ入力のピンは、デジタル入出力とは反対側にあります。
デジタル入出力は0~13という名前が付いていますが、
アナログ入力はA0~A5というように、アナログを表すA
が付いていますね。
アナログ出力に関しては次回説明します。
次は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という、それ専用のピンがある。
- アナログ入力には変換時間が必要なので、数ミリ秒の待ち時間を入れる
という事が分かったと思います。
目次 へ戻って次の作業を行ってください。