アナログ入力(A/D変換)の使い方(Arduinoプログラミング)

Arduinoコマンド:アナログ入力の使い方

身の回りには温度や速度、距離、重さ等たくさんの情報(データ)がありますが、そのほとんどは連続して変化する値でアナログデータです。

しかし、コンピュータが理解できるのは「0」か「1」かのデジタルデータです。

アナログデータをプログラムで処理するためにはコンピュータが理解できる「0」と「1」の組み合わせのデジタルデータに変換する必要があり、ほとんどのマイコンボードがこの変換を行う「アナログ入力端子」をもっています。

プログラミングで「アナログ入力」は「A/D変換」とも呼ばれます。

「A/D変換」の「A/D」とは Analog(アナログ)と Digital(デジタル)の頭文字をとったもので、「A/D変換」は「アナログデータ」を「デジタルデータ」に変換することを言います。

ここではArduinoコマンドを使用した「アナログ入力」の使い方について紹介します。

スポンサーリンク

1.使用可能な端子

アナログ入力(A/D変換)が使用できる端子は限られておりマイコンボードによって異なります。
下画像の「ATOM LITE(M5Stack社製)」の端子配列を例に確認してみましょう。

ATOM LITE端子配列

「ATOM LITE」は電源端子以外の端子全てが入出力端子として使用できますが、「アナログ入力(A/D変換)」端子に使用できるのは「G25, G26, G32, G33」の4か所です。

「G25, G26」は無線通信を使用している時には「アナログ入力(A/D変換)」として使用できません。

「ATOM LITE」とアナログ入力電圧の調整に便利な「ボリュームユニット」については以下のリンクで詳しく紹介しています。

ATOM LITE プログラミング初心者におすすめ超小型で高機能!
マイコンボードはRaspberry Pi、Arduino、M5Stack等がありますが、一通りやってみてそれぞれの良さはあるものの「最初に何を?」と聞かれたらATOM LITEが一番お手軽♪プログラミング初心者におすすめ
ボリューム(可変抵抗器)の使い方、つなぎ方、抵抗値計算等を回路図も使って詳しく解説
ボリュームというと音量調節のイメージですが、明るさや回転数等を調整するのにも使用されます。「抵抗(固定抵抗器)」が固定の抵抗値を持つのに対して「可変抵抗器」は抵抗値を調整することができます。このボリューム(可変抵抗器)について紹介します。
「開発環境の準備」がまだの方は → こちら
「アナログ入力(A/D変換)」に使用できる端子はマイコンボードによって異なり、使用には条件があるものもあるためデータシートで確認しましょう。
スポンサーリンク

2.「アナログ入力(A/D変換)」プログラムの書き方

Arduinoコマンドを使用した「A/D変換」プログラムの書き方について紹介します。
まずは初期設定として「void setup()」内に以下を記入します

・初期設定
  pinMode( 端子番号ANALOG ) ; //指定した端子をアナログ入力に設定

pinMode:入出力端子の設定でも使用しましたが、アナログ入力端子に設定する時もこのコマンドを使用します。
端子番号:アナログ入力端子として使用する端子番号を設定します。 
ANAROG:アナログ入力端子として指定するコマンドです。


次に「A/D変換」を実行するプログラムを「void loop()」(メイン)の中の「A/D変換」を実行したい場所に記入します。
・アナログ入力(A/D変換)の実行
  変数 = analogRead ( 端子番号 ) ;   //アナログ入力端子のA/D変換実行

変数:「A/D変換」を実行したデジタルデータを格納するために変数を使用します。
analogRead:「A/D変換」を実行するコマンドです。
端子番号:初期設定で「アナログ入力端子」として設定した端子番号を記入します。

スポンサーリンク

3.アナログ入力電圧の最大値と分解能(精度)について

「アナログ入力端子」を使用する時、以下の2点の確認が必要です。

 ・入力できる電圧の最大値
 ・「A/D変換」を行う時の分解能(精度)

・入力できる電圧の最大値について

