ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド
このチュートリアルでは、個別にアドレス指定可能なRGB LED、またはWS2812B LEDストリップをArduinoで制御する方法を学びます。詳細については以下の動画をご覧いただくか、書面によるチュートリアルをお読みください。 基本例を通じて動作原理を説明した後、これらのLEDを使ったクールなArduinoプロジェクト、DIYインタラクティブLEDコーヒーテーブルを紹介します。このテーブルはWS2812B LED、物体検出用赤外線近接センサー、HC-05 Bluetoothモジュールを搭載し、カスタム構築したAndroidアプリで色を制御できます。このプロジェクトは私とCreativity Hero YouTubeチャンネルのMarijaとのコラボレーションです。 LEDストリップを詳しく見てみましょう。タイプ5050 RGB LEDに、超小型のWS2812B LEDドライバーICが内蔵されています。 赤・緑・青の3個のLEDの輝度を調整することで、任意の色を再現できます。 これらのLEDの優れている点は、Arduinoのたった1ピンでストリップ全体を制御できることです。各LEDは両端に3つの接続端子を持ち、2つは電源用、1つはデータ用。矢印がデータフロー方向を示します。前のLEDのデータ出力パッドが次のLEDのデータ入力パッドに接続されます。ストリップは任意のサイズにカット可能で、ワイヤーでLED間を離すこともできます。 電源は5V動作で、赤・緑・青各LEDが約20mA、全輝度時は1LEDあたり合計約60mAを消費します。ArduinoをUSB給電する場合、5Vピンは約400mAまで、バレルジャック給電なら約900mAまで対応可能です。 LED数が多く電流が上記を超える場合は、別途5V電源を使用する必要があります。その際、2つのグランドラインを接続することも必須です。また、ArduinoとLEDストリップのデータピン間に約330Ωの抵抗を入れてノイズを低減し、5Vとグランド間に約100μFのコンデンサを入れて電源を平滑化することを推奨します。 20個のLEDストリップを、330Ω抵抗を介してArduinoに接続し、別途5V電源で駆動(上記の通り)。プログラミングにはFastLEDライブラリを使用。WS2812B LEDの簡単制御に優れた、ドキュメントも充実したライブラリです。 必要なコンポーネント: 例1のArduinoソースコード: 説明: FastLEDライブラリをインクルード、LEDストリップデータ接続ピン、LED数、CRGB型の配列を定義。CRGB型は赤・緑・青の3色チャネル用に各1バイトのデータメンバを持ちます。setup()で定義したパラメータでFastLEDを初期化。loop()ではCRGB関数で任意のLEDにRGBパラメータで色を設定し、FastLED.show()を呼び出してLEDに反映させます。 forループを使って簡単にアニメーションを作成できます。 例2のArduinoソースコード: 最初のforループで全20個のLEDを青で順番に点灯(40ms遅延)。次のforループで赤色で逆順に点灯します。FastLEDライブラリには他にも多くの関数があり、想像力次第で面白いアニメーションやライトショーが作れます。 冒頭で紹介したDIYインタラクティブLEDコーヒーテーブルプロジェクトを見てみましょう。私とCreativity HeroのMarijaとのコラボレーションです。 彼女のWebサイト記事で、木工から電子部品のはんだ付け・配線まで全工程を解説しています。ここでは電子部分の仕組み、カスタムAndroidアプリの構築、Arduinoプログラミングを説明します。 プロジェクトの完全な回路図: テーブルは45個のアドレサブルLED、45個の赤外線近接センサー、HC-05 Bluetoothモジュールで構成され、すべてArduino Megaボードに接続。5V 6A電源で駆動します。 必要なコンポーネント: 関連:ArduinoでRGB LEDを使う方法 | チュートリアル このプロジェクトのArduinoコード。Bluetooth色制御機能を除けば、実は非常にシンプルです。 説明: 基本パラメータ定義後、45個の近接センサーピンを入力に設定。メインループで単一のforループにより全LEDを特定色に設定し、近接センサーが物体を検出したら(このケースではLOW)、該当LEDを反応色に設定。最後にFastLED.show()でLED色を更新。 Bluetooth色制御機能を追加するには、さらにコードを追加しAndroidアプリを作成する必要があります。HC-05 BluetoothモジュールのArduinoでの使用法と、MIT App InventorでのAndroidアプリ作成については別途チュートリアルがありますので参照してください。 Androidアプリの動作:カラーパレット画像から色を選択、2つのチェックボタンで選択色を反応色/背景色のどちらに適用するか選択、スライダーで明るさ調整。 アプリのブロックを見ると、カラーパレット画像が配置されたキャンバスをタッチすると、.GetPixelColorブロックで選択色のRGB値を取得し、Bluetooth SendTextブロックでテキスト形式でArduinoに送信しています。 選択されたチェックボックスに応じて異なる先頭文字(マーカー)を送信し、Arduino側で受信時に判別できるようにしています。スライダー操作時も同様に、10〜100の値をマーカー「3」付きでテキスト送信。 AndroidアプリとMIT App Inventorプロジェクトファイルは以下からダウンロード可能: 説明: ArduinoとHC-05 Bluetoothモジュール間のシリアル通信を定義(接続ピン指定)。setup()でボーレート設定。メインループでBluetooth.available()で着信チェック、Bluetooth.readString()で文字列受信。.startsWith()で先頭マーカーをチェックし、反応色/背景色/明るさのどれを変更するか判別。.substring()で受信テキストからRGB値を抽出し整数変換。これらをforループでLED色設定に使用。明るさも同様に調整。 このチュートリアルは以上です。ご質問はコメント欄でお気軽にお尋ねください。概要

