🕯️

ArduinoでLEDを“炎のように”ゆらめかせる:analogWriteとPWMを理解する

に公開

Arduino初心者です。
『Arduinoをはじめよう』という書籍を読みながら、少しずつ学んでいます。
LEDをただ点灯させるだけではなく、キャンドルのようにゆらめく光を再現してみたくなり、試行錯誤しました。
この記事では、私と同じく本当の初心者でもわかるように、基礎的なところから解説をしていきます。
同じような初心者の方の参考になれば嬉しいです。

ArduinoとPWMの基礎知識

▷ Arduinoとは
単純にArduinoというとボードとIDEがありますが、こちらはボードの方の解説。

手軽に使える小型のマイコンボード。頭はよくないですが、安いので気軽に物作りに使うことができます。C++ベースのArduino言語で書き込みができ、簡単にライトやセンサーをつけることができます。

いくつかの種類がありますが、私はArduino Unoという種類のものを使っています。
13つのデジタルピン、6つのアナログINピンがついています

▷ ピン
ピンとは、基板の端についている小さな金属の接点で、電気信号を送ったり受け取ったりするための出入り口のことです。ここに出力(LEDライト)や入力(スイッチ)をつけることでArduinoで制御できる形にします。

今回は「デジタルピン」を使用します。
アナログピンはまだ使ったことがないのですが、光・温度・電圧などの微妙な変化を読み取るために使われるようです。
また、今回は揺らぎ表現のためにPWMを使用するので、13つあるデジタルピンの中でも、PWM対応している3,5,6,9,10,11のどれかを使います。

▷ PWM(パルス幅変調)とは
Arduinoのデジタルピンは通常「ON(5V)」または「OFF(0V)」の2通りしか出力できません。
つまり、LEDは「点灯する」か「消灯する」しかできないはずです。

しかし、人間の目は高速で点滅する光を“明るさの強弱”として認識するという性質があります(残像効果:POV = Persistence of Vision)。この性質を利用し、LEDを非常に短い時間単位でONとOFFを繰り返すことで、「少し明るい」といった中間的な明るさを表現することができます。

このように、ONの時間の割合(デューティ比)を変えることで、アナログ的な出力を擬似的に実現する技術をPWM(Pulse Width Modulation/パルス幅変調)と呼びます。

たとえば:

  • ONの時間が長い → 明るく見える
  • ONとOFFが半々 → 中くらいの明るさ
  • ONの時間が短い → 暗く見える

これを 「デューティ比(duty cycle)」 と呼び、Arduinoでは analogWrite() という関数で簡単に利用できます。また、LEDの明るさ調整だけでなく、モーターの回転速度の制御などにも応用されています。

▷ analogWrite関数

analogWrite(pin, value);
  • pin: 出力先のPWM対応ピン(例:9)
  • value: 0〜255の整数で、ONの時間割合(= デューティ比)

たとえば analogWrite(9, 128); と書くと、約50%のON時間でLEDが中程度の明るさになります。

LEDの接続方法(配線)

PWMに対応したデジタルピン9にLEDを接続し、抵抗を挟んでからGNDに接続します。
配線構成(簡易図):

Arduino 9番ピン → LED(アノード) → 抵抗 → LED(カソード) → GND

ブレッドボードを使うと、はんだ付けなしで簡単に配線できます。

補足:電子部品の基礎知識

▷ アクチュエーター
電気や信号を受け取って、「動き」や「音」などの物理的な出力を行う部品のことです。
入力に対して何らかの「動作」で応答し、出力装置とも呼ばれます。
今回のアクチュエーターは「LEDランプ」です。
一方、スイッチや光センサーなどは「入力装置(センサー)」と呼ばれます。

▷ カソード/アノード
LEDなどの極性がある電子部品(=電流の向きが決まっている部品) では、電気が正しく流れる向きが決まっています。

LEDライトはリード線の長さが異なり、どちらがマイナス側(カソード側)かわかるようになっています。
電流はアノード → カソード の向きにしか流れません。逆につなぐとLEDは光りません。

名前 記号 足の長さ 接続先 役割
アノード A 長い足 プラス側(Arduinoの出力など) 電流の入り口
カソード K 短い足 マイナス側(GND) 電流の出口

▷ ブレッドボード
電子部品をはんだ付けせずに簡単に配線できる、実験用の基板です。
ArduinoやLED、センサーなどを組み合わせて回路を組むときに、配線の確認や動作テストに使われます。

  • 中央エリア(A〜EとF〜J):横方向に5つずつ連結しています
  • 電源ライン(+、−):縦方向に1列全部が接続されています

▷ 抵抗と電流の基礎
LEDには必ず抵抗をつけましょう。抵抗がないと過電流で壊れる可能性があります。

基本的な電気の用語:

  • 電圧(V):水圧のようなもの(Arduinoは5V)
  • 電流(A):水の量のようなもの(流れる電気の量)
  • 抵抗(Ω):電流の流れを妨げる力

オームの法則:
I = V / R
(電流 = 電圧 ÷ 抵抗)

ちなみに、今回のLEDの順方向電圧(Vf)も入れて計算すると以下のような計算式になります。

  0.02A(最大) = (5V - 2V) / R
  R = (5V - 2V) / 0.02A = 150Ω(最小)

炎のような“ゆらぎ”を再現するコード

▷ Arduino IDE
Arduinoにコードを書き込み、プログラムを実行するための公式ソフトウェアです。
ちなみに「IDE」とは「統合開発環境」の略で、エディタ・コンパイラ・書き込みツールがひとつにまとまった便利なツールのことです。有名どころだとVSCode等があります。

// LED を接続するピン番号を定義(今回はピン9)
const int LED = 9;

void setup() {
  // ピン9を「出力モード」に設定(これでLEDを点灯できるようになる)
  pinMode(LED, OUTPUT);

  // ランダムの初期化(未使用ピンからノイズ取得)
  randomSeed(analogRead(0)); 
}

void loop() {
  // ゆらぎ範囲。ランダムにLEDの明るさを設定(100〜255の範囲で変化)
  // 0〜255が最大範囲だが、0(消灯)だと違和感があるので100〜にしている
  int brightness = random(100, 255);

  // 設定した明るさでLEDを点灯させる(PWM出力)
  analogWrite(LED, brightness);

  // 次の点滅までの待ち時間もランダムに設定(30〜100ミリ秒)
  delay(random(30, 100));
}

コードが書けたらArduinoとPCを繋いで、Arduinoに書き込みます。

完成

わかりづらいですが、炎のようにゆらめいています。

コードの数字を変更すると強風の中の蝋燭のような表現にもできます。
(動画だとあまりわからないかも?)

おわりに

本ではLEDをただ光らせるだけの内容でしたが、ひと工夫加えるだけで作業がぐっと楽しくなりました。
これからも、単に本の通りに進めるだけでなく、自分なりの遊び心を取り入れながら、学びをより面白く感じていけたらと思います。

Discussion