アナログデータとして端子に入力できる電圧は基本的にマイコンボードの制御電圧が最大値になります。
「ATOM LITE」の場合は「3.3V」ですが「Arduino UNO」の場合は「5V」なので使用するマイコンボードごとにデータシートで確認が必要です。

・分解能(精度)について

入力された電圧は「A/D変換」でデジタルデータに変換されますがその精度はマイコンボードごとに異なり、この精度は分解能によって決まります。

「分解能」とは「A/D変換」したデジタルデータを格納するデータ領域の桁数(bit数)で「2のbit数乗」で表されます。
この桁数(bit数)が多い程、細かく分割してデータが扱えるため精度が高くなります。
「入力できる電圧の最大値」を「分解能」で割ったものが扱えるアナログ電圧の最小値になります。

実際に「ATOM LITE」と「Arduino UNO」のアナログ入力(A/D変換)仕様を比較したものが下表です。

マイコンボード 入力できる
電圧範囲
分解能扱えるデジタルデータ範囲
(2進数)
扱えるデジタルデータ範囲
(10進数)
扱えるアナログ
電圧の最小値
Arduino UNO0 ~ 5V10bit
(1024)
0000000000
~1111111111
0 ~ 10235V / 1024 ≒
0.00488V
ATOM LITE0 ~ 3.3V12bit
(4096)
000000000000
~111111111111
0 ~ 40953.3 / 4096 ≒
0.00081V
「ATOM LITE」の方が分解能が高く、扱えるアナログ電圧の最小値は0.81mVです。
「A/D変換」したデジタルデータが1000だった時、アナログ入力端子の電圧は0.81Vであることがわかります。

4.サンプルプログラム(コピペ)

実際に「アナログ入力端子」に入力した電圧値を「A/D変換」してシリアル出力する「サンプルプログラム」を準備したので、パソコン画面に表示しながら確認してみましょう。

「アナログ入力端子」の電圧はボリューム(可変抵抗器)を外付けして、電圧を変化させて確認します。

「ATOM LITE」と「ボリューム」の接続は以下のリンクで詳しく紹介しています。

ボリュームで7色変化!フルカラーLEDコントローラーを作ろう「ATOM LITE」
ATOM LITE本体のフルカラーLEDの色をボリューム操作で可変させるプログラムの作り方を詳しく紹介。NeoPixel(WS2812B)をFastLEDで制御

下のコードを「コピペ」して書き込んでください。
※コピーは下コード(黒枠)内の右上角にある小さなアイコンのクリックでもできます。

#include <M5Atom.h>   //Atomのヘッダファイルを準備

// FastLEDライブラリの設定(CRGB構造体)
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
  return (CRGB)((r << 16) | (g << 8) | b);
}
// 変数宣言
float an_val;       //アナログ変換値(0~4095)格納用
float an_volt;      //アナログ電圧(0~3.3V)格納用

// 初期設定 -----------------------------------------------
void setup() {
  M5.begin(true, false, true);  //Serial,POWER,LED
  Serial.begin(9600);           //標準のシリアル通信設定
  pinMode(33, ANALOG);          //アナログ入力端子設定
}
// メイン -------------------------------------------------
void loop() {
  // アナログ入力処理
  an_val = analogRead(33);          //アナログ変換値(0~4095)取得
  an_volt = (3.3 / 4095) * an_val;  //アナログ電圧(0~3.3V)換算

  //シリアル出力
  Serial.printf("AN = %d  VOLT = %4.2fV\n", (int)an_val, an_volt);
                     //AN = デジタルデータ VOLT = アナログ入力電圧

  delay(1000);  //1000ms待機
}

5.サンプルプログラムの動作確認

8,9行目で変数を宣言してますが浮動小数点の演算に使用するため「float型」としています。

// 変数宣言
float an_val;       //アナログ変換値(0~4095)格納用
float an_volt;      //アナログ電圧(0~3.3V)格納用

「変数」については以下のリンクで詳しく紹介しています。

