部品 · 読了まで6分

RGB LEDの使い方:Arduinoで色を混ぜる、アノードコモンとカソードコモンの違い

RGB LEDはどう動き、カソードコモンとアノードコモンはどう見分けるのか。Arduinoへの配線、色ごとの抵抗値、analogWriteでの混色、虹色のフェード、ESP32とPicoのコードを解説します。

RGB LEDは、赤、緑、青の3つのLEDを1つのパッケージに収めたものです。それぞれの明るさを別々に設定すると、黄色からシアン、紫からオレンジまで、ほぼどんな色でも作れます。パソコンの画面のピクセルもすべて同じ原理で動いています。状態表示ランプ、ムードランプ、カラフルな通知ランプに使える、Arduinoでもとくに楽しい部品のひとつです。

4本足の5 mm RGB LED
5 mm RGB LED:4本の足のうちいちばん長いのが共通ピンで、ほかの3本が赤、緑、青のチャンネルです。

RGB LEDはどう動く?

光の色は加法混色で混ざります。赤と緑で黄色、緑と青でシアン、赤と青で紫(マゼンタ)になり、3色すべてで白になります。ArduinoはPWMを使って、各チャンネルの明るさを0から255まで設定します。理論上は256 × 256 × 256 ≈ 1,670万通りの組み合わせになります。PWMはLEDを1秒に何百回もオン・オフしますが、目にはそのちらつきが見えず、平均の明るさだけを感じます。

色赤緑青
赤25500
緑02550
青00255
黄2552550
シアン0255255
マゼンタ2550255
オレンジ255800
白255255255

カソードコモンかアノードコモンか?

RGB LEDの4本の足のうち、いちばん長いものは3つのLEDが共有する共通ピンです。LEDのカソードをまとめていればカソードコモン、アノードをまとめていればアノードコモンです。外から見るとまったく同じですが、配線とコードは逆になります。

項目カソードコモン(CC)アノードコモン(CA)
長い足のつなぎ先GND5V
色を点けるにはピンをHIGH(255)にするピンをLOW(0)にする
コードでの値analogWrite(pin, 値)analogWrite(pin, 255 - 値)
完全に消灯0255
どちらのタイプかを調べるには、長い足をGNDにつなぎ、ほかの足のどれかを220 Ωの抵抗を通して5Vに当ててみます。色が点けばカソードコモンです。点かなければ逆にします。長い足を5Vに、ほかの足を抵抗を通してGNDにつなぎ、今度点けばアノードコモンです。

ピンの順番とArduinoへの配線

一般的な5 mm RGB LEDのピンの順番は赤、共通(いちばん長い)、緑、青ですが、メーカーによって違うことがあるので、足を1本ずつ試すのがいちばん確実です。各色はそれぞれの抵抗を通してPWMピンにつなぎます。Arduino UnoのPWMピンは~が付いている3、5、6、9、10、11番です。

足接続Arduino Unoのピン
赤(R)抵抗を通すD9
共通(いちばん長い)カソードコモンならGND、アノードコモンなら5V—
緑(G)抵抗を通すD10
青(B)抵抗を通すD11

抵抗値:色ごとに別の抵抗を

各色は点灯に必要な電圧(順方向電圧)が違い、赤は約2.0 V、緑と青は3.0〜3.2 Vです。5 Vで20 mAを目標にすると、赤は(5 − 2.0) / 0.020 = 150 Ω、緑と青は(5 − 3.2) / 0.020 ≈ 100 Ωになります。実際には3つとも220 Ωにしておけば安全で、明るさも十分です。色のバランスはコードで調整できます。自分で値を計算するにはLED抵抗計算ツールを、各色の順方向電圧はLEDの電圧表を使ってください。

共通の足に抵抗を1本だけ付けるのはやめましょう。順方向電圧がいちばん低い赤のチャンネルが電流のほとんどを取ってしまい、ほかの色は暗いままで、混色もずれてしまいます。色のチャンネルごとに必ず専用の抵抗を付けてください。

Arduinoで色を混ぜる

下のコードは3つのチャンネルを1つのsetColor()関数にまとめ、7つの色を順番に表示します。LEDがアノードコモンなら、COMMON_ANODEをtrueにするだけで、関数が値を反転してくれます。

