はじめに:なぜ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が虹色に光る瞬間」を一緒に体験しましょう。

Arduino UNO R4 Minima

Arduino UNO R4 Minima

Arduino UNO R4 Minima starter kit

Arduino UNO R4 Minima starter kit


RGBフルカラーLEDの構造と動作原理

1つのパッケージに3色のLEDチップ

RGBフルカラーLED(RGB LED)は、1つの透明樹脂パッケージ内に以下3色のLEDチップが封入された部品です:

  • R (Red / 赤): 波長約620-630nm
  • G (Green / 緑): 波長約515-530nm
  • B (Blue / 青): 波長約460-470nm

これらは光の三原色と呼ばれ、人間の目の視細胞(錐体細胞)が感知する色の基本成分です。

フルカラーLEDの回路図

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の基本回路(共通カソード型)

回路のポイント:

  1. 電流制限抵抗は必須
    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以下で安全
    
  2. PWM対応ピンを使用
    後のSTEP 2でPWM制御を行うため、最初からPWM対応ピン(Arduino UNOの場合 3, 5, 6, 9, 10, 11番)を使用しておくと配線変更が不要です。今回は以下のピンを使用します:

    • 9番ピン → 赤(R)
    • 10番ピン → 青(B)
    • 11番ピン → 緑(G)
  3. 共通カソードはGNDへ
    RGBフルカラーLEDの最も長いピン(共通カソード)をArduinoのGNDに接続します。

フルカラーLEDの発色

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(ピン番号, 0255の値);
  • 0: 完全にOFF(消灯)
  • 127: 約50%の輝度(中間輝度)
  • 255: 完全にON(最大輝度)

重要: PWM機能が使えるのは、Arduino UNOの場合3, 5, 6, 9, 10, 11番ピンのみです。

三相正弦波によるスムーズなカラーフェード

各色の輝度をサインカーブ(正弦波)に従って変化させ、かつ位相を120度(85ステップ)ずつずらすことで、虹のように滑らかに色が遷移するグラデーション効果を実現します。

フルカラーLEDの出力位相

三相正弦波による位相制御(各色を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秒)
   }
}

コードの詳細解説:

  1. サイン関数によるスムーズな輝度変化

    sin(2 * 3.14 / 255 * i)
    
    • 2 * 3.14 = 2π(1周期)
    • / 255 で255ステップで1周期完結
    • iは0〜255で循環(uint8_t型のオーバーフロー利用)
  2. -1〜+1を0〜255にスケーリング

    (sin(...) + 1) * (255 / 2)
    
    • + 1 で範囲を0〜2に変換
    • * (255 / 2) で0〜255に拡大
  3. 位相差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制御の基礎をさらに深めたい方は、こちらの記事もご覧ください:


よくある質問(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制御から始まり、数学的なアルゴリズム(三角関数)を応用した美しいグラデーションまで、一つの部品で段階的に学習できるのが魅力です。

「光をプログラムで操る」——この感覚をぜひ体験してみてください。

それでは、良い電子工作ライフを!