WS2812B NeoPixel LEDテープとArduino:アドレス指定できるRGB LEDのガイド
WS2812B NeoPixelとは?配線方法は?アドレス指定できるRGB LEDテープ、リング、マトリクス、電源の計算、Adafruit NeoPixelとFastLEDのコード、虹のエフェクト、ESP32とPicoの例を解説します。
WS2812Bは、専用のドライバチップを内蔵したRGB LEDです。ふつうのRGB LEDでは色ごとに別のピンが必要ですが、WS2812Bなら1本のデータ線で数百個のLEDを制御し、1個ずつ個別の色と明るさを指定できます。NeoPixelは、このアドレス指定できるLEDのファミリーに対するAdafruitの呼び名です。テープ、リング、スティック、マトリクスの形で売られており、間接照明やLED時計からゲームや通知ランプまで、数えきれないプロジェクトで使われています。

WS2812Bのしくみ
WS2812Bの5x5 mmのパッケージの中には、赤、緑、青の3つの小さなLEDと、それらを駆動する極小のチップが入っています。Arduinoはデータ線に24ビットの色のパケットを次々に送ります。緑8ビット、赤8ビット、青8ビットです(GRBの順)。最初のLEDは最初の24ビットを自分用に取り、残りをDOピンから次のLEDへ渡します。どのLEDも同じことをします。データ線が50マイクロ秒以上(新しいバージョンでは280マイクロ秒以上)LOWのままになると、すべてのLEDが同時に色を表示します。色ごとに256段階あるので、1個のLEDで1,670万色を表示できます。
| 項目 | 値 |
|---|---|
| 電源電圧 | 5 V(3.5〜5.3 V) |
| LED1個あたりの電流 | 最大約60 mA(白で最大輝度)、消灯時は約1 mA |
| データ速度 | 800 kHz、単線 |
| 色の順序 | GRB(緑、赤、青) |
| 色深度 | 24ビット、1,670万色 |
| パッケージ | 5050 SMD(5x5 mm) |
テープ、リング、マトリクス
| 種類 | LEDの数 | 主な用途 |
|---|---|---|
| テープ | 1メートルあたり30、60、144個 | 間接照明、テレビのバックライト、棚の照明 |
| リング | 8、12、16、24 | LED時計、メーター、デスクランプ |
| マトリクス | 8x8 = 64、16x16 = 256 | スクロール文字、アニメーション、ドット絵のゲーム |
| スティック | 8 | レベルメーター、状態表示ランプ |

