Vixen LightsとArduinoでNeoPixelを制御する:ステップバイステップガイド
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | |
| Arduino UNO | 1 | 代替として使用可能 |
| WS2812B LEDストリップ(60ピクセル/m) | 1 | 5m巻き(全300ピクセル)推奨 |
| 抵抗 470Ω | 1 | データライン用 |
| 5V 40A 電源 | 1 | ピクセル数に応じて容量選定 |
| ブレッドボード | 1 | |
| デュポンワイヤ(ジャンパーワイヤ) | 1式 |
必要な工具
- はんだごて
- はんだ
使用するソフトウェア・サービス
- Vixen Lights 3.x(本チュートリアルはv3.4u2 64bitベース)
- Arduino IDE
プロジェクト概要
Vixen Lightsとは?
Vixen Lightsは、DIY照明オートメーションディスプレイ用のソフトウェアです。バージョン3.xでは、アドレッサブル「ピクセル」ライトへの対応のために完全に再設計されました。
ピクセル(アドレッサブルLED)とは?
ピクセルは、赤・緑・青の3原色LEDを内蔵し、各色の強度を変えることで全色を表現できるデバイスです。本記事で使用するWS2812Bは、ICチップを内蔵し、データ入力を受け取って自身の色を表示し、残りのデータを次のピクセルへ渡します。一般的にアドレッサブルRGBストリップは3線(電源、GND、データ)で、いわゆる「ダム」なRGBストリップは4線(電源+R/G/B各制御)です。

電源設計の重要ポイント
RGBピクセルは大電流を消費します。Arduinoの内蔵レギュレータでは数個程度しか点灯できません。必ず外部電源を用意してください。
- 電圧:使用LEDに合わせる(例:5V品なら5V)
- 電流:全点灯(白)時、1ピクセル約60mA。300ピクセルなら約18A必要
- 電圧降下対策:細い銅箔配線では抵抗損失が大きいため、長いストリップでは中間で電源を追加注入(データ線はジャンパーで接続、電源/GNDを太い線で電源まで引き戻す)
- 電源容量は余裕を持って選定(40Aや60A等)。複数電源を使う場合は全GNDを共通接地
Arduinoコントローラの役割と限界
メインストリームのArduinoボードなら、Vixenとピクセルストリップの中継として使えます。最大の制約はシリアルポート速度(多くは115,200bps上限)です。300ピクセル(900チャネル)を115,200bpsで送ると約45msかかり、リフレッシュレートは約20Hz(50ms周期)が限界です。より多くのピクセルを制御する場合は、Vixen側の更新間隔を100ms以上に設定してください。

※本チュートリアルのコードはDavid Hunt氏(blog.huntgang.com)のものをベースにしています。
Vixen Lights 3.xでのシリアルコントローラ設定手順
ステップ1:Generic Serial Controllerの追加
右上メニューから「Generic Serial Controller」を追加します。

ステップ2:出力数の設定
コントローラの出力数を「ピクセル数 × 3」に設定します。例:30ピクセルなら90出力。

ステップ3:COMポートとボーレート設定
右下の歯車アイコンからCOMポートを選択(Arduinoが割り当てられているポート)、ボーレートを115200に設定。他はデフォルトのままでOK。

ステップ4:ヘッダーにピクセル数を指定
「Header Text」にピクセル数を3桁で入力(例:30ピクセルなら「030」)。この時点でArduinoのRX LEDが点滅し、データ受信を開始します。
ピクセル用エレメントの設定
ステップ5:Single Itemで「Pixel Strip」を作成
左上のドロップダウンから「Single Item」を選び、緑の「+」ボタンで追加、名前を「Pixel Strip」とします。

ステップ6:Numbered Itemsで全ピクセルを生成
作成した「Pixel Strip」を右クリック → 「Add Multiple」 → 「Numbered Items」を選択、名前とピクセル数(例:30)を指定してOK。

ステップ7:Color HandlingをフルRGBに設定
「Pixel Strip」をハイライトし、左下の「Configure:」から「Color Handling」を選択、「They can be any color: they are full RGB and mix to make any color.」を選択。

ステップ8:エレメントをコントローラにパッチ
左側の「Pixel Strip」と右側の「Generic Serial Controller」をハイライトし、「Patch Elements to Controllers」をクリック。未接続パッチポイント数が一致していれば完了です。