C++ (Arduino IDE)
1const int R_PIN = 9;
2const int G_PIN = 10;
3const int B_PIN = 11;
4const bool COMMON_ANODE = false;   // ortak anotsa true yap / set true for common anode
5
6void setColor(int r, int g, int b) {
7  if (COMMON_ANODE) { r = 255 - r; g = 255 - g; b = 255 - b; }
8  analogWrite(R_PIN, r);
9  analogWrite(G_PIN, g);
10  analogWrite(B_PIN, b);
11}
12
13void setup() {
14  pinMode(R_PIN, OUTPUT);
15  pinMode(G_PIN, OUTPUT);
16  pinMode(B_PIN, OUTPUT);
17}
18
19void loop() {
20  setColor(255, 0, 0);     delay(1000);  // kırmızı / red
21  setColor(0, 255, 0);     delay(1000);  // yeşil / green
22  setColor(0, 0, 255);     delay(1000);  // mavi / blue
23  setColor(255, 255, 0);   delay(1000);  // sarı / yellow
24  setColor(0, 255, 255);   delay(1000);  // turkuaz / cyan
25  setColor(255, 0, 255);   delay(1000);  // mor / magenta
26  setColor(255, 255, 255); delay(1000);  // beyaz / white
27}

なめらかな色の変化:虹のエフェクト

色を切り替えるのではなく、あるチャンネルを上げながら別のチャンネルを下げていくと、光が赤から緑、緑から青、そしてまた赤へとなめらかに流れます。下のループも同じsetColor()関数を使っています。delayの値を変えると速さを調整できます。

C++ (Arduino IDE)
1// setColor() ve pin tanımları yukarıdaki gibi / setColor() and pins as above
2void loop() {
3  for (int i = 0; i < 256; i++) { setColor(255 - i, i, 0); delay(8); }  // kırmızı → yeşil / red → green
4  for (int i = 0; i < 256; i++) { setColor(0, 255 - i, i); delay(8); }  // yeşil → mavi / green → blue
5  for (int i = 0; i < 256; i++) { setColor(i, 0, 255 - i); delay(8); }  // mavi → kırmızı / blue → red
6}
白が少し青っぽく、またはピンクっぽく見えるのは正常です。3つのLEDの明るさが同じではないためです。コードで緑と青のチャンネルを70〜80%に抑えると、より自然な白になります。LEDにピンポン玉やすりガラス風の紙をかぶせると光が拡散し、色がずっときれいに混ざります。

ポテンショメーターで色を選ぶ

A0、A1、A2に3つのポテンショメーターをつなげば、それぞれを1つの色チャンネルのつまみとして使えます。analogRead()は0〜1023の値を返すので、4で割るとPWMが必要とする0〜255の範囲になります。ポテンショメーターの配線はポテンショメーターとは?で解説しています。

C++ (Arduino IDE)
1// A0, A1, A2'de üç potansiyometre; setColor() yukarıdaki gibi
2// three pots on A0, A1, A2; setColor() as above
3void loop() {
4  int r = analogRead(A0) / 4;   // 0–1023 → 0–255
5  int g = analogRead(A1) / 4;
6  int b = analogRead(A2) / 4;
7  setColor(r, g, b);
8}

ESP32とRaspberry Pi PicoでRGB LEDを使う

現在のArduinoコア(3.x)を使うESP32では、analogWrite()がどの出力ピンでも動くので、ピン番号を変えるだけで上のコードがそのまま動きます。注意したいのは電圧だけです。ピンの出力は3.3 Vなので、順方向電圧が3 Vに近い緑と青のチャンネルは暗くなります。3.3 Vでは47〜100 Ωのような小さな抵抗を使うか、本当に明るくしたいならトランジスタを通して5 VでLEDを駆動してください。Picoでは、MicroPythonのPWMクラスが0〜65535の値を受け取ります。

MicroPython
1from machine import Pin, PWM
2import time
3
4pins = [PWM(Pin(n)) for n in (11, 12, 13)]   # GP11 R, GP12 G, GP13 B
5for p in pins:
6    p.freq(1000)
7
8def set_color(r, g, b):                       # 0–255
9    for p, v in zip(pins, (r, g, b)):
10        p.duty_u16(v * 257)                   # 0–65535 (ortak anotta 65535 - v * 257)
11
12while True:
13    set_color(255, 0, 0); time.sleep(1)       # kırmızı / red
14    set_color(0, 255, 0); time.sleep(1)       # yeşil / green
15    set_color(0, 0, 255); time.sleep(1)       # mavi / blue

