はじめに
こんにちは!香月です。
電子工作について勉強したことをアウトプットとしてブログで情報発信しています!
勉強中なので、間違っていること等あります。
気づいた方は、公式ラインで教えていただけると幸いです。
今回は、ArduinoR4-Minimaの新機能のDAC機能を使って、PWMと比較していきます!
この記事を読めば、アナログ出力を使いこなすことができ、LEDをきれいに光らせたり、モーターを細かくコントロールしたり、色々なことができるようになります!
ということで、さっそく使うものから見ていきましょう!
使うもの
ArduinoR4-Minima
LED
抵抗
ブレッドボード+ジャンパー線
DACとPWMの説明
従来のArduinoNanoでアナログ出力をしたいと思ったら、PWMという方法を使って出力していました。
もし、あなたが、1.25V出力したいと思ったときにPWMを使うことでアナログピン(番号がA1などで表されるピン)から出力できました。
しかし、このPWM機能を使ってアナログピンA1から出力されるのは、1.25Vではないんです。
実際には、5V出力されています。
ん?!
どういうこと??
実は、出力する時間をコントロールして、疑似的に1.25V出力していたんです。
下の図を見てみてください
図を見るっとわかるように、1.25Vを出力したわけではなく、平均すると1.25Vが出力されているイメージです。
今回の新機能のDAC機能は本当に1.25Vが出力できるようになりました!
これにより、繊細なコントロールができるようになりました!!
ということで今回は、PWMとDACでどのような差があるか実験・比較していきます!!
回路
今回は、LEDをグラデーションにしてみて、やっていきます!
なので、回路は非常に簡単です
回路ができたらプログラムを書き込んでいきます!
プログラム(PWM)
まずは、PWM機能を使ったプログラムです。
(このコードはArduinoNanoR3でも使えます。)
const int pwmPin = 0; // PWM出力に使用するピン番号
const int fadeDuration = 2500; // フェードイン・フェードアウトの時間(ミリ秒)
void setup() {
pinMode(pwmPin, OUTPUT); // PWMピンを出力として設定
}
void loop() {
fade(pwmPin, 0, 255, fadeDuration); // 明るくする
delay(1000); // 明るくした後、1秒間維持
fade(pwmPin, 255, 0, fadeDuration); // 消灯する
delay(1000); // 消灯した後、1秒間維持
}
void fade(int pin, int startValue, int endValue, int duration) {
int steps = 256; // 0から255までのステップ数
int stepDelay = duration / steps; // 各ステップごとの遅延時間
for (int i = 0; i <= steps; i++) {
int value = map(i, 0, steps, startValue, endValue); // ステップに応じた値にマッピング
analogWrite(pin, value); // PWMピンに値を書き込む
delay(stepDelay); // 各ステップごとに遅延
}
}
プログラムの解説(PWM)
変数の宣言
const int pwmPin = 0; // PWM出力に使用するピン番号
const int fadeDuration = 2500; // フェードイン・フェードアウトの時間(ミリ秒)
pwmPin: LEDを接続するPWMピンの番号を定義しています。このピンを通じて、LEDの明るさを制御します。
fadeDuration: LEDの明るさを変化させる時間をミリ秒で定義しています。この時間内で、LEDの明るさが最小値から最大値、またはその逆に変化します。
setup関数
void setup() {
pinMode(pwmPin, OUTPUT); // PWMピンを出力として設定
}
pinMode(pwmPin, OUTPUT): pwmPinを出力ピンとして設定します。これにより、analogWrite関数を使ってピンに電圧を出力できるようになります。
loop関数
void loop() {
fade(pwmPin, 0, 255, fadeDuration); // 明るくする
delay(1000); // 明るくした後、1秒間維持
fade(pwmPin, 255, 0, fadeDuration); // 消灯する
delay(1000); // 消灯した後、1秒間維持
}
fade(pwmPin, 0, 255, fadeDuration): fade関数を呼び出して、LEDを0(消灯)から255(最大輝度)まで徐々に明るくします。delay(1000): LEDが最大輝度に達した後、1秒間その明るさを維持します。fade(pwmPin, 255, 0, fadeDuration): fade関数を呼び出して、LEDを255(最大輝度)から0(消灯)まで徐々に暗くします。delay(1000): LEDが消灯した後、1秒間その状態を維持します。
fade関数
void fade(int pin, int startValue, int endValue, int duration) {
int steps = 256; // 0から255までのステップ数
int stepDelay = duration / steps; // 各ステップごとの遅延時間
for (int i = 0; i <= steps; i++) {
int value = map(i, 0, steps, startValue, endValue); // ステップに応じた値にマッピング
analogWrite(pin, value); // PWMピンに値を書き込む
delay(stepDelay); // 各ステップごとに遅延
}
}
steps
: 明るさを変化させるステップ数を定義しています。ここでは0から255までの256ステップに設定しています。stepDelay
: 各ステップごとの遅延時間を計算します。フェードインまたはフェードアウトの全体の時間をステップ数で割った値です。
ループ内の動作
- map(i, 0, steps, startValue, endValue): 現在のステップ
i
を開始値startValueから終了値endValueの範囲にマッピングします。これにより、各ステップでのPWM値が計算されます。 - analogWrite(pin, value): 計算されたPWM値valueを指定されたピンpinに書き込みます。これにより、LEDの明るさが変化します。
- delay(stepDelay): 次のステップに進む前に、一定の時間(stepDelay)待ちます。これにより、LEDの明るさが徐々に変化する効果が生まれます。
コードの解説は以上!!
動作(PWM)
書き込んでみると、、、
グラデーションで来ました!
次は、DACバージョンの回路です!
回路DAC
こちらもあまり変わらず、0番ピンからの接続をA5番ピンから接続するだけです。
プログラム(DAC)
以下のプログラムをArduinoIDEを使って書き込んでください!
const int dacPin = A5; // DAC出力に使用するピン番号
const int fadeDuration = 2500; // フェードイン・フェードアウトの時間(ミリ秒)
void setup() {
pinMode(dacPin, OUTPUT); // DACピンを出力として設定
}
void loop() {
fade(dacPin, 0, 255, fadeDuration); // 明るくする
delay(1000); // 明るくした後、1秒間維持
fade(dacPin, 255, 0, fadeDuration); // 消灯する
delay(1000); // 消灯した後、1秒間維持
}
void fade(int pin, int startValue, int endValue, int duration) {
int steps = 256; // 0から255までのステップ数
int stepDelay = duration / steps; // 各ステップごとの遅延時間
for (int i = 0; i <= steps; i++) {
int value = map(i, 0, steps, startValue, endValue); // ステップに応じた値にマッピング
analogWrite(pin, value); // DACピンに値を書き込む
delay(stepDelay); // 各ステップごとに遅延
}
}
プログラムの解説(DAC)
変数の宣言
const int dacPin = A5; // DAC出力に使用するピン番号
const int fadeDuration = 2500; // フェードイン・フェードアウトの時間(ミリ秒)
dacPin: LEDを接続するDACピンの番号を定義しています。このピンを通じて、LEDの明るさを制御します。ArduinoにはDACピンがありませんが、ここでは例としてA5ピンを使用しています。
fadeDuration: LEDの明るさを変化させる時間をミリ秒で定義しています。この時間内で、LEDの明るさが最小値から最大値、またはその逆に変化します。
setup関数
void setup() {
pinMode(dacPin, OUTPUT); // DACピンを出力として設定
}
pinMode(dacPin, OUTPUT): dacPinを出力ピンとして設定します。これにより、analogWrite関数を使ってピンに電圧を出力できるようになります。
loop関数
void loop() {
fade(dacPin, 0, 255, fadeDuration); // 明るくする
delay(1000); // 明るくした後、1秒間維持
fade(dacPin, 255, 0, fadeDuration); // 消灯する
delay(1000); // 消灯した後、1秒間維持
}
fade(dacPin, 0, 255, fadeDuration): fade
関数を呼び出して、LEDを0(消灯)から255(最大輝度)まで徐々に明るくします。
delay(1000): LEDが最大輝度に達した後、1秒間その明るさを維持します。
fade(dacPin, 255, 0, fadeDuration): fade関数を呼び出して、LEDを255(最大輝度)から0(消灯)まで徐々に暗くします。
delay(1000): LEDが消灯した後、1秒間その状態を維持します。
fade関数
void fade(int pin, int startValue, int endValue, int duration) {
int steps = 256; // 0から255までのステップ数
int stepDelay = duration / steps; // 各ステップごとの遅延時間
for (int i = 0; i <= steps; i++) {
int value = map(i, 0, steps, startValue, endValue); // ステップに応じた値にマッピング
analogWrite(pin, value); // DACピンに値を書き込む
delay(stepDelay); // 各ステップごとに遅延
}
}
steps: 明るさを変化させるステップ数を定義しています。ここでは0から255までの256ステップに設定しています。
stepDelay: 各ステップごとの遅延時間を計算します。フェードインまたはフェードアウトの全体の時間をステップ数で割った値です。
ループ内の動作
- map(i, 0, steps, startValue, endValue): 現在のステップ
i
を開始値startValueから終了値endValueの範囲にマッピングします。これにより、各ステップでのPWM値が計算されます。 - analogWrite(pin, value): 計算されたPWM値valueを指定されたピンpinに書き込みます。これにより、LEDの明るさが変化します。
- delay(stepDelay): 次のステップに進む前に、一定の時間(stepDelay)待ちます。これにより、LEDの明るさが徐々に変化する効果が生まれます。
解説は以上!!
動作(DAC)
書き込みが完了すると、、、
ゆっくり点灯することができました!
ということで、2つのコードを合体させて比較していきます!
回路(PWM+DAC)
今回は、A5と1番ピンにそれぞれ抵抗とLEDをつなぐだけです。
それでは、コードを見ていきましょう。
プログラム(PWM+DAC)じんわり
以下のコードが、PWMとDACの比較するコードになります。
const int dacPin = A5; // DAC出力に使用するピン番号
const int pwmPin = 0; // PWM出力に使用するピン番号
const int fadeDuration = 2500; // フェードイン・フェードアウトの時間(ミリ秒)
void setup() {
pinMode(dacPin, OUTPUT); // DACピンを出力として設定
pinMode(pwmPin, OUTPUT); // PWMピンを出力として設定
}
void loop() {
fade(dacPin, pwmPin, 0, 255, fadeDuration); // 明るくする
delay(1000); // 明るくした後、1秒間維持
fade(dacPin, pwmPin, 255, 0, fadeDuration); // 消灯する
delay(1000); // 消灯した後、1秒間維持
}
void fade(int dacPin, int pwmPin, int startValue, int endValue, int duration) {
int steps = 256; // 0から255までのステップ数
int stepDelay = duration / steps; // 各ステップごとの遅延時間
for (int i = 0; i <= steps; i++) {
int value = map(i, 0, steps, startValue, endValue); // ステップに応じた値にマッピング
analogWrite(pwmPin, value); // PWMピンに値を書き込む
analogWrite(dacPin, value); // DACピンに値を書き込む
delay(stepDelay); // 各ステップごとに遅延
}
}
プログラムの解説(DAC+PWM)
変数の宣言
const int dacPin = A5; // DAC出力に使用するピン番号
const int pwmPin = 0; // PWM出力に使用するピン番号
const int fadeDuration = 2500; // フェードイン・フェードアウトの時間(ミリ秒)
dacPin: LEDを接続するDACピンの番号を定義しています。このピンを通じて、LEDの明るさを制御します。ArduinoにはDACピンがありませんが、ここでは例としてA5ピンを使用しています。
pwmPin: LEDを接続するPWMピンの番号を定義しています。このピンを通じて、LEDの明るさを制御します。
fadeDuration: LEDの明るさを変化させる時間をミリ秒で定義しています。この時間内で、LEDの明るさが最小値から最大値、またはその逆に変化します。
setup関数
void setup() {
pinMode(dacPin, OUTPUT); // DACピンを出力として設定
pinMode(pwmPin, OUTPUT); // PWMピンを出力として設定
}
pinMode(dacPin, OUTPUT): dacPinを出力ピンとして設定します。これにより、analogWrite関数を使ってピンに電圧を出力できるようになります。
pinMode(pwmPin, OUTPUT): pwmPinを出力ピンとして設定します。これにより、analogWrite関数を使ってピンに電圧を出力できるようになります。
loop関数
void loop() {
fade(dacPin, pwmPin, 0, 255, fadeDuration); // 明るくする
delay(1000); // 明るくした後、1秒間維持
fade(dacPin, pwmPin, 255, 0, fadeDuration); // 消灯する
delay(1000); // 消灯した後、1秒間維持
}
fade(dacPin, pwmPin, 0, 255, fadeDuration): fade関数を呼び出して、LEDを0(消灯)から255(最大輝度)まで徐々に明るくします。
delay(1000): LEDが最大輝度に達した後、1秒間その明るさを維持します。
fade(dacPin, pwmPin, 255, 0, fadeDuration): fade関数を呼び出して、LEDを255(最大輝度)から0(消灯)まで徐々に暗くします。
delay(1000): LEDが消灯した後、1秒間その状態を維持します。
fade関数
void fade(int dacPin, int pwmPin, int startValue, int endValue, int duration) {
int steps = 256; // 0から255までのステップ数
int stepDelay = duration / steps; // 各ステップごとの遅延時間
for (int i = 0; i <= steps; i++) {
int value = map(i, 0, steps, startValue, endValue); // ステップに応じた値にマッピング
analogWrite(pwmPin, value); // PWMピンに値を書き込む
analogWrite(dacPin, value); // DACピンに値を書き込む
delay(stepDelay); // 各ステップごとに遅延
}
}
steps: 明るさを変化させるステップ数を定義しています。ここでは0から255までの256ステップに設定しています。
stepDelay: 各ステップごとの遅延時間を計算します。フェードインまたはフェードアウトの全体の時間をステップ数で割った値です。
ループ内の動作
- map(i, 0, steps, startValue, endValue): 現在のステップ
i
を開始値startValueから終了値endValueの範囲にマッピングします。これにより、各ステップでのPWM値が計算されます。 - analogWrite(pwmPin, value): 計算されたPWM値valueを指定されたピンpwmPinに書き込みます。これにより、LEDの明るさが変化します。
- analogWrite(dacPin, value): 計算されたPWM値valueを指定されたピンdacPinに書き込みます。これにより、LEDの明るさが変化します。
- delay(stepDelay): 次のステップに進む前に、一定の時間(stepDelay)待ちます。これにより、LEDの明るさが徐々に変化する効果が生まれます。
動作()
消灯しました!
こんな感じで、同じタイミングで点灯させることができました!
比較結果!
違いがあんまり分からない、、
ということで、ADCとPWMでLEDを光らせて違いを確かめようと考えていたのですが、あんまり分かりませんでした。
電圧を測ったり、オシロスコープで確認すると違いがよくわかると思うのですが、そういった機器を持っていないので、分かりませんでした。(m´・ω・`)m ゴメン…
動かないとき
動かない場合は、以下の項目を確認してみてください。
接続・モジュールの確認
ジャンパー線を指すところがあっているか、
ジャンパー線、LEDが壊れていないかをきちんと確認してください。
プログラムの書き込みエラー
プログラムがきちんと書き込み出来ているか。エラーが出ていないかを確認して下さい。
リセットボタンを押してみる
プログラムの書き込みが完了した後、ArduinoR4のマイコン上にあるRESETボタンを押してみて下さい。
公式ライン
動作しない場合、やってほしい企画等ありましたら、公式ラインに連絡ください!
おわり
今回はArduinoR4の新機能DACとADCを使ってみました!
いかがだったでしょうか??
今回の比較では、分かりにくかったですね、、
本当はオシロスコープとかあればいいのですが、お金ないです…
ブザーなどで音階で比較したらわかりやすいかもしれないので、暇なときに記事にしてみます!
今回の使用した機能が使えるようになると、皆さんも利用がができるようになったと思います!
ぜひ、これからの電子工作に生かしていってください!
それでは、また次回の記事でお会いしましょう!