身の回りには温度や速度、距離、重さ等たくさんの情報(データ)がありますが、そのほとんどは連続して変化する値でアナログデータです。
しかし、コンピュータが理解できるのは「0」か「1」かのデジタルデータです。
アナログデータをプログラムで処理するためにはコンピュータが理解できる「0」と「1」の組み合わせのデジタルデータに変換する必要があり、ほとんどのマイコンボードがこの変換を行う「アナログ入力端子」をもっています。
プログラミングで「アナログ入力」は「A/D変換」とも呼ばれます。
ここではArduinoコマンドを使用した「アナログ入力」の使い方について紹介します。
1.使用可能な端子
2.アナログ入力(A/D変換)プログラムの書き方
3.アナログ入力電圧の最大値と分解能(精度)について
・入力できる電圧の最大値
・分解能(精度)
4.サンプルプログラム(コピペ)
5.サンプルプログラムの動作確認
6.まとめ
1.使用可能な端子
アナログ入力(A/D変換)が使用できる端子は限られておりマイコンボードによって異なります。
下画像の「ATOM LITE(M5Stack社製)」の端子配列を例に確認してみましょう。
「ATOM LITE」は電源端子以外の端子全てが入出力端子として使用できますが、「アナログ入力(A/D変換)」端子に使用できるのは「G25, G26, G32, G33」の4か所です。
「ATOM LITE」とアナログ入力電圧の調整に便利な「ボリュームユニット」については以下のリンクで詳しく紹介しています。
2.「アナログ入力(A/D変換)」プログラムの書き方
Arduinoコマンドを使用した「A/D変換」プログラムの書き方について紹介します。
まずは初期設定として「void setup()」内に以下を記入します
pinMode( 端子番号, ANALOG ) ; //指定した端子をアナログ入力に設定
pinMode:入出力端子の設定でも使用しましたが、アナログ入力端子に設定する時もこのコマンドを使用します。
端子番号:アナログ入力端子として使用する端子番号を設定します。
ANAROG:アナログ入力端子として指定するコマンドです。
変数 = analogRead ( 端子番号 ) ; //アナログ入力端子のA/D変換実行
変数:「A/D変換」を実行したデジタルデータを格納するために変数を使用します。
analogRead:「A/D変換」を実行するコマンドです。
端子番号:初期設定で「アナログ入力端子」として設定した端子番号を記入します。
3.アナログ入力電圧の最大値と分解能(精度)について
「アナログ入力端子」を使用する時、以下の2点の確認が必要です。
・入力できる電圧の最大値
・「A/D変換」を行う時の分解能(精度)
・入力できる電圧の最大値について
アナログデータとして端子に入力できる電圧は基本的にマイコンボードの制御電圧が最大値になります。
「ATOM LITE」の場合は「3.3V」ですが「Arduino UNO」の場合は「5V」なので使用するマイコンボードごとにデータシートで確認が必要です。
・分解能(精度)について
入力された電圧は「A/D変換」でデジタルデータに変換されますがその精度はマイコンボードごとに異なり、この精度は分解能によって決まります。
実際に「ATOM LITE」と「Arduino UNO」のアナログ入力(A/D変換)仕様を比較したものが下表です。
マイコンボード | 入力できる 電圧範囲 | 分解能 | 扱えるデジタルデータ範囲 (2進数) | 扱えるデジタルデータ範囲 (10進数) | 扱えるアナログ 電圧の最小値 |
---|---|---|---|---|---|
Arduino UNO | 0 ~ 5V | 10bit (1024) | 0000000000 ~1111111111 | 0 ~ 1023 | 5V / 1024 ≒ 0.00488V |
ATOM LITE | 0 ~ 3.3V | 12bit (4096) | 000000000000 ~111111111111 | 0 ~ 4095 | 3.3 / 4096 ≒ 0.00081V |
4.サンプルプログラム(コピペ)
実際に「アナログ入力端子」に入力した電圧値を「A/D変換」してシリアル出力する「サンプルプログラム」を準備したので、パソコン画面に表示しながら確認してみましょう。
「アナログ入力端子」の電圧はボリューム(可変抵抗器)を外付けして、電圧を変化させて確認します。
「ATOM LITE」と「ボリューム」の接続は以下のリンクで詳しく紹介しています。
下のコードを「コピペ」して書き込んでください。
※コピーは下コード(黒枠)内の右上角にある小さなアイコンのクリックでもできます。
#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)格納用
「変数」については以下のリンクで詳しく紹介しています。
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 = アナログ入力電圧
シリアル出力を使ってパソコン画面で数値を確認する方法は以下リンクで詳しく紹介しています。
実際にシリアル出力で画面上に表示したものが下画像になります。
「A/D変換」を行ったデジタル値が1000になるように調整したので「AN =」は1000近辺の数値が表示されます。
この時の「VOLT =」は上で紹介した通り0.81Vになっているのが確認できます。
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数」を増やせば増やすほど小さいデータを表現できるため、人間も含めマイコンボード等の処理対象が処理しきれないデジタルデータのことをアナログデータと呼んでいるだけで、この世は全てデジタルデータでできていると言っても良いかもしれません。
コメント