ArduinoでNeoPixel(WS2812B)LEDテープを光らせる!配線・虹色アニメ・電源容量の計算まで解説
「ArduinoでLEDを光らせるのはできたけど、テープみたいにたくさん並べて虹色に光らせたい!」
「LEDテープを買ってみたけど、配線や電源をどうすればいいのか不安…」
そんな方に向けて、今回はNeoPixel(WS2812B)というフルカラーLEDテープをArduinoで動かす方法を解説します。データ線たった1本で何十個ものLEDの色を1個ずつ変えられるので、電子工作の「見栄え」が一気に上がりますよ😊
難易度:電子工作の初級〜(Lチカをやったことがある方向け)。配線 → 1個ずつ点灯 → 虹色アニメーション → 電源容量の計算、の順に一緒に見ていきましょう!
NeoPixel(WS2812B)ってどんなもの?

WS2812Bは、赤・緑・青のLEDと制御用ICが1つのパッケージに入った「マイコン内蔵LED」です。Adafruit社がこのタイプのLEDを「NeoPixel」という名前で販売していて、今ではWS2812B系のLED全般をNeoPixelと呼ぶことが多いです。
イメージとしては、LEDが一列に並んだバケツリレーです。Arduinoが先頭のLEDに「1個目は赤、2個目は青、3個目は…」と色のデータをまとめて送ると、各LEDが自分の分だけ受け取って、残りを次のLEDに渡していきます。だから何個つないでも、データ線は1本で済むんですね。
| 項目 | 内容 |
|---|---|
| 電源電圧 | 5V |
| 配線 | +5V・GND・DIN(データ)の3本 |
| 色 | RGB各256段階(約1677万色) |
| 消費電流 | 1個あたり最大約60mA(白・最大輝度のとき) |
⚠️ 最後の「消費電流」が意外な落とし穴です。これは後半でPythonを使って計算します。
用意するものと配線
- Arduino UNO(5Vで動くボード)
- WS2812B LEDテープ(今回は30個の想定)
- 抵抗 300〜500Ω(今回は330Ω)
- 電解コンデンサ 500〜1000µF(6.3V以上)
- LEDを多く・明るく光らせる場合は 5V の外部電源(ACアダプターなど)
配線はこの3本だけです👇
| Arduino側 | LEDテープ側 | ポイント |
|---|---|---|
| 5V | +5V | LEDが少なく暗めのときだけ。多いときは外部電源から |
| GND | GND | 外部電源を使うときもGNDは必ず共通にする |
| D6 | DIN | 間に330Ωの抵抗を入れる |
ここが重要です👇
- テープには矢印(データの流れる向き)が印刷されています。矢印の根元側(DIN)にArduinoをつなぎます。逆側(DOUT)につなぐと一切光りません
- +5VとGNDの間にコンデンサを入れると、電源を入れた瞬間の電流の急変からLEDを守れます(電解コンデンサは極性に注意)
- データ線の抵抗は、信号の反射やノイズを抑えるためのものです。Adafruitの公式ガイドでも300〜500Ωが推奨されています
- ESP32など3.3Vのマイコンを使う場合は、5V信号に変換するレベルシフタ(74AHCT125など)が必要です
ライブラリのインストール
Arduino IDEの「ライブラリマネージャ」で Adafruit NeoPixel と検索してインストールします。これで準備OKです🚀
まずは1個ずつ光らせてみよう
最初のスケッチでは、LEDを先頭から1個ずつ赤く灯し、次に全部を青にして、最後に消灯します。
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6 // データ線(DIN)をつなぐピン
#define LED_COUNT 30 // テープのLEDの個数
// 個数・ピン・LEDの種類(WS2812BはほぼこれでOK)
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin(); // 初期化
strip.setBrightness(50); // 明るさ(0〜255)。最初は控えめに
strip.show(); // いったん全部消灯
}
void loop() {
// 1個ずつ赤を灯していく
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(255, 0, 0));
strip.show(); // show() を呼んで初めてLEDに反映される
delay(50);
}
delay(500);
strip.fill(strip.Color(0, 0, 255)); // 全部まとめて青に
strip.show();
delay(1000);
strip.clear(); // 全消灯(これも show() で反映)
strip.show();
delay(500);
}
ポイントをまとめるとこんな感じです👇
setPixelColor(番号, 色)で「何番目を何色にするか」を予約する(番号は0から)show()を呼んだ瞬間に、予約した色がまとめてLEDに送られるfill()は全部を同じ色に、clear()は全部を消灯の予約にするsetBrightness()は全体の明るさ。setup()で1回だけ設定するのが公式の推奨です
つまり「色を予約 → show()で反映」の2段構えです。show()を書き忘れると何も光らないので、ここはよくつまずくポイントですよね。
虹色が流れるアニメーションを作る
次はいよいよ虹色です🌈 RGBの数値で虹のグラデーションを作るのは大変なので、色相(Hue)で色を指定できる ColorHSV() を使います。
イメージとしては、色が円形に並んだ「色相環」です。Adafruit NeoPixelライブラリでは、この円を 0〜65535 の数値で一周します(0が赤、約10922が黄色、32768がシアン…)。
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6
#define LED_COUNT 30
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
long firstHue = 0; // 先頭LEDの色相(0〜65535で色が一周)
void setup() {
strip.begin();
strip.setBrightness(50);
strip.show();
}
void loop() {
for (int i = 0; i < strip.numPixels(); i++) {
// テープ全体で色相がちょうど一周するように、LEDごとに少しずつずらす
long hue = firstHue + (i * 65536L / strip.numPixels());
// gamma32() で人の目に自然な色合いに補正
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(hue)));
}
strip.show();
firstHue += 256; // 色相を少し進めると虹が流れて見える
if (firstHue >= 65536) firstHue -= 65536;
delay(20);
}
ここが重要です👇
i * 65536L / strip.numPixels()で、テープ全体でちょうど色相環を一周するように色をずらしているfirstHueを毎回256ずつ進めることで、虹が少しずつ流れて見える(256回で一周するので、20msごとなら約5秒で一回り)65536LのLは「long型で計算してね」という指定。ArduinoUNOのintは16ビットなので、これがないと計算があふれてしまいますgamma32()は、人の目に自然に見えるよう色を補正する関数です
これ、delay(20) を delay(5) にしたらどうなるか、実行せずに答えられますか? …正解は「虹が約4倍の速さで流れる」です。数値を変えて遊んでみると、仕組みがよくわかりますよ。
電源は足りる?Pythonで消費電流を見積もろう
NeoPixelでいちばん多いトラブルが電源不足です。「テープの後ろの方だけ色がおかしい」「Arduinoが勝手にリセットされる」といった症状は、たいてい電流が足りていません。
Adafruitのガイドによると、NeoPixelは1個あたり白・最大輝度で約60mA。普段の色が混ざった点灯では、その1/3の約20mAが目安とされています。そこで、LEDの個数と setBrightness() の値から必要な電源容量を計算するPythonスクリプトを作ってみました。
# NeoPixel(WS2812B)の電源容量をざっくり見積もるスクリプト
MAX_MA_PER_LED = 60 # 白・最大輝度のときの1個あたりの電流(mA)
TYPICAL_MA_PER_LED = 20 # 色が混ざる普段使いの目安(mA)
MARGIN = 1.2 # 電源には2割の余裕を持たせる
def estimate(led_count, brightness):
"""LEDの個数と setBrightness() の値(0〜255)から電流を見積もる"""
ratio = brightness / 255
worst = led_count * MAX_MA_PER_LED * ratio # 全部真っ白にしたとき
typical = led_count * TYPICAL_MA_PER_LED * ratio # 虹色など普段の点灯
need_amp = worst * MARGIN / 1000 # 余裕込みの電源容量(A)
return worst, typical, need_amp
for leds, bright in [(8, 50), (30, 50), (30, 255), (60, 128), (144, 255)]:
worst, typical, need = estimate(leds, bright)
usb_ok = "USB給電でも動く範囲" if worst * MARGIN <= 500 else "外部5V電源が必要"
print(f"{leds:>3}個 明るさ{bright:>3}: 最大{worst:6.0f}mA / 目安{typical:5.0f}mA"
f" → 電源{need:.1f}A以上({usb_ok})")

