今回はArduinoの制御ピンの電圧をコントロールする方法についてご紹介します。「Arduinoで制御ピンの電圧を制御する」というと、PWM制御が思いつくのではないでしょうか?
言い換えれば、Arduinoの電圧制御=PWMというイメージですよね。
おさらいですが、Arduinoが出力できる電圧は5Vです。大事なことなのでもう一度言いますが、Arduinoが自由にON/OFFできる出力は直流5Vのみです。
ただ、5Vしか出せないと困ることもありますよね?そんな時に使えるのがPWM制御です。
PWM制御の機能を使うことができれば、DC5Vを出す時間を制御することで、あたかも5V以下の電圧を出すことができます。例えば3.3vでも4vでも自由に見かけの電圧をコントロールすることが可能です。
ただしここで重要なのが、あくまで5Vを出す時間を細かく制御しているところです。Arduinoは5Vしか出力できないので、出力する時間だけでなんとかする。という思想なわけです。

ただし….実はArduino UNO R4は、PWM制御ではなく、本当に電圧を上下させられるって知っていましたか??使えるピンの数は多くないですが、それでも電圧をコントロールできるのは大きな進化ですね。
やり方を含め、本当に電圧をコントロールできているか?もオシロスコープを使ってPWMと比較して結果を出してみます。
ちなみに完全に余談ですが、Arduinoだとアナログの電圧変更はできる機種は少ないですが、ESP32だとできる機種がほとんどなので、Arduinoが少し遅れている感もあったりなかったり…
DACによるアナログの電圧制御の方法と、うまく制御できるかの確認方法がわかる。
本ブログはアフィリエイトを用いた広告を掲載している場合があります。
PWM制御のおさらい(どうやって5V以下に見せかけているか?)
まずはArduinoのほとんどの機種で搭載されているPWM制御ですが、おさらいとしてどんな仕組みで電圧制御できているか解説しておきましょう。
冒頭でもお話しましたが、PWM制御は、電圧を出す時間を制限することで、見かけ上の電圧を下げることが可能です。Arduinoの機能としてはanalogWriteというコマンドを使うことでこのPWM制御を使うことができます。
analogWriteでどのよう制御をしているか詳しくはこちらの以前の記事に記載しています。
こちらの記事では、Arduino UNO R4で追加されたPWMの機能について紹介しています。どんな事ができて、使いこなすためにはどうしたらいいのかを詳しく解説してみました。
実際にPWMを使って電圧をコントロールしてみる
void setup() {
// PWM ピンを出力に設定
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
// デューティー比を 0〜255 の値に変換して出力
analogWrite(3, 255); // 100%
analogWrite(5, 204); // 80% (255 * 0.8 ≒ 204)
analogWrite(6, 128); // 50% (255 * 0.5)
analogWrite(9, 26); // 10% (255 * 0.1 ≒ 26)
}
void loop() {
// 何もしない
}PWMとは上の記事でなんとなく理解していただけると思います。ただ、本当にPWMのデューティー比を変えるだけで、電圧が変化する(変化したように見える)のか?試してみないとわからないですよね。
そこで、今回は、オシロスコープとテスターを使って、PWMの信号を出したときに、どんな波形で、テスターには何Vと表示されるか?について実機で確認してみました。試した種類は以下の表の通りです。
| デューティ比[%] | 予想される電圧[V] |
|---|---|
| 100 | 5 |
| 80 | 4 |
| 50 | 2.5 |
| 10 | 0.5 |
デューティ比:100%の場合
まずデューティ比100%の場合です。これは、もうやらなくてもわかると思いますが、100%の区間で5Vが出ているので、当然5Vと認識されるはずですね。

デューティ比:80%の場合
次にデューティー比を80%に落としてみましょう。そうすると、電圧としては5×8/10で、4Vになるはずですね。結果はどうなるでしょうか?

デューティ比:50%の場合
次はデューティー比半分です。これは簡単ですね。電圧も半分になるはずです。

デューティ比:10%の場合
最後にデューティ比10%でやってみましょう。100%に対して1/10の電圧になるはずです。

実際に電圧測定してみた結果
それではここまでの実験の結果をまとめてみましょう。おおむね思い通りになりましたね。
| デューティ比[%] | 予想される電圧[V] | 実際の電圧[V] |
|---|---|---|
| 100 | 5 | 4.69 |
| 80 | 4 | 3.756 |
| 50 | 2.5 | 2.357 |
| 10 | 0.5 | 0.480 |
Arduino UNO R4だとPWMを使わずに電圧をコントロールできる
ほとんどのArduinoにはPWM制御によって電圧の制御できるようになっていますが、PWM制御以外に、電圧制御することができる機種はほとんどありません。
その数少ない電圧制御のできる機種が、2023年にリリースされたArduino UNO R4です。これがそのArduino UNO R4です。ほかにもPLC型のOPTAもできるようですが、依然としてPWM制御による電圧制御が大半を占めています。

