はじめに:なぜRGBフルカラーLEDなのか?
「LEDを光らせるだけでは物足りない」「もっと華やかな演出がしたい」——そんな想いを抱いたことはありませんか?
通常のLEDは単色しか発光できませんが、RGBフルカラーLEDを使えば、1つの部品で赤・緑・青の三原色を自由に混ぜ合わせ、理論上1677万色もの色彩表現が可能になります。照明演出、インジケーター、イルミネーション工作など、応用範囲は無限大です。
本記事では、ArduinoのPWM(パルス幅変調)機能を活用し、以下の2段階でフルカラーLED制御を習得します:
【STEP 1】デジタル出力による8色点灯
→ digitalWrite()でON/OFF制御し、光の三原色の加法混色の基礎を理解
【STEP 2】PWM制御による1677万色グラデーション
→ analogWrite()で各色の輝度を256段階制御し、滑らかな色相変化を実現
「LEDが虹色に光る瞬間」を一緒に体験しましょう。
RGBフルカラーLEDの構造と動作原理
1つのパッケージに3色のLEDチップ
RGBフルカラーLED(RGB LED)は、1つの透明樹脂パッケージ内に以下3色のLEDチップが封入された部品です:
- R (Red / 赤): 波長約620-630nm
- G (Green / 緑): 波長約515-530nm
- B (Blue / 青): 波長約460-470nm
これらは光の三原色と呼ばれ、人間の目の視細胞(錐体細胞)が感知する色の基本成分です。
RGBフルカラーLEDの内部構造(共通カソード型)
共通カソード型とコモンアノード型
RGB LEDには2つのタイプがあります:
| タイプ | 共通端子 | 各色端子の電位 | Arduino制御 |
|---|---|---|---|
| 共通カソード型 | GND(-極) | HIGH=点灯 | digitalWrite(R, HIGH) |
| コモンアノード型 | VCC(+極) | LOW=点灯 | digitalWrite(R, LOW) |
本記事では共通カソード型を使用します。各色のアノード(+極)をArduinoのデジタルピンに接続し、カソード(-極)を共通でGNDに落とす構成です。
加法混色による色の生成原理
RGBの各色を組み合わせることで、以下のような色が生成されます(加法混色):
| R | G | B | 結果の色 |
|---|---|---|---|
| ● | ○ | ○ | 赤 (Red) |
| ○ | ● | ○ | 緑 (Green) |
| ○ | ○ | ● | 青 (Blue) |
| ● | ● | ○ | 黄 (Yellow) |
| ● | ○ | ● | マゼンタ (Magenta) |
| ○ | ● | ● | シアン (Cyan) |
| ● | ● | ● | 白 (White) |
| ○ | ○ | ○ | 消灯 (Black) |
(●=点灯、○=消灯)
これは2³ = 8通りの組み合わせです。しかし、各色の明るさを調整できれば、256 × 256 × 256 = 16,777,216色の表現が可能になります。これを実現するのが次のPWM制御です。
必要な部品と接続仕様
| 部品名 | 仕様 | 数量 | 備考 |
|---|---|---|---|
| Arduino UNO | R3 / R4 Minima | 1 | PWM対応ピン使用 |
| RGBフルカラーLED | 共通カソード型(4ピン) | 1 | 5mm径、拡散型推奨 |
| 抵抗 | 220Ω(1/4W) | 3 | 電流制限用(各色1個) |
| ブレッドボード | 標準サイズ | 1 | - |
| ジャンパー線 | オス-オス | 4本 | - |
【STEP 1】デジタル出力による8色点灯制御
回路設計と配線
まずは基本的な8色点灯から始めます。各色をON/OFFするだけのシンプルな回路です。
フルカラーLEDの基本回路(共通カソード型)
回路のポイント:
-
電流制限抵抗は必須
LEDの各色に220Ωの抵抗を直列接続します。Arduino UNOのデジタルピン出力は5Vで、RGB LEDの順方向電圧(Vf)は赤=2.0V、緑/青=3.2V程度です。抵抗なしで接続すると過電流が流れて破損します。流れる電流の計算例: 赤: I = (5V - 2.0V) / 220Ω ≒ 13.6mA 緑/青: I = (5V - 3.2V) / 220Ω ≒ 8.2mA ※LEDの定格電流20mA以下で安全 -
PWM対応ピンを使用
後のSTEP 2でPWM制御を行うため、最初からPWM対応ピン(Arduino UNOの場合 3, 5, 6, 9, 10, 11番)を使用しておくと配線変更が不要です。今回は以下のピンを使用します:- 9番ピン → 赤(R)
- 10番ピン → 青(B)
- 11番ピン → 緑(G)
-
共通カソードはGNDへ
RGBフルカラーLEDの最も長いピン(共通カソード)をArduinoのGNDに接続します。
8通りの発色パターン(2³ = 8色)
サンプルコード:8色順次点灯
// ピン定義(PWM対応ピンを使用)
#define R 9 // 赤 (Red)
#define G 11 // 緑 (Green)
#define B 10 // 青 (Blue)
void setup() {
// 各ピンを出力モードに設定
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop() {
// 1. 赤 (Red)
digitalWrite(R, HIGH);
delay(500);
digitalWrite(R, LOW);
// 2. 緑 (Green)
digitalWrite(G, HIGH);
delay(500);
digitalWrite(G, LOW);
// 3. 青 (Blue)
digitalWrite(B, HIGH);
delay(500);
digitalWrite(B, LOW);
// 4. 黄 (Yellow = Red + Green)
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
delay(500);
digitalWrite(R, LOW);
digitalWrite(G, LOW);
// 5. シアン (Cyan = Green + Blue)
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
delay(500);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
// 6. マゼンタ (Magenta = Red + Blue)
digitalWrite(R, HIGH);
digitalWrite(B, HIGH);
delay(500);
digitalWrite(R, LOW);
digitalWrite(B, LOW);
// 7. 白 (White = Red + Green + Blue)
digitalWrite(R, HIGH);
digitalWrite(G, HIGH);
digitalWrite(B, HIGH);
delay(500);
// 8. 消灯 (Black = All OFF)
digitalWrite(R, LOW);
digitalWrite(G, LOW);
digitalWrite(B, LOW);
delay(500);
}
コードの動作解説:
pinMode()で各ピンを出力モードに設定digitalWrite(HIGH)でLED点灯、digitalWrite(LOW)で消灯- 各色を0.5秒間隔で順次点灯させ、8色のサイクルを繰り返す
- 光の三原色の組み合わせにより、赤→緑→青→黄→シアン→マゼンタ→白→消灯の順で発光
動作確認
このコードをArduino IDEで書き込むと、以下の動画のようにRGB LEDが8色を順次表示します:
トラブルシューティング:
| 症状 | 原因 | 対処法 |
|---|---|---|
| LEDが全く光らない | 配線ミス、極性逆接続 | カソード(長いピン)がGNDか確認 |
| 特定の色だけ光らない | その色の配線断線、抵抗未接続 | 該当ピンの配線を再確認 |
| すぐにLEDが焼損 | 抵抗未接続 | 必ず220Ωを各色に直列接続 |
| 色が混ざって見える | 拡散型LEDの特性 | 正常動作(期待通りの加法混色) |
【STEP 2】PWM制御で実現する1677万色グラデーション
PWM(パルス幅変調)の原理
デジタルピンの出力はHIGH(5V)とLOW(0V)の2値しかありませんが、高速でON/OFFを切り替え、ONの時間割合(デューティ比)を変えることで、疑似的にアナログ電圧を出力できます。これが**PWM(Pulse Width Modulation)**です。
デューティ比 0% (常にLOW) → 実効電圧 0V (消灯)
デューティ比 50% (半々) → 実効電圧 2.5V (中間輝度)
デューティ比 100% (常にHIGH) → 実効電圧 5V (最大輝度)
Arduino UNOのPWMは**8bit(256段階)**の分解能を持つため、各色を0〜255の値で制御できます。したがって:
256(赤)× 256(緑)× 256(青)= 16,777,216色
の表現が理論上可能になります。
analogWrite()関数の使い方
ArduinoのPWM制御にはanalogWrite()関数を使用します:
analogWrite(ピン番号, 0〜255の値);
- 0: 完全にOFF(消灯)
- 127: 約50%の輝度(中間輝度)
- 255: 完全にON(最大輝度)
重要: PWM機能が使えるのは、Arduino UNOの場合3, 5, 6, 9, 10, 11番ピンのみです。
三相正弦波によるスムーズなカラーフェード
各色の輝度をサインカーブ(正弦波)に従って変化させ、かつ位相を120度(85ステップ)ずつずらすことで、虹のように滑らかに色が遷移するグラデーション効果を実現します。
三相正弦波による位相制御(各色を85ステップずらす)
位相差の意味:
- 赤(R): 位相0度(基準)
- 緑(G): 位相120度(85ステップ後)
- 青(B): 位相240度(170ステップ後)
これにより、ある瞬間に赤が最大輝度のとき、緑と青は中間輝度や消灯状態にあり、時間経過とともに各色の輝度バランスが連続的に変化します。結果として、赤→オレンジ→黄→緑→シアン→青→紫→赤…と循環する美しいグラデーションが生まれます。
サンプルコード:1677万色グラデーション
// ピン定義(PWM対応ピンを使用)
#define R 9 // 赤 (Red)
#define G 11 // 緑 (Green)
#define B 10 // 青 (Blue)
void setup() {
// 各ピンを出力モードに設定
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
}
void loop() {
uint8_t r, g, b; // 各色の輝度値(0-255)
uint8_t i; // ループカウンタ
for (i = 0;; i++) { // 無限ループ(iは自動的にオーバーフロー)
// 各色の輝度をサインカーブで計算
// sin(x)の出力範囲 -1〜+1 を 0〜255 にスケーリング
r = (sin(2 * 3.14 / 255 * i) + 1) * (255 / 2);
g = (sin(2 * 3.14 / 255 * (i + 85)) + 1) * (255 / 2); // 120度位相差
b = (sin(2 * 3.14 / 255 * (i + 170)) + 1) * (255 / 2); // 240度位相差
// PWM出力で各色の輝度を制御
analogWrite(R, r);
analogWrite(G, g);
analogWrite(B, b);
delay(20); // 20msごとに更新(1周期 = 約5秒)
}
}
コードの詳細解説:
-
サイン関数によるスムーズな輝度変化
sin(2 * 3.14 / 255 * i)2 * 3.14= 2π(1周期)/ 255で255ステップで1周期完結iは0〜255で循環(uint8_t型のオーバーフロー利用)
-
-1〜+1を0〜255にスケーリング
(sin(...) + 1) * (255 / 2)+ 1で範囲を0〜2に変換* (255 / 2)で0〜255に拡大
-
位相差85ステップの意味
360度 / 3色 = 120度 255ステップ × (120 / 360) ≒ 85ステップ
動作確認と期待される結果
このコードを書き込むと、以下の動画のような滑らかなカラーグラデーションが観察できます:
チェックポイント:
- ✅ 色が急に切り替わらず、なめらかに遷移している
- ✅ 赤→オレンジ→黄→緑→青→紫の順で循環している
- ✅ 約5秒で1周期(255ステップ × 20ms)
- ✅ 明滅やちらつきがない(PWM周波数約490Hz/980Hzで人間の目には認識不可)
応用テクニックとカスタマイズ例
1. グラデーション速度の調整
delay()の値を変更することで、色変化の速さを制御できます:
delay(5); // 高速(約1.3秒/周期) → ディスコ風
delay(20); // 標準(約5秒/周期) → 落ち着いた演出
delay(100); // 低速(約25秒/周期) → じっくり鑑賞
2. センサー連動による動的色変更
温度センサーや光センサーの値をRGB値に反映させる例:
int sensorValue = analogRead(A0); // 0-1023の値
int brightness = map(sensorValue, 0, 1023, 0, 255);
analogWrite(R, brightness);
analogWrite(G, 255 - brightness); // 逆相関
analogWrite(B, 128); // 固定値
3. 特定の色範囲のみを使う
オレンジ〜赤のグラデーション(暖色系のみ):
r = 255; // 赤を常に最大
g = (sin(2 * 3.14 / 255 * i) + 1) * (128 / 2); // 緑を0-128に制限
b = 0; // 青を使わない
4. 複数のRGB LEDによるダイナミック点灯
今回は1個のLEDでしたが、複数個を制御する方法:
- シフトレジスタ(74HC595)を使用:多数のLEDを少ないピンで制御
- WS2812B(NeoPixel)を使用:1本の信号線で数百個を個別制御可能
まとめ:Arduino PWM制御の可能性
本記事では、RGBフルカラーLEDをArduinoで制御する2つのアプローチを実装しました:
習得した技術
✅ 光の三原色と加法混色の理解
→ RGB(赤・緑・青)の組み合わせで多彩な色を生成
✅ digitalWrite()による8色点灯
→ デジタル出力の基本、共通カソード型LEDの配線
✅ analogWrite()によるPWM制御
→ 256段階の輝度調整で1677万色の表現
✅ 三相正弦波による位相制御
→ 数学的アプローチで美しいグラデーション実現
Arduino PWM制御の応用範囲
今回習得したPWM技術は、LED制御だけでなく以下のような用途にも応用できます:
- モーター速度制御: DCモーターの回転数を可変制御
- サーボモーター制御: 角度指定(
Servo.write()の内部でPWM使用) - スピーカー駆動:
tone()関数で周波数を変えてメロディー演奏 - 調光器: 白色LEDの明るさを無段階調整
次のステップ:さらなる発展
【初級】センサー連動
温度センサー・光センサーの値をRGB値に反映し、環境に応じて色が変わる"スマートライト"を実装
【中級】NeoPixel(WS2812B)の制御
1本の信号線で数百個のフルカラーLEDを個別制御し、流れるような光の演出を実現
【上級】Bluetooth連動スマホアプリ制御
HC-05モジュールを使い、スマホアプリから任意の色をリアルタイム指定
関連記事:Arduino電子工作シリーズ
Arduino PWM制御の基礎をさらに深めたい方は、こちらの記事もご覧ください:
-
👉 【Arduino入門】AD変換でアナログセンサー値を読み取る
→ アナログ入力の基礎、10bit ADCの使い方を解説 -
👉 【Arduino入門】圧電ブザーで音を鳴らす:PWMによる周波数制御
→tone()関数の原理とPWM周波数制御を学ぶ -
👉 【Arduino入門】74HC595シフトレジスタで16個のLEDを制御
→ 3本のピンで多数のLEDを制御する拡張テクニック
よくある質問(FAQ)
Q1. コモンアノード型のRGB LEDを使いたい場合は?
A. アノード(長いピン)を5VまたはArduinoのVccに接続し、各色のカソードをArduinoピンに接続します。ロジックが反転するため、digitalWrite(R, LOW)で点灯、analogWrite(R, 255 - brightness)で輝度制御します。
Q2. PWM周波数は変更できますか?
A. Arduino UNOのデフォルト周波数(ピン5,6は約980Hz、ピン3,9,10,11は約490Hz)は変更可能ですが、タイマーレジスタの直接操作が必要です。ただし、通常の用途ではデフォルト値で十分です。
Q3. 複数のRGB LEDを同じ色で同期させたい
A. 各LEDの対応する色のピンを並列接続します。ただし、Arduinoの1ピンの最大電流(40mA)を超えないよう、トランジスタでドライブするか、LED数を制限してください。
Q4. 電池で動かすとちらつく
A. 電源容量不足が原因です。RGB LED全点灯時は最大60mA(20mA×3色)消費します。単3×4本(6V)とレギュレータ、またはモバイルバッテリー(5V USB出力)を推奨します。
Q5. もっと多くのLEDを制御したい
A. WS2812B(NeoPixel)やAPA102などのアドレサブルLEDを使用すると、1本の信号線で数百個を個別制御可能です。
おわりに
RGBフルカラーLEDとPWM制御の組み合わせは、Arduino電子工作の中でも特に視覚的な達成感が得られる分野です。単純なON/OFF制御から始まり、数学的なアルゴリズム(三角関数)を応用した美しいグラデーションまで、一つの部品で段階的に学習できるのが魅力です。
「光をプログラムで操る」——この感覚をぜひ体験してみてください。
それでは、良い電子工作ライフを!