WS2812B LEDの仕組み



ArduinoとWS2812B LEDの例
例1:基本制御

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
leds[0] = CRGB(255, 0, 0); FastLED.show(); delay(500);
leds[1] = CRGB(0, 255, 0); FastLED.show(); delay(500);
leds[2] = CRGB(0, 0, 255); FastLED.show(); delay(500);
leds[5] = CRGB(150, 0, 255); FastLED.show(); delay(500);
leds[9] = CRGB(255, 200, 20); FastLED.show(); delay(500);
leds[14] = CRGB(85, 60, 180); FastLED.show(); delay(500);
leds[19] = CRGB(50, 255, 20); FastLED.show(); delay(500);
}例2:アニメーション

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 19; i++) {
leds[i] = CRGB(0, 0, 255);
FastLED.show();
delay(40);
}
for (int i = 19; i >= 0; i--) {
leds[i] = CRGB(255, 0, 0);
FastLED.show();
delay(40);
}
}WS2812B LEDを使用したインタラクティブLEDコーヒーテーブル


ソースコード
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
// 45個の近接センサーピンを入力に設定(デジタルピン3〜48)
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(0, 255, 0); // 全LEDを緑に設定
// 特定センサーで物体検出時、該当LEDを反応色に
if (digitalRead(pinNo + 3) == LOW) {
leds[pinNo] = CRGB(0, 0, 255); // 反応LEDを青に
}
}
FastLED.show(); // LED更新
delay(20);
}

DIY_Reactive_LED_Table_Control
1 file(s) 0.00 KB Download
DIY_Reactive_LED_Table_Control MIT App Inventor Project File
1 file(s) 208.06 KB Download
Bluetooth機能付きArduinoコード:
#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(53, 52); // Arduino(RX, TX) - Bluetooth(TX, RX)
// 初期背景色
int backR = 100, backG = 50, backB = 10;
// 初期反応色
int reactiveR = 10, reactiveG = 50, reactiveB = 100;
int brightness = 50; // 初期明るさ
String dataIn = "";
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
Serial.begin(38400);
Bluetooth.begin(38400); // Bluetoothモジュールのデフォルトボーレート
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString();
delay(20);
if (dataIn.startsWith("1")) { // 反応色変更
delay(10);
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
reactiveR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
reactiveG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
reactiveB = stringB.toInt();
} else if (dataIn.startsWith("2")) { // 背景色変更
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
backR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
backG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
backB = stringB.toInt();
} else if (dataIn.startsWith("3")) { // 明るさ変更
String stringBrightness = dataIn.substring(dataIn.indexOf("3") + 1, dataIn.length());
brightness = stringBrightness.toInt();
FastLED.setBrightness(brightness);
}
}
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(backR, backG, backB);
if (digitalRead(pinNo + 3) == LOW) {
leds[pinNo] = CRGB(reactiveR, reactiveG, reactiveB);
}
}
FastLED.show();
delay(20);
}
製造プロセス
- ArduinoでユニバーサルIRリモコンを自作:ステップバイステップガイド
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
- IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- FirmataとXbox OneコントローラーでArduinoローバーをシームレス操作
- Arduinoで地球の質量を測定:ステップバイステップDIYガイド
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
- ArduinoとProcessingで作るリアルタイムデジタルコンパス