🚨

LEDでわかるデジタル出力とアナログ出力の違い

2022/12/21に公開


0と1で制御するデジタル出力


256段階を扱えるアナログ出力

デジタル出力の例

void setup() {
  pinMode(9, OUTPUT);
}

int count = 0;

void loop() {
  digitalWrite(9, sin(2 * PI / (60 * 2) * count) > 0);
  delay(1000 / 60);
  count++;
}

電圧があるかないかの二通りで制御する。digitalWrite の第二引数に 0 か 1 を渡せば 0V か 5V になる。

アナログ出力の例

void setup() {
  pinMode(9, OUTPUT);
}

int count = 0;

void loop() {
  analogWrite(9, 128 + sin(2 * PI / (60 * 2) * count) * 127);
  delay(1000 / 60);
  count++;
}

デジタル版とのソースコード上での違いは(ほぼ) digitalWrite を analogWrite にしただけ。PWM (Pulse With Modulation) で 0V から 5V までを 256 分割できる。この仕組みが非常に奇妙で 0V と 5V にしている時間を、例えば半々として切り替えを繰り返すと部品たちは平均値の 2.5V が来ていると勘違いするらしい。デジタルな世界でそんなことある? って思うのだけど実際そうなっている。

255 は 5V ではないのに 5V になるのはなぜ?

analogWrite が 255 を特別扱いしているから。正確には 0 と 255 を特別扱いしている。0 なら digitalWrite で LOW を送り、255 なら HIGH を送るように小細工されている。

参照:

http://igarage.cocolog-nifty.com/blog/2020/02/post-d4c821.html

疑問

デジタル出力に比べてアナログ出力(PWM)を使うと消費電力が高くなる? (TODO: わかったら書く)

Discussion