ふつうのRGB LEDとアドレス指定可能なLED(WS2812B)、どちらを選ぶ?

項目ふつうのRGB LEDWS2812B(NeoPixel)
必要なピンLED1個につきPWMピン3本テープ全体でデータピン1本
色の制御ArduinoのPWM出力で各LEDに内蔵された小さなチップで
ライブラリ不要Adafruit NeoPixelまたはFastLED
向いている用途1〜2個のLED、状態表示テープ、リング、マトリクス、間接照明

色付きのランプが1つか2つなら、ふつうのRGB LEDがいちばん簡単で安く済みます。何十個ものLEDを個別に色付けしたい場合、UnoのPWMピン6本では足りません。そのときは、1本の線で何百個ものLEDを制御できるWS2812Bのテープに移りましょう。

RGB LEDのプロジェクトアイデア

  • ムードランプ:すりガラスのびんの中で虹色のフェードを流し、やさしい常夜灯にします。
  • 温度インジケーター:DHT11と組み合わせ、寒いと青、ちょうどよいと緑、暑いと赤に光るランプを作ります。
  • カラーミキサー:3つのポテンショメーターで好きな色を手で作ります。
  • スマホで色を選ぶ:ESP32が配信するWebページのカラーピッカーからランプの色を変えます。
  • 通知ランプ:新しいメールやメッセージが届いたら、決まった色でLEDを点滅させます。
  • キーパッドで色分け:キーパッドで入力した数字に応じて違う色を表示します。

よくあるミスと直し方

  • 色が逆に動く:アノードコモンのLEDをカソードコモンのつもりで駆動しています。COMMON_ANODEをtrueにしてください。
  • ある色がまったく点かない:ピンの順番が思っていたのと違う可能性があります。抵抗を付けて足を1本ずつ試してください。
  • フェードが段階的で、中間の色が出ない:LEDがPWM非対応のピンにつながっています。Unoのそれらのピンは完全なオンかオフにしかなりません。
  • ブザーが鳴っている間に色が乱れる:Unoではtone()がTimer2を使うため、3番と11番ピンのPWMが乱れます。RGB LEDを5、6、9、10番などのピンに移してください。
  • 抵抗を付けていない:電流が多すぎて、いずれLEDとArduinoのピンの両方が傷みます。
  • ESP32でとても暗い:3.3 Vでは緑と青が限界ぎりぎりです。小さな抵抗かトランジスタを使ってください。

LEDの基本や抵抗が必要な理由を知りたい場合は、LEDとは?と抵抗とは?を見てみてください。BlueGraysアプリには、RGB LEDの色のフェード、キーパッドで操作するランプ、カラーミキサーのプロジェクトが回路図とコード付きで載っています。

よくある質問

RGB LEDがアノードコモンかカソードコモンかは、どうやって見分けますか?

長い足をGNDにつなぎ、別の足を220 Ωの抵抗を通して5Vに当てます。点けばカソードコモンです。点かなければ、長い足を5Vに、別の足を抵抗を通してGNDにつなぎます。今度点けばアノードコモンです。テスターのダイオードテストモードでも同じことができます。

RGB LEDにはどの抵抗を使えばいいですか?

5 Vなら、赤に約150 Ω、緑と青に約100 Ωが理想です。簡単に済ませるなら、3つとも220 Ωにしても安全で、明るさも十分です。色ごとに別の抵抗を付けるのは必須です。

RGB LEDは何色を出せますか?

各チャンネルは0〜255の256段階の明るさをとれるので、理論上は1,670万通りの組み合わせがあります。実際に目で見分けられる色はもっと少なく、LEDどうしの明るさの差で近い色合いがさらに似て見えます。

RGB LEDが白ではなく青っぽく見えるのはなぜですか?

3つのLEDは明るさが違い、目も色によって感じ方が違うので、たいてい青と緑が強く見えます。コードでその2つのチャンネルを少し下げるか、そこに大きめの抵抗を使うと、より自然な白になります。

RGB LEDをPWM非対応のピンにつなぐとどうなりますか?

そのチャンネルは完全なオンかオフにしかなりません。analogWriteは128以上をオン、それ未満をオフとして扱います。3つのチャンネルすべてがそうなら、出せるのは基本の8色だけで、なめらかな変化はできません。

Arduino UnoでRGB LEDをいくつ制御できますか?

