HIGH(5V)とLOW(0V)のみのデジタル電圧信号とは異なり、アナログ電圧信号では中間の電圧を取り扱うことが出来ます。
そのため、アナログ電圧信号を使うことで、LEDの明るさを調整することが出来ます。
Arduinoでは、パルス幅変調(PWM)という手法を使ってデジタル電圧からアナログ電圧を生成しています。
今回の記事では、PWMによるデジタル信号からアナログ信号への変換方法とArduinoでアナログ電圧を出力する方法について紹介します。
- PWMによるアナログ信号の作り方
- アナログ電圧の出力とLEDの明るさとの関係
- Arduinoのアナログ出力の使い方
本記事で使用するArduinoと電子部品
今回の記事では、Arduino UnoとLED(発光ダイオード)、抵抗器を使用します。
Arduino Uno Rev3
上の写真をクリックするとリンク先(Amazon)に飛びます。
電子工作キット
今回の記事で使用するLEDや抵抗器を含めたおすすめの電子工作キットはこちら。
ELEGOO Arduino UNO R3 スターターキット
このArduinoセットは、メインのArduino Uno基板(互換品)の他に色々なセンサ等がセットになっています。
本記事で使用するLEDと抵抗器はもちろん、モータや赤外線通信関係まで色々と入ってお得です。
PWMでデジタル信号をアナログ信号に変換
PWM(パルス幅変調、Pulse Width Modulation)とは、その名の通りパルス幅を変化させて制御信号を生成する方法です。
PWMを用いることで、デジタル信号のONとOFFの割合で疑似的にアナログ信号を作ることが出来ます。
例えば、ON(5V)とOFF(0V)のデジタル信号からアナログ信号を作成する方法を考えます。
上の図では、1周期のうち60%(6割)がONの時間、そして40%(4割)がOFFの時間となっています。
このONとOFFの割合が6:4で繰り返されるとき、出力電圧は疑似的に3V となります。
図の中でONの時間における3V以上の面積(ピンク色の部分)がOFFの時間における3Vまでの面積(同じくピンク色の部分)を補っています。
この様に、信号の1周期におけるONの割合(デューティー比)を変化させることで、デジタル電圧の出力ピンからアナログ電圧を出力することが可能になります。
アナログ電圧でLEDの明るさを変更
LEDのプラス側(カソード側)にかかる電圧が変化すると、LEDと抵抗に流れる電流も変化します。
LEDと抵抗器に与えられる電圧値が高くなれば、電流量も大きくなります。
反対に、与える電圧値が低くなれば、電流量は小さくなります。
これより、LEDに与えているArduinoの出力電圧を変えることで、LEDに流れる電流量が変わり、LEDの明るさが変化します。
Arduinoでアナログ電圧を出力
それでは、ArduinoでPWMによるアナログ電圧を出力し、LEDの明るさを変更します。
今回の記事では、LEDの明るさを0%から100%までを0.5秒ごとに6段階で変化させるシステムを作ります。
ArduinoとLEDの電子回路
上の図のように、LEDのカソード側(プラス側)を9番ピンに接続し、アノード側(マイナス側)を抵抗を介してGNDに接続します。
Arduinoでは、PWM出力が出来るピンが決まっています。
今回は9番ピンを用いてPWMによるアナログ電圧出力を行います。
LEDの明るさ変更プログラム
const int LED = 9;
const int LED_TIME = 500;
void setup() {
// put your setup code here, to run once:
pinMode(LED, OUTPUT);
digitalWrite(LED, 0);
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(LED, 0);
delay(LED_TIME);
analogWrite(LED, 51);
delay(LED_TIME);
analogWrite(LED, 102);
delay(LED_TIME);
analogWrite(LED, 153);
delay(LED_TIME);
analogWrite(LED, 204);
delay(LED_TIME);
analogWrite(LED, 255);
delay(LED_TIME);
}
ArduinoではanalogWrite関数という、PWMでアナログ電圧を出力する関数が用意されています。
この関数を用いることで、0Vから5Vまでの間の電圧を出力することが出来ます。
プログラム中のanalogWrite関数の2番目の引数の数字を0から255の間で変化させて、目的の電圧値を出力します。
0の時は0Vが,255の時は5Vが出力されます。
なので、3Vが出力したい場合は153とすれば良いです。
今回のプログラムでは、LEDに0、1、2、・・・、5[V]を与えて明るさを0~5の6段階で変化させています。
ちなみに,出力したい電圧値をX[V]とした時の数字のNは、
$$ N = \frac{X}{5} \cdot 255 = X \cdot 51 $$
の式で求められます。
ただし、関数には0から255の整数しか与えられないため、小数点以下は四捨五入や整数化などの処理をしてください。
まとめ
今回の記事では、ArduinoでLEDの明るさを変化させる方法として、PWMによるデジタル信号からアナログ信号への変換方法とArduinoでアナログ電圧を出力する方法について紹介しました。
Arduinoを使用することで、簡単にPWMによるアナログ電圧を取り扱うことが出来ることが分かりました。