ArduinoでAD変換を使用する
AD変換でセンサ値を読み取るパソコンに出力
センサなどの値が電圧で出力されたときに、出力された電圧値を読み取るのに必要なものがAD変換。
今回は、実際に電圧を読み取り、Arduinoからパソコンにデータを送りたいと思います。
AD変換とは
一般的にA/D変換はAnalog/Digital Conversionの略称で、アナログな信号をデジタルの信号に変換することを言います。
今回Arduinoで行うAD変換は、「一番高い電圧と低い電圧の間ぐらいの電圧」を「2.5V」と示す操作を行います。
ArduinoのAD変換の分解能は10bitなので、基準電圧に対して1024分割の分解能で検出することができます。
(0から1023の整数値で表現される)
基準電圧はArduinoのArefピンを使用することで任意に決めることができますが、今回は標準で使用することができる5Vとします。
そうなると、5[V]/1023 = 0.00489
となり、4.89mVの精度で電圧値を取得することができます。
ArduinoでAD変換をやってみる
実際にAD変換を使用してみましょう。
今回は電圧をボリュームによって変化させて、その数値を読み取りたいと思います。
その、読み取った電圧値に対してLEDの光量を変化させていきます。
LEDに出力する信号はPWMとして、電圧によってPWMのduty比を変化させLEDの出力制御をさせていきたいと思います。
AD変換に使用できるピンはA0~A5の6チャネルになります。
また、PWM出力は3, 5, 6, 9, 10, 11の6チャネルで使用できます。
これらを踏まえて、回路図と配線図を考えると以下のようになります。
プログラムはこのように作成しました。
#include <MsTimer2.h>// タイマー割り込みを利用する為に必要なヘッダファイル int ledPin = 9; // LEDはピン9に接続 int val = 0; float volt; //タイマ割り込みで処理される関数 void timer() { volt = val * 5.0 / 1023.0; Serial.println(volt); //電圧をシリアル通信でパソコンに送信 } void setup() { MsTimer2::set(100, timer); // 100ms毎にtimer( )割込み関数を呼び出す様に設定 MsTimer2::start(); // タイマー割り込み開始 Serial.begin(9600); //シリアル通信のボーレート設定 while (!Serial) { } } void loop() { val = analogRead(A0); //AOピンにアナログ信号を入力 analogWrite(ledPin, val / 4); //9ピンからPWMを出力 }
1行目で読み込んでいる”MsTIMER2.h"はタイマ割り込みを利用するために入れています。
電圧データをループ毎に送信していたら、送信データ量が多く、データ送信間隔がまばらになり定量的なデータではなくなってしまいます。
そのため、タイマ割り込みを利用して定量時間ごとにデータを送信させるようにします。
”MsTIMER2.h"を使用するためにはライブラリのインストールが必要になります。
ライブラリのインストールはArduinoの開発環境から
スケッチ → ライブラリをインクルード → ライブラリを管理
を押すと、ライブラリマネージャーが表示されます。
そこの検索欄に、”MsTIMER2.h”と入力すると表示されるので、クリックしてインストールしてください。
インストールが環境すると”MsTIMER.h”のヘッダーファイルが使用できるようになります。
7~10行目でタイマ割り込みで行う処理を書いています。
このプログラムでは100msごとにAD変換で出力された値を電圧値に変換し、シリアル通信で出力しています。
20~23行目でPWMをループでずっと出力する処理を書いています。
analogWrite関数はPWMを出力する関数です。
参考 : "analogWrite" 関数リファレンス
パルス幅の指定はデューティ比の数値となります。
デューティー比は0(常にオフ)から255(常にオン)までで指定することができます。
今回、AD変換で取得できる値は0から1023であるため、AD変換で取得した値を4で割っています。
実際の電圧の変化とパルス幅、それに対するLEDの光量を見てみましょう。
赤色の線がボリュームから出力される電圧で、黄色の線が電圧に対応してLEDに入力されるPWM信号です。
見ていただくと電圧が変化することによってPWMのパルス幅が変化し、LED光量が変化していることがわかります。
これで、AD変換で出力された値をArduino内で正常に処理することができ、結果をシリアル通信によってPCに送信できていることがわかりました。
まとめ
センサなどから出力された値をArduino内で処理をして、その数値に対応した出力を行い、データログを取得する、
という1つの基本的な形を今回は行いました。
今回はボリュームによって電圧を変化させましたが、同様のことをいろんなセンサですることができます。
AD変換とシリアル通信ができることでモノづくりの幅がぐっと広がったと思います。
より良い電子工作ライフを満喫していきましょう!!