実際に実行した結果が上の画像です。結果から分かることをまとめると👇
- 30個でも明るさ50程度なら最大約350mAなので、USB給電でも動く範囲に収まる
- 同じ30個でも明るさ255で真っ白にすると約1.8A。USBポート(一般的に500mA)ではまったく足りない
- 144個のテープを全力で光らせると約8.6A。専用の大容量5V電源が必要になる
⚠️ なお、この計算にはArduino本体の消費電流は入っていません。USB給電の場合は、計算結果ギリギリではなく余裕を持たせてください。外部電源を使うときは、電源の+5VとGNDをテープに直接つなぎ、GNDだけArduinoと共通にします。
うまく光らないときのチェックリスト
- まったく光らない:DINとDOUTを逆につないでいないか/
show()を呼んでいるか/GNDが共通になっているか - 色がおかしい(赤と緑が入れ替わる):テープの種類が違う可能性。
NEO_GRBをNEO_RGBに変えて試す - 後ろの方のLEDだけ暗い・色が変わる:電源不足や電圧降下。明るさを下げるか、テープの途中にも電源を追加する
- 先頭のLEDがチラつく:データ線の抵抗とコンデンサが入っているか確認
まとめ
- NeoPixel(WS2812B)は、データ線1本で何十個ものフルカラーLEDを1個ずつ制御できる
- 配線は +5V・GND・DIN の3本。DINの向き、330Ωの抵抗、コンデンサがポイント
- 「
setPixelColor()で予約 →show()で反映」が基本の流れ - 虹色は
ColorHSV()の色相(0〜65535)をLEDごとにずらすと簡単に作れる - 1個あたり最大約60mA。個数が多いときは、Pythonで見積もってから電源を選ぶと安心
LEDテープが光ると、作品の完成度が一気に上がります。センサーの値に合わせて色を変えたり、時計にしたりと応用もいろいろできるので、ぜひ試してみてください😊
参考:Adafruit NeoPixel Überguide(公式・英語)
こちらも読まれています
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
Arduinoロボット入門のおすすめコース・部品を見る →📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





