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