ステップ9:グラフィカルビューで確認
正しく設定できていれば、以下のようなビューになります。

最初のシーケンスを作成する
ステップ10:新規シーケンス作成
Vixenを起動し、「New Sequence...」をクリック。

ステップ11:オーディオファイルをインポート
「Tools」メニューから「Audio」→「Import Audio」でMP3等を読み込み。

ステップ12:タイムラインのズーム調整
波形が表示されたら、ツールバーの虫眼鏡アイコンでタイムラインを拡大・縮小して作業しやすくします。

ステップ13:ビート/バー検出でエフェクト合わせ
「Tools」→「Audio」→「Beat/Bar Detector」を実行。白い線がビート位置に表示され、エフェクト配置のガイドになります。

ステップ14:エフェクトの配置
左メニュー「Effects」から「Basic Lighting」や「Pixel Lighting」のエフェクト(例:Chase)をドラッグ&ドロップで「Pixel Strip」ラインに配置、マウスで長さ調整。

ステップ15:エフェクトパラメータの調整
配置したエフェクトを選択し、右メニューで方向・色・パルス・深度等を調整。「Effect Preview」でリアルタイム確認可能。

ステップ16:再生して確認
左上の再生ボタンでプレビュー。YouTubeに多数のサンプル動画がありますので参考にしてください。
注意: ArduinoをPCに接続しVixenを起動すると、ArduinoのRX LEDが点滅します。これはシリアルデータ待ち受け状態を示しています。
Arduinoスケッチ(FastLEDライブラリ使用)
FastLEDライブラリ(https://fastled.io/)をArduino IDEのライブラリマネージャからインストールしてください。
/* Vixen Lights 3.x - Arduino Generic Serial for Addressable Pixels
* Created November 8th, 2014 By Richard Sloan - www.themindfactory.com
* And David Hunt - blog.huntgang.com
* Version 1.4
*/
#include <FastLED.h>
#define NUM_LEDS 300 // 最大対応ピクセル数(メモリ節約のため)
#define DATA_PIN 6 // データ線接続ピン
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(115200);
}
void loop() {
int cnt = 0;
unsigned int num_leds, d1, d2, d3;
for(;;) {
cnt = 0;
// ヘッダー「>>」待ち
while(!Serial.available()); if(Serial.read() != '>') continue;
while(!Serial.available()); if(Serial.read() != '>') continue;
// 3桁のピクセル数取得
while(!Serial.available()); d1 = Serial.read();
while(!Serial.available()); d2 = Serial.read();
while(!Serial.available()); d3 = Serial.read();
// ヘッダー終端「<<」確認
while(!Serial.available()); if(Serial.read() != '<') continue;
while(!Serial.available()); if(Serial.read() != '<') continue;
num_leds = (d1-'0')*100 + (d2-'0')*10 + (d3-'0');
if(num_leds > NUM_LEDS) continue;
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, num_leds);
// 各ピクセルのR,G,Bを順次読み取り
do {
while(!Serial.available()); leds[cnt].r = Serial.read();
while(!Serial.available()); leds[cnt].g = Serial.read();
while(!Serial.available()); leds[cnt++].b = Serial.read();
} while(--num_leds);
FastLED.show(); // ストリップへ出力
}
}
回路図
データ線には470Ωの抵抗を直列に挿入してください。電源は外部5V電源からピクセルストリップへ直接供給し、Arduinoと電源のGNDを共通にします。


以上で、Vixen LightsとArduinoによるNeoPixel制御の基本セットアップは完了です。より大規模なディスプレイを作る場合は、電源注入ポイントの追加や、Teensy等の高速シリアル対応ボードの検討をお勧めします。
製造プロセス
- Arduino MegaでPWM制御:プッシュボタン付きLEDフェード制御チュートリアル
- Arduinoで超音波レベーション(浮遊)装置を自作:ステップバイステップガイド
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- Arduinoで温湿度ロガーを作る – DHT11とEthernetシールドでSDカード記録
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- Arduino UNOで周波数とデューティサイクルを高精度測定
- Arduinoで地球の質量を測定:ステップバイステップDIYガイド
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- スマート駐車場カウンター:Arduino、Processing、PHPでリアルタイム車両管理
- ArduinoとProcessingで作るリアルタイムデジタルコンパス