動かして学ぶC言語「変数」について、正しく学ぶならC言語が一番
「変数」とはプログラム内のデータを保存しておくために使用します。 データを入れておく箱のようなもので、一時的にデータを入れておき、必要な時に取り出して使用したり、取り出して加工(演算等)してから元に戻して、また必要な時に使用したりします。

15行目が端子番号33(G33)を「アナログ入力端子」として設定する初期設定です。

pinMode(33, ANALOG);          //アナログ入力端子設定

20行目で「A/D変換」を実行し、変数「an_val」にアナログデータを変換したデジタルデータを格納しています。

an_val = analogRead(33);          //アナログ変換値(0~4095)取得

21行目で取得したデジタルデータを電圧値に換算し変数「an_volt」に格納しています。

an_volt = (3.3 / 4095) * an_val;  //アナログ電圧(0~3.3V)換算

24行目でシリアル出力を実行し画面上で数値を確認します。
「AN =」 に「A/D変換」を行ったデジタル値(0~4095)が表示されます。
「VOLT =」 にはデジタルデータから換算した電圧値(0~3.3V)が表示されます。

Serial.printf("AN = %d  VOLT = %4.2fV\n", (int)an_val, an_volt);
                     //AN = デジタルデータ VOLT = アナログ入力電圧

シリアル出力を使ってパソコン画面で数値を確認する方法は以下リンクで詳しく紹介しています。

シリアル(UART)出力で内部データの表示(Arduinoプログラミング)
シリアル出力モニタとはプログラム内の値やデータをパソコンのモニタ上に表示させることができる機能で、ほとんどの開発環境にこの機能があります。表示だけではなく出力したデータを記録して保存したり、機器間でデータをやり取りする時にも使用されます。
printf()は書式を指定して文字を出力するコマンドです。
「AN = %d」の「%d」は整数を表示します。
表示したい「an_val」は「Float型」のため 「(int)an_val」で「float型」を「int型」に変換(キャスト)しています。
「VOLT = %4.2f」の「%4.2f」は浮動小数点型を表示します。(全体で4桁、小数点以下2桁の表示を指定)

実際にシリアル出力で画面上に表示したものが下画像になります。

「A/D変換」を行ったデジタル値が1000になるように調整したので「AN =」は1000近辺の数値が表示されます。
この時の「VOLT =」は上で紹介した通り0.81Vになっているのが確認できます。

「AN =」のデジタル値は表示するたびに変動しています。
これは、今回アナログ入力端子へ入力する電圧を作るために使っている「ATOM LITE」の電源電圧が安定していないためです。
動作確認程度では問題ありませんが、より精度の高い測定を行うには使用する電源もより安定したものが必要になります。

6.まとめ

Arduinoコマンドを使用した「A/D変換」の使い方について紹介しました。

「アナログデータ(連続したデータ)」をプログラムで処理するためにはコンピュータが理解できる「0」と「1」の「デジタルデータ」に変換する必要があります。

「A/D変換」の「A/D」とは Analog(アナログ)と Digital(デジタル)の頭文字をとったもので、「アナログデータ」を「デジタルデータ」に変換することを「A/D変換」と言います。

「A/D変換」の動作はマイコンボードの「アナログ入力」で確認することができ「M5Stack社製」の「ATOM LITE」がおすすめです。

「ATOM LITE」は「Arduino UNO」等より「分解能」が高いため、より精度の高い「A/D変換」を行うことができます。プログラムには「Arduino」と同じコマンドを使用することができます。

「分解能」とは「A/D変換」したデジタルデータを格納するデータ領域の桁数(bit数)でその精度は「2のbit数乗」で表されます。
「入力できる電圧の最大値」を「分解能」で割ったものが扱えるアナログ電圧の最小値になります。

「分解能」の「bit数」を増やせば増やすほど小さいデータを表現できるため、人間も含めマイコンボード等の処理対象が処理しきれないデジタルデータのことをアナログデータと呼んでいるだけで、この世は全てデジタルデータでできていると言っても良いかもしれません。

コメント

タイトルとURLをコピーしました