UnoのPWMピンは6本なので、色を独立して制御できるRGB LEDは最大2個です。それ以上なら、PCA9685のような16チャンネルのPWMドライバや、1本のピンで何百個ものLEDを制御できるWS2812Bのテープを使ってください。

全プロジェクトを見る
RGB LEDの使い方
#39初級
プレミアム

RGB LEDの使い方

1つのLEDに3つの色が入っています。RGB LEDが赤、緑、青の順に、それぞれ0.5秒点灯して0.5秒消灯し、このサイクルを繰り返します。ArduinoにRGB LEDを1つと抵抗を3つ接続するだけです。色とりどりの光を使うプロジェクトを、手軽に始められます。

4.9(73)
98
RGB LEDで滑らかに色を変える
#40初級
プレミアム

RGB LEDで滑らかに色を変える

1つのRGB LEDが赤から緑、緑から青、そして再び赤へとゆっくり変わり、虹色のサイクルを繰り返します。1回の色の変化には約2.5秒かかり、色が混ざることで、その間に黄色、ターコイズ、紫が自然に現れます。光が滑らかに暗くなったり明るくなったりする様子を、自分の目で確かめられます。

4.8(58)
76
ESP32でRGB LEDを制御
#111初級

ESP32でRGB LEDを制御

3個の個別のLEDの代わりに、1個のRGB LEDで無数の色を作ります。Arduinoと同じようにanalogWrite()でR/G/Bの値を調整し、虹色に変化させます。赤と緑を混ぜると黄色になるなど、色の仕組みを実際に確認できます。

4.6(29)
51
ESP32の調色ライト(可変抵抗3個 + RGB LED + OLED)
#138上級
プレミアム

ESP32の調色ライト(可変抵抗3個 + RGB LED + OLED)

ESP32と3個の可変抵抗で、好みの色を作れるスマート調色ライトです。赤・緑・青の可変抵抗を回すと、カソードコモンのRGB LEDの色がリアルタイムに変わります。SSD1306 OLEDディスプレイには、各色の0~255の値、色の強さを示すバー、#FF8040などのWeb用HEXカラーコードをリアルタイムで表示します。小さなプロ仕様のカラースタジオとして、RGBの色の仕組み、ADCによるアナログ値の読み取り、PWMによる明るさの制御、I2Cディスプレイの表示設計を1つのプロジェクトで学べます。

4.7(6)
10
Raspberry Pi PicoでRGB LEDの色を順に切り替える(3チャンネルPWM)
#161初級

Raspberry Pi PicoでRGB LEDの色を順に切り替える(3チャンネルPWM)

1つのLEDで何百万もの色を表現できます!RGB LEDには、実は赤、緑、青の3つのLEDが入っています。それぞれをPicoの個別のPWMチャンネルで制御すると、赤+緑=黄、緑+青=シアン、3色すべて=白のように色を混ぜられます。このプロジェクトでは、LEDの色を8色に順番に切り替えます。複数のPWMチャンネル、関数の定義(def set_color(...))、RGBの混色(画面やスマート電球の仕組み)、8ビットから16ビットへの変換(x257で0–255を0–65535に変換)、LEDのカソードコモンとアノードコモンの違いを学びます。

0.0(0)
6
ESP32 WS2812B NeoPixel LEDテープの制御
#126中級
プレミアム

ESP32 WS2812B NeoPixel LEDテープの制御

WS2812B(NeoPixel)は、1本のデータピンで連結したLEDを個別に制御できるスマートなRGB LEDです。このプロジェクトでは、8個のLEDを備えたWS2812BテープをAdafruit_NeoPixelライブラリで制御し、滑らかな虹色のアニメーションを作ります。ESP32の3.3VロジックレベルはほとんどのWS2812Bのロットで問題なく動作しますが、不安定な場合に備え、470Ωの直列抵抗と1000µFのコンデンサを使う対策も紹介します。アニメーションは、HSV色空間の色相(hue)をずらして作ります。

4.9(19)
30
WS2812B LEDテープの使い方
#69中級
プレミアム

WS2812B LEDテープの使い方

1つずつ自由に色を変えられるスマートLEDテープを使ってみます。Arduinoが最初の5個のLEDを赤く点灯し、1秒後に残りの5個を青く点灯します。その後すべて消灯し、最初から繰り返します。1本の配線で何十個ものLEDを個別の色にするための第一歩です。このようなテープは、装飾用のライトや部屋の照明にも使われています。

4.8(54)
70