Arduino UNO R4には二つの機種があり、MINIMAとWifiがあります。基本機能の大きな違いとしては、Wifiのほうは無線の機能が使えます。WifiとBluetoothどちらもできますから、無線も使ってみたい場合にはぜひWifiを選びましょう。ただしWifiのほうが少々値段が高いので、無線機能が不要の場合はMINIMAを選ぶのが良いでしょう。
こちらが無線機能のないArduino UNO R4 MINIMA
こちらが無線機能の付いているArduino UNO R4 Wifi
- Arduino UNO R4 MINIMA:無線機能が無い基本タイプ
- Arduino UNO R4 Wifi:無線機能付きの高価版
実験:LEDの光量を二つの方法で電圧コントロールしてみる
それでは実際に電圧をコントロールしてみましょう。PWM制御とそのまま電圧を制御する方法の二つそれぞれでご紹介します。
PWM制御で電圧をコントロールする場合
PWM制御する場合は、ArduinoのanalogWriteを使います。おさらいですが、ArduinoはDC5Vを出力できますが、逆に言うとDC5Vしか出力できません。例えば5Vの半分の2.5Vを出力したい場合には、analogWriteのコマンドで、
analogWrite(出力したいピン番号,128);と書きます。128という数字は、255がマックスの5Vだからです。それでは、次のソースコードをArduinoに書き込んで電圧の波形をオシロスコープで確認してみましょう。
注意点ですが、出力したいピン番号には制約があります。回路的にPWMを出せるピンと出せないピンがあるからです。
見分け方は、~と基板上のピン番号に記載されているピンはPWMを出せます。具体的には、3,5,6,10,11番ピンは~が付いているのでPWMを出せます。

このように、11,10,9の前に~という記号がついていることがわかると思います。
DACで電圧をコントロールする場合の注意点2つ
DACで電圧をコントロールするということは、直接電圧を操作するイメージです。直線的に電圧が上がっていきます。これは、見せかけの電圧制御ではなく、本当に電圧を制御しています。
DACで電圧をコントロールする際の注意点が2つ、最後に気づきにくい注意点が1つあります。これを守れば自由に電圧の上げ下げが可能です。2つ目の12bitの話は、やらなくても問題はありませんが、対応しておいたほうが無難です。
配線の接続先はA0で固定。
配線と言っているのは、Arduinoから出てくる端子の話です。Arduinoのピンはそれぞれに役割があり、DACもピンに割り当てられています。PWMを出力するようなAnalogピンはいくつかありますが、DACが搭載されているのは固定で1ピンのみです。そのピンがA0という名前のピンです。


つまり、このA0というピンに接続しない限り、DACの機能は絶対に使えません。物理的につながっていないので。PWMが複数のピンで使用可能なことから、少しArduinoを触ったことがある人は、感覚的にこの内容は引っかかるかもしれません。DACを使いたいなら、A0つまり9番ピンに接続するのを忘れないようにしましょう。
標準では粗い256(8bit)階調。設定を変えて4096(12bit)階調に変えたほうが良い。
これもいままでArduinoを触ったことがある人だと引っかかりそうな内容です。通常、いままでもつかえてきたPWMというのは、8bit階調で、0~255で合計256階調でした。つまり、0~5Vを256で分割していた。ということですね。
ただ、Arduino UNO R4のDACは、従来の8bitよりも高性能で、12bit(0~4095)の分解能を持っています。つまり、5Vを4096で分割しているため、とても細やかな電圧設定が可能なのです。8bitと12bitでは分解能が桁違いですから、基本的には12bitに指定してあげたほうが良いです。
12bitを使うためには、1行setupのところに書けばOKです。具体的には、
analogWriteResolution(12);と書けば12bit階調のDAC出力が可能になります。
このコマンドは、analogReadの時に分解能を変更するときにも使えます。Readの場合は、DACよりも諧調が増えて、14bitまで対応しています。なので、14bitの階調でReadする必要があれば、引数のかっこに入る数字は14になります。
DACを使ってアナログ電圧を出力する方法
DACを使う注意点をご紹介しましたが、実際にどんな回路で、どんなスケッチが必要なのか?見たほうが早いですよね?というわけで実例として回路とスケッチを用意してみました。この通りに接続して、スケッチを書き込んでもらえればとりあえず動きます。
使用するスケッチ
PWMとの違いを確認できるように、念のため3番ピンでもPWMを出力するようなスケッチにしてみました。DACでA0からアナログ電圧を出力したいだけなら、この記述は不要です。
void setup() {
// PWM ピンを出力に設定
pinMode(3, OUTPUT);
analogWriteResolution(12);
// デューティー比を 0〜255 の値に変換して出力
analogWrite(3, 2048); // PWM Duty50%
analogWrite(A0,2048);// DAC50%
}
void loop() {
// 何もしない
}【注意点】あんまりDACで電流は流せない。という話
ここまで来て、DAC使ってみようかな。と思ったそこのあなた。実は、自由に電圧を変化させることはできるものの、注意点も有ります。
それが、【流せる電流値】です。
まずはこちらの動画をご覧ください。わたしが撮影・編集したショート動画です。
どうでしょうか?左のLEDのほうが明るいのに、電圧が低く、右のLEDのほうが暗いのに電圧が高いです。原因を先にお伝えしますが、意外と簡単な話で、右のほうが電流値が低いから。というのが答えです。
この時使用したスケッチがこちらです。
void setup() {
// PWM ピンを出力に設定
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(9, OUTPUT);
analogWriteResolution(12);
// デューティー比を 0〜255 の値に変換して出力
analogWrite(3, 2048); // 50%
analogWrite(A0,2048);
}
void loop() {
// 何もしない
}PWMのデューティ比、DACともに50%の出力になるように設定しています。ですから、5Vの半分の2.5Vが出力されます。ただ、実際にはLEDの電圧降下があります。
LEDは同じものを使っていますから、電圧降下の値も同じになるはずです。ただ実際には一致していません。
DACの流せる電流値の公称値は発表されていませんが、高インピーダンス負荷向けという文言があったり、負荷抵抗は数$kΩ$以上を推奨、というアナウンスがあるので、数十$mA$流したい。というのは想定知れていないことがわかります。
実際に、動画で出ていた右側のDACにつないだLEDに流れていた電流を計算すると、次のようになります。
前提条件
- DAC 解像度:12bit
- 5V DAC として動作しているので、出力値 2048 のときの理論電圧は
$$V_{\mathrm{DAC,ideal}}=5\times \frac{2048}{4095}\approx 2.5\ \mathrm{V}$$
- 負荷:LED + 抵抗 $100\ \Omega$
- 実測値:LED 両端電圧
$$V_{\mathrm{LED}}\approx 1.9\ \mathrm{V}$$
抵抗にかかる電圧
DAC の理論出力 2.5 $V$ のうち、LED に 1.9 $V$ かかっているので、
残りが直列抵抗にかかる電圧:
$$V_R=V_{\mathrm{DAC,ideal}}-V_{\mathrm{LED}}$$
$$V_R=2.5\ \mathrm{V}-1.9\ \mathrm{V}=0.6\ \mathrm{V}$$
抵抗を流れる電流
オームの法則より、抵抗 \(R=100\ \Omega\) を流れる電流 $I$は
$$I=\frac{V_R}{R}$$
$$I=\frac{0.6\ \mathrm{V}}{100\ \Omega }=0.006\ \mathrm{A}$$
$$I=6\ \mathrm{mA}$$
つまり、計算上たった6$mA$程度しか流れていないことがわかりました。それに対してPWMのほうは数十mA流すことが可能ですので、PWM制御していたLEDのほうが明るかった。ということですね。
微小な電流の場合で比較してみたら?
$10mA$程度では、DACが流せる電流を超えているのがわかりました。では、微小な電流の場合、本当にPWMとDACで同じ電圧になるのか?念のため確認しておきましょう。
用意するのは$10kΩ$の抵抗です。$10kΩ$の抵抗を、出力値2048に設定して接続すると、オームの法則より、以下のようになります。
PWM も DAC も、2048(12bit)なら理論電圧は:
$$V_{\mathrm{ideal}}=5\times \frac{2048}{4095}\approx 2.5\ \mathrm{V}$$
$10kΩ$負荷に流れる電流は:
$$I=\frac{2.5\ \mathrm{V}}{10\, 000\ \Omega }$$
$$I=0.00025\ \mathrm{A}=0.25\ \mathrm{mA}$$

1mAよりも小さい電流値が流れるような場合であれば、DACもPWMも電圧としては一致していることがわかると思います。
今回のまとめ:Arduino UNO R4ならPWM制御ではなく電圧コントロールも可能。注意点には気を付けましょう。
今回は、Arduino UNO R4を使って、DACによる電圧コントロールの方法について解説しました。Arduinoというか、マイコンボード全般に言えることですが、電圧制御となると、どうしてもPWMがほとんどで、DACを搭載して、アナログの電圧制御をしているものは少ないイメージです。
今回ArduinoがDACを搭載してくれたことで、使いやすさが向上しましたね。電圧制御が必要な場面では、積極的に使っていくのがいいですね。ぜひ使い方をマスターして、いろんなことに活用してみてください。





