「ArduinoでLEDを光らせるのはできたけど、テープみたいにたくさん並べて虹色に光らせたい!」
「LEDテープを買ってみたけど、配線や電源をどうすればいいのか不安…」

そんな方に向けて、今回はNeoPixel(WS2812B)というフルカラーLEDテープをArduinoで動かす方法を解説します。データ線たった1本で何十個ものLEDの色を1個ずつ変えられるので、電子工作の「見栄え」が一気に上がりますよ😊

難易度:電子工作の初級〜(Lチカをやったことがある方向け)。配線 → 1個ずつ点灯 → 虹色アニメーション → 電源容量の計算、の順に一緒に見ていきましょう!

NeoPixel(WS2812B)ってどんなもの?

rgb led strip
rgb led strip / Photo by fish socks via Pexels

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})")
実行結果:LEDの個数と明るさごとの消費電流の見積もり
実行結果:LEDの個数と明るさごとの消費電流の見積もり

実際に実行した結果が上の画像です。結果から分かることをまとめると👇

  • 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ロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。