RGB LEDの使い方:Arduinoで色を混ぜる、アノードコモンとカソードコモンの違い
RGB LEDはどう動き、カソードコモンとアノードコモンはどう見分けるのか。Arduinoへの配線、色ごとの抵抗値、analogWriteでの混色、虹色のフェード、ESP32とPicoのコードを解説します。
RGB LEDは、赤、緑、青の3つのLEDを1つのパッケージに収めたものです。それぞれの明るさを別々に設定すると、黄色からシアン、紫からオレンジまで、ほぼどんな色でも作れます。パソコンの画面のピクセルもすべて同じ原理で動いています。状態表示ランプ、ムードランプ、カラフルな通知ランプに使える、Arduinoでもとくに楽しい部品のひとつです。

RGB LEDはどう動く?
光の色は加法混色で混ざります。赤と緑で黄色、緑と青でシアン、赤と青で紫(マゼンタ)になり、3色すべてで白になります。ArduinoはPWMを使って、各チャンネルの明るさを0から255まで設定します。理論上は256 × 256 × 256 ≈ 1,670万通りの組み合わせになります。PWMはLEDを1秒に何百回もオン・オフしますが、目にはそのちらつきが見えず、平均の明るさだけを感じます。
| 色 | 赤 | 緑 | 青 |
|---|---|---|---|
| 赤 | 255 | 0 | 0 |
| 緑 | 0 | 255 | 0 |
| 青 | 0 | 0 | 255 |
| 黄 | 255 | 255 | 0 |
| シアン | 0 | 255 | 255 |
| マゼンタ | 255 | 0 | 255 |
| オレンジ | 255 | 80 | 0 |
| 白 | 255 | 255 | 255 |
カソードコモンかアノードコモンか?
RGB LEDの4本の足のうち、いちばん長いものは3つのLEDが共有する共通ピンです。LEDのカソードをまとめていればカソードコモン、アノードをまとめていればアノードコモンです。外から見るとまったく同じですが、配線とコードは逆になります。
| 項目 | カソードコモン(CC) | アノードコモン(CA) |
|---|---|---|
| 長い足のつなぎ先 | GND | 5V |
| 色を点けるには | ピンをHIGH(255)にする | ピンをLOW(0)にする |
| コードでの値 | analogWrite(pin, 値) | analogWrite(pin, 255 - 値) |
| 完全に消灯 | 0 | 255 |
ピンの順番と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の電圧表を使ってください。
Arduinoで色を混ぜる
下のコードは3つのチャンネルを1つのsetColor()関数にまとめ、7つの色を順番に表示します。LEDがアノードコモンなら、COMMON_ANODEをtrueにするだけで、関数が値を反転してくれます。
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の値を変えると速さを調整できます。
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}ポテンショメーターで色を選ぶ
A0、A1、A2に3つのポテンショメーターをつなげば、それぞれを1つの色チャンネルのつまみとして使えます。analogRead()は0〜1023の値を返すので、4で割るとPWMが必要とする0〜255の範囲になります。ポテンショメーターの配線はポテンショメーターとは?で解説しています。
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の値を受け取ります。
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 LED | WS2812B(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の使い方
1つのLEDに3つの色が入っています。RGB LEDが赤、緑、青の順に、それぞれ0.5秒点灯して0.5秒消灯し、このサイクルを繰り返します。ArduinoにRGB LEDを1つと抵抗を3つ接続するだけです。色とりどりの光を使うプロジェクトを、手軽に始められます。

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

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

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

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のカソードコモンとアノードコモンの違いを学びます。

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

WS2812B LEDテープの使い方
1つずつ自由に色を変えられるスマートLEDテープを使ってみます。Arduinoが最初の5個のLEDを赤く点灯し、1秒後に残りの5個を青く点灯します。その後すべて消灯し、最初から繰り返します。1本の配線で何十個ものLEDを個別の色にするための第一歩です。このようなテープは、装飾用のライトや部屋の照明にも使われています。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