WS2812Bの配線
WS2812Bの接続は5V、GND、DIN(データ入力)の3つです。テープの矢印はデータが流れる向きを示しています。Arduinoは必ず矢印が始まる側、DINの側につないでください。データ線に330〜470 Ωの抵抗を直列に入れ、テープの電源入力の5VとGNDの間に1000 µFのコンデンサを入れると、最初のLEDを急な電圧のスパイクから守れます。
| WS2812Bのピン | 接続先 |
|---|---|
| 5V | LEDが少数ならArduinoの5V、多数なら外部の5 V ACアダプター |
| GND | GND(外部ACアダプターの場合はArduinoとグランドを共通にする) |
| DIN | D6(330 Ωの抵抗を通して) |
| DOUT | 次のLEDまたはテープのDIN |
電源の計算:何アンペア必要?
最悪の場合の式は簡単で、LEDの数 × 60 mAです。アニメーションですべてのLEDが同時に白で最大輝度になることはまれで、実際にはLED1個あたり平均20 mA前後です。それでも、ACアダプターは最悪の場合に合わせて選ぶか、ソフトウェアで明るさを制限してください。電力をワットで求めるにはオームの法則ツールを、電池で動かすプロジェクトの稼働時間を見積もるには電池寿命ツールを使ってください。
| LEDの数 | 最悪の場合(白で最大輝度) | 推奨の電源 |
|---|---|---|
| 8 | 0.48 A | USBで十分(明るさを制限) |
| 30 | 1.8 A | 5 V 3 AのACアダプター |
| 60 | 3.6 A | 5 V 4 AのACアダプター |
| 144 | 8.6 A | 5 V 10 AのACアダプター |
Adafruit NeoPixelライブラリで最初のコード
ライブラリマネージャでAdafruit NeoPixelを検索してインストールします。次のコードは、LEDを1個ずつ赤、緑、青で点けて、テープを色で「塗りつぶし」ます。
1#include <Adafruit_NeoPixel.h>
2
3#define PIN 6 // DIN pini / data pin
4#define NUM_LEDS 8 // LED sayısı / number of LEDs
5
6Adafruit_NeoPixel strip(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
7
8void setup() {
9 strip.begin();
10 strip.setBrightness(50); // 0–255, yalnız bir kez / only once
11 strip.show(); // hepsini söndür / all off
12}
13
14void colorWipe(uint32_t color, int wait) {
15 for (int i = 0; i < NUM_LEDS; i++) {
16 strip.setPixelColor(i, color);
17 strip.show(); // değişikliği gönder / send the change
18 delay(wait);
19 }
20}
21
22void loop() {
23 colorWipe(strip.Color(255, 0, 0), 80); // kırmızı / red
24 colorWipe(strip.Color(0, 255, 0), 80); // yeşil / green
25 colorWipe(strip.Color(0, 0, 255), 80); // mavi / blue
26}setPixelColor()はメモリ上の色を変えるだけです。実際にLEDを点けるにはshow()を呼ぶ必要があります。こうすることで、すべてのLEDの色を設定してから一度に表示できます。setBrightness()は色のデータを恒久的に縮小するので、loop()で何度も変えるより、setup()で一度だけ呼ぶのがおすすめです。LED1個につきArduinoのRAMを3バイト使うため、数百個のLEDではUnoの2 KBがすぐにいっぱいになります。
虹のエフェクト:HSVの色
赤、緑、青の値で色を指定する代わりにHSV(色相、彩度、明度)を使うと、エフェクトがずっと簡単になります。色相を変えるだけで色相環をひと回りできます。Adafruitライブラリでは、色相は0〜65535です。gamma32()は色を目の感じ方に合わせて補正するので、色の変化がより自然に見えます。
1#include <Adafruit_NeoPixel.h>
2
3#define PIN 6
4#define NUM_LEDS 24
5
6Adafruit_NeoPixel strip(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
7
8void setup() {
9 strip.begin();
10 strip.setBrightness(40);
11}
12
13void loop() {
14 for (long first = 0; first < 65536; first += 256) {
15 for (int i = 0; i < NUM_LEDS; i++) {
16 uint16_t hue = first + i * 65536L / NUM_LEDS; // her LED'e farklı ton / a different hue per LED
17 strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(hue)));
18 }
19 strip.show();
20 delay(10);
21 }
22}FastLEDライブラリ
より高度なエフェクトには、FastLEDライブラリも人気があります。LEDをCRGBの配列で管理し、leds[3] = CRGB::Red;のような読みやすい命令を使え、色相の範囲は0〜255です。fill_rainbow()やfadeToBlackBy()などの既製の関数で、炎、流れ星、呼吸のようなエフェクトを数行で書けます。とくに便利な機能のひとつがFastLED.setMaxPowerInVoltsAndMilliamps(5, 2000);で、電流を2 A未満に保つよう、ライブラリが自動的に明るさを下げます。
8x8のNeoPixelマトリクスを使う
マトリクスは、実は長いテープにすぎません。64個のLEDが1本のデータ線で次々につながっています。ほとんどのマトリクスでは行がジグザグ(蛇行)に並んでいて、偶数行は左から右へ、奇数行は右から左へ進みます。そのため、x、yの座標をLEDの番号に直すには、偶数行ではy × 8 + xを、奇数行ではy × 8 + (7 − x)を使います。64個のLEDは白で最大輝度にすると3.8 Aを消費するので、マトリクスではとくに明るさを抑えることが大切です。

