analogWriteResolution

動作

analogWrite関数で指定する分解能(ビット数)を設定します。

分解能(ビット数)」とは、analogWrite関数で指定できる値の細かさのような意味です。

analogWrite関数はデフォルトで8ビット(0〜255の256段階)でアナログ出力の値を指定します。これはArduinoボード間の差をなくすための仕様で、一番性能の低いボードに合わせています。

Arduino Uno R4Arduino Dueなどの高性能なボードでは、ハードウェアが8ビットより高い分解能に対応しています。analogWriteResolution関数を使用すると、これらのボードのハードウェア性能をフルに活用できます。

例えば、デフォルトの8ビット(0〜255)ではLEDの明るさは256段階ですが、12ビット(0〜4095)に変更すると4096段階になり、より滑らかに明るさを変化させることができます。

分解能の違いは次のようなイメージになります。上側が分解能8ビット下側が分解能12ビットの場合です。左側のLEDを右側のスライダーで明るさ調整します。上側のスライダーは256段階なので目盛りも区別できてスライダーを動かすと少しカクカクします。下側のスライダーは4096段階なので、目盛りが細かくなり塗りつぶし状態に見え、スライダーは滑らかに動きます。

分解能:8ビット(256段階)
8 bit
256ステップ
0 128 / 255 255
分解能:12ビット(4096段階)
12 bit
4096ステップ(細かすぎて塗りつぶしに見える)
0 2048 / 4095 4095

LEDの場合、人間の目は暗い部分が敏感に明るさの変化を判別します。もし、8ビット分解能で明るさ変化のステップが荒く感じる場合、analogWriteResolution関数で分解能を大きくすると滑らかな明るさ変化にすることができます。

注意!

analogWriteResolution関数は、主にAVRマイコン以外を搭載したボード(Arduino Uno R4、Arduino Due、Arduino Zero、Arduino MKRシリーズ、ESP32など)で使用できます。

AVRマイコンを搭載したボード(Arduino Uno R3、Arduino Nanoなど)のPWM分解能は8ビットに固定されています。これらのボードでanalogWriteResolutino関数を使用するとエラーになります(2026年時点)。

主な用途

analogWrite関数で指定する値の分解能を変更する場合に使用します。具体的には次のような場合です。

  • LEDの明るさをより滑らかに変化させたい場合(特に暗い領域の変化を滑らかにしたい場合)
  • DACピン(Digital-to-Analog Converter・デジタルアナログ変換器)の性能をフルに活用したい場合
  • analogRead関数の読み取り値をそのままanalogWrite関数に渡したい場合(analogReadanalogWriteの分解能を揃えることで数値変換が不要になります)

書式

ESP32では書式が異なります。詳細はこのセクションの後半をご確認ください。

analogWriteResolution(value);
引数value分解能をビット数で指定します。1〜32の整数値を指定できます。
指定した分解能はすべてのピンに適用されます。
戻り値なし
ポイント

分解能はボードの性能にかかわらず設定できます(Arduino Uno R3などのAVR系を除く)。

例えばArduino Uno R4のハードウェア性能は分解能14ビットですが、それ以上の値を指定することができます。例えば分解能を16ビットに設定した場合、0〜65535(16ビット)を16383段階(14ビット)で使用することになります。

ポイント

analogWriteResolutionで設定した分解能は、この関数以降に実行されるanalogWrite関数に有効です。ピンごとに分解能を変更したい場合、それぞれのピンに対するanalogWrite関数の前にanalogWriteResolution関数で分解能を指定します。

ESP32の書式

ESP32ではピンごとに分解能を指定できるため、書式は次のようになっています。

analogWriteResolution(pin, value);
引数pin分解能を設定するピンを指定します。
value分解能をビット数で指定します。
無印シリーズ:1 〜 20
Sシリーズ・Cシリーズ:1 〜 14
戻り値なし
補足

ESP32では、すべてのピンで異なる分解能を設定できるわけではありません。

ESP32内部にはPWMモジュールが4基搭載されていて、PWM制御ピンが4ピンを超える場合はPWMモジュールが共有されます。そのため、例えば5ピンに対してそれぞれ異なる分解能を設定することはできません。

使用例

次のコードにより、analogWrite関数の分解能を変更することができます。

analogWriteResolution(8);   // 8ビット(0〜255)に設定(デフォルト)
analogWriteResolution(10);  // 10ビット(0〜1023)に設定
analogWriteResolution(12);  // 12ビット(0〜4095)に設定

サンプルスケッチ

次の回路とスケッチでは、23番ピンと19番ピンに接続したLEDを異なる分解能でアナログ制御しています。

このサンプルではピンごとに分解能を指定できるESP32を使用しています。ピンごとに指定できますので、setup関数内で最初に一度だけそれぞれのピンの分解能を指定しています。(一般的なArduinoボードのでは、ピンごとの分解能を変えたい場合、それぞれのanalogWrite関数の前に毎回分解能を指定する必要があります)

分解能の設定は、23番ピンの赤色LEDは分解能4ビット、19番ピンの緑色LEDは分解能8ビットとしています。

赤色LEDは分解能が低いため、明るさの変化がより荒くなります。点灯状態では違いが分かりづらいですが、消灯状態から点灯状態になる領域が特に違いが顕著になります。ボリュームをちょっとだけ右側に動かすと、分解能が高い緑色LEDはすぐに点灯しますが、赤色LEDは分解能が低いため、ボリュームをもう少し右側にずらさないと反応しません。

ボタンをクリックするとシミュレーターが動作します。スケッチを変更することもできます。変更した場合、シミュレーションを一度 ボタンをクリックして停止してから再度シミュレーターを開始してください。