ESP32とRaspberry Pi PicoでWS2812Bを使う
Adafruit NeoPixelとFastLEDのライブラリはESP32でも動きます。Wi-Fiがあるので、スマートフォンからLEDを操作したり、天気に合わせて色が変わるランプを作ったりするのも簡単です。注意すべきは電圧レベルです。5 Vで給電したWS2812Bはデータ入力に3.5 V以上を求めますが、ESP32とPicoの出力は3.3 Vです。ほとんどのテープはそれでも動きますが、最初のLEDがちらついたり、でたらめな色が出たりするなら、データ線に74AHCT125のようなレベル変換ICを入れてください。Raspberry Pi Picoでは、MicroPythonにneopixelモジュールが組み込まれています。
1from machine import Pin
2import neopixel
3import time
4
5NUM = 8
6np = neopixel.NeoPixel(Pin(0), NUM) # GP0 → DIN
7
8def wheel(pos): # 0–255 → renk çemberi / colour wheel
9 if pos < 85:
10 return (255 - pos * 3, pos * 3, 0)
11 if pos < 170:
12 pos -= 85
13 return (0, 255 - pos * 3, pos * 3)
14 pos -= 170
15 return (pos * 3, 0, 255 - pos * 3)
16
17j = 0
18while True:
19 for i in range(NUM):
20 r, g, b = wheel((i * 256 // NUM + j) & 255)
21 np[i] = (r // 5, g // 5, b // 5) # parlaklığı düşür / dim it
22 np.write()
23 j = (j + 2) & 255
24 time.sleep_ms(20)WS2812Bのプロジェクトアイデア
- テレビの間接照明:テレビの裏にテープを貼り、部屋をやわらかな光で包みます。
- NeoPixel時計:60個のLEDのリングで、時・分・秒を違う色で表示します。
- 音量メーター:マイクモジュールを使い、音楽の音量に合わせて伸びるLEDバーを作ります。
- 通知ランプ:ESP32で、インターネットの天気や新着メールに合わせて色を変えます。
- パトランプとナイトライダー:赤と青の点滅や、往復するスキャン光のエフェクトを書きます。
- ドット絵のヘビゲーム:8x8のマトリクスとジョイスティックで、定番のヘビゲームを再現します。
よくある間違いと対処法
- LEDがひとつも点かない:Arduinoをテープの反対側、DOUTの側につないでいます。矢印を確認し、DINの端を使ってください。
- 色が入れ替わる(赤のはずが緑):色の順序が違います。コードではNEO_GRBを使いますが、NEO_RGBが必要なテープもあります。
- 最初のLEDがちらつく、またはでたらめな色になる:直列抵抗がない、GNDが共通になっていない、または3.3 Vのデータ信号では足りません。
- テープの終わりが黄色っぽく見える:電圧が下がっています。テープの複数の場所から給電するか、明るさを下げてください。
- LEDが点くとArduinoがリセットする:USBから電流を取りすぎています。外部ACアダプターと1000 µFのコンデンサを使ってください。
- 最初の数個のLEDしか点かない:コードのNUM_LEDSが実際のLEDの数より小さいか、テープの途中のどこかで接続が切れています。
WS2812Bは、色がどう混ざるかを理解するのにぴったりの出発点です。色の考え方はRGB LEDの使い方で、明るさの制御はPWMとは?で確認できます。BlueGraysアプリには、WS2812Bの基本、パトランプ、流れるLED、ナイトライダーのスキャナー、アニメーションエフェクト、ESP32でのNeoPixelテープの制御が、回路図とコード付きでそろっています。
よくある質問
WS2812BとNeoPixelの違いは?
NeoPixelは、WS2812、WS2812B、SK6812のようなアドレス指定できるLEDに対するAdafruitのブランド名です。どれも同じデータプロトコルを使うので、同じライブラリで同じように制御できます。
1台のArduinoにWS2812Bを何個つなげますか?
データの面での厳密な上限はありませんが、3つのことが制約になります。RAM(LED1個につき3バイトなので、Unoでは実際には数百個)、更新時間(LED1個につき30マイクロ秒。1000個のLEDで約30 ms、つまり毎秒約33フレーム)、そして電源です。
WS2812BをArduinoの5Vピンから給電できますか?
数個のLEDを低い明るさで使う場合だけです。たとえば、LED8個のスティックならUSBで明るさ50程度で動きます。それ以上のLEDには、外部の5 V ACアダプターを使い、グランドを共通にしてください。
抵抗とコンデンサは本当に必要ですか?
絶対に必要というわけではありませんが、強くおすすめします。データ線の330〜470 Ωの抵抗は信号のスパイクをなだらかにして最初のLEDを守り、電源入力の1000 µFのコンデンサは電源を入れた瞬間の突入電流を吸収します。
WS2812BはESP32や3.3 Vのボードで動きますか?
たいてい動きますが、保証はされません。5 Vで給電したWS2812Bは、データ入力に3.5 V以上を求めます。ちらつきや色の間違いが出るなら、74AHCT125のようなレベル変換ICでデータ信号を5 Vに上げてください。
WS2812B、WS2811、WS2813、SK6812の違いは?
WS2811は独立したドライバチップで、12 Vのテープでふつう3個のLEDをまとめて駆動します。WS2813には予備のデータ線があり、LEDが1個壊れてもチェーンが動き続けます。SK6812は互換の代替品で、白のLEDを加えたRGBW版もあります。その場合はコードでNEO_GRBWを使います。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
WS2812B LEDテープの使い方
1つずつ自由に色を変えられるスマートLEDテープを使ってみます。Arduinoが最初の5個のLEDを赤く点灯し、1秒後に残りの5個を青く点灯します。その後すべて消灯し、最初から繰り返します。1本の配線で何十個ものLEDを個別の色にするための第一歩です。このようなテープは、装飾用のライトや部屋の照明にも使われています。

WS2812Bで作るパトカー風ライト
パトカーの屋根にある赤と青の点滅灯を、机の上で再現します。10個のLEDを備えたWS2812Bテープの半分が赤で素早く3回点滅し、続いて残りの半分が青で3回点滅します。このパターンを繰り返し続けます。1本のデータ線につながったカラーLEDを、それぞれ好きな色に設定する方法がわかります。

WS2812Bで流れるLED
10個のLEDが並ぶテープで、緑の光が端から端へ1個ずつ進み、最後まで来ると先頭に戻ります。各LEDは3分の1秒ずつ点灯します。WS2812Bテープでは、1本のデータ線で各LEDを個別に制御でき、Arduinoへの接続も3本の配線だけで済みます。カラフルなLEDテープを使う第一歩です。

WS2812Bで流れるLED(積み上げ点灯)
コップに水を注ぐように、光が満ちては減っていくLEDテープです。Arduinoが10個のカラーLEDをオレンジ色に1個ずつ点灯し、点灯したままにします。すべて点灯すると、同じ順番で1個ずつ消灯し、最初から繰り返します。このシンプルなアニメーションで、1本の配線から各LEDを個別に制御する方法がわかります。

WS2812Bのナイトライダー風ライト
スマートLEDテープの赤い光が端から端へ移動して戻り、往復を繰り返し続けます。Arduinoは各ステップで1個のLEDだけを点灯し、0.1秒待ってから隣へ移ります。6個の個別のLEDと何十本もの配線を使う代わりに、1本のテープと1本のデータ線で同じ流れる光を実現できます。

WS2812Bのナイトライダー風ライト(3灯)
56個のLEDが並ぶテープの上を、虹のすべての色がゆっくりと流れます。隣り合うLEDは少しずつ違う色に光り、色が同じ方向に流れ続けることで、テープが生き生きとした光の川のようになります。部屋や棚、机の背面を手軽に彩れます。

WS2812Bアニメーション1
56個のLEDが並ぶテープで、虹のすべての色が隣り合って途切れずに流れます。まるで光の川がテープの上を流れるようです。各LEDは1つ前のLEDと少し違う色に光り、色が移り変わるたびにテープが生き生きと見えます。部屋や机を彩る、いちばん手軽な方法です。

WS2812Bアニメーション2
自動で色が変わる光のショーを部屋に作ります。Arduinoが30個のLEDを備えたテープに色を流し続け、数秒ごとに新しい配色へ切り替えます。虹色、紫と緑の縞模様、白黒の縞模様、雲を思わせる色、パーティー向けの色、ランダムな色の組み合わせが登場します。何も操作せずに、テープが1分間のショーを最初から最後まで再生します。

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