工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

このチュートリアルでは、個別にアドレス指定可能なRGB LED、またはWS2812B LEDストリップをArduinoで制御する方法を学びます。詳細については以下の動画をご覧いただくか、書面によるチュートリアルをお読みください。

概要

基本例を通じて動作原理を説明した後、これらのLEDを使ったクールなArduinoプロジェクト、DIYインタラクティブLEDコーヒーテーブルを紹介します。このテーブルはWS2812B LED、物体検出用赤外線近接センサー、HC-05 Bluetoothモジュールを搭載し、カスタム構築したAndroidアプリで色を制御できます。このプロジェクトは私とCreativity Hero YouTubeチャンネルのMarijaとのコラボレーションです。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

WS2812B LEDの仕組み

LEDストリップを詳しく見てみましょう。タイプ5050 RGB LEDに、超小型のWS2812B LEDドライバーICが内蔵されています。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

赤・緑・青の3個のLEDの輝度を調整することで、任意の色を再現できます。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

これらのLEDの優れている点は、Arduinoのたった1ピンでストリップ全体を制御できることです。各LEDは両端に3つの接続端子を持ち、2つは電源用、1つはデータ用。矢印がデータフロー方向を示します。前のLEDのデータ出力パッドが次のLEDのデータ入力パッドに接続されます。ストリップは任意のサイズにカット可能で、ワイヤーでLED間を離すこともできます。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

電源は5V動作で、赤・緑・青各LEDが約20mA、全輝度時は1LEDあたり合計約60mAを消費します。ArduinoをUSB給電する場合、5Vピンは約400mAまで、バレルジャック給電なら約900mAまで対応可能です。

LED数が多く電流が上記を超える場合は、別途5V電源を使用する必要があります。その際、2つのグランドラインを接続することも必須です。また、ArduinoとLEDストリップのデータピン間に約330Ωの抵抗を入れてノイズを低減し、5Vとグランド間に約100μFのコンデンサを入れて電源を平滑化することを推奨します。

ArduinoとWS2812B LEDの例

例1:基本制御

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

20個のLEDストリップを、330Ω抵抗を介してArduinoに接続し、別途5V電源で駆動(上記の通り)。プログラミングにはFastLEDライブラリを使用。WS2812B LEDの簡単制御に優れた、ドキュメントも充実したライブラリです。

必要なコンポーネント:

  • WS2812B LEDストリップ
  • Arduinoボード
  • 5V 6A DC電源

例1のArduinoソースコード:

#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);
}

説明: FastLEDライブラリをインクルード、LEDストリップデータ接続ピン、LED数、CRGB型の配列を定義。CRGB型は赤・緑・青の3色チャネル用に各1バイトのデータメンバを持ちます。setup()で定義したパラメータでFastLEDを初期化。loop()ではCRGB関数で任意のLEDにRGBパラメータで色を設定し、FastLED.show()を呼び出してLEDに反映させます。

例2:アニメーション

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

forループを使って簡単にアニメーションを作成できます。

例2のArduinoソースコード:

#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);
  }
}

最初のforループで全20個のLEDを青で順番に点灯(40ms遅延)。次のforループで赤色で逆順に点灯します。FastLEDライブラリには他にも多くの関数があり、想像力次第で面白いアニメーションやライトショーが作れます。

WS2812B LEDを使用したインタラクティブLEDコーヒーテーブル

冒頭で紹介したDIYインタラクティブLEDコーヒーテーブルプロジェクトを見てみましょう。私とCreativity HeroのMarijaとのコラボレーションです。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

彼女のWebサイト記事で、木工から電子部品のはんだ付け・配線まで全工程を解説しています。ここでは電子部分の仕組み、カスタムAndroidアプリの構築、Arduinoプログラミングを説明します。

プロジェクトの完全な回路図:

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

テーブルは45個のアドレサブルLED、45個の赤外線近接センサー、HC-05 Bluetoothモジュールで構成され、すべてArduino Megaボードに接続。5V 6A電源で駆動します。

必要なコンポーネント:

  • WS2812B LEDストリップ
  • 赤外線近接センサー
  • HC-05 Bluetoothモジュール
  • Arduinoボード
  • 5V 6A DC電源

関連:ArduinoでRGB LEDを使う方法 | チュートリアル

ソースコード

このプロジェクトのArduinoコード。Bluetooth色制御機能を除けば、実は非常にシンプルです。

#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);
}

説明: 基本パラメータ定義後、45個の近接センサーピンを入力に設定。メインループで単一のforループにより全LEDを特定色に設定し、近接センサーが物体を検出したら(このケースではLOW)、該当LEDを反応色に設定。最後にFastLED.show()でLED色を更新。

Bluetooth色制御機能を追加するには、さらにコードを追加しAndroidアプリを作成する必要があります。HC-05 BluetoothモジュールのArduinoでの使用法と、MIT App InventorでのAndroidアプリ作成については別途チュートリアルがありますので参照してください。

Androidアプリの動作:カラーパレット画像から色を選択、2つのチェックボタンで選択色を反応色/背景色のどちらに適用するか選択、スライダーで明るさ調整。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

アプリのブロックを見ると、カラーパレット画像が配置されたキャンバスをタッチすると、.GetPixelColorブロックで選択色のRGB値を取得し、Bluetooth SendTextブロックでテキスト形式でArduinoに送信しています。

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

選択されたチェックボックスに応じて異なる先頭文字(マーカー)を送信し、Arduino側で受信時に判別できるようにしています。スライダー操作時も同様に、10〜100の値をマーカー「3」付きでテキスト送信。

AndroidアプリとMIT App Inventorプロジェクトファイルは以下からダウンロード可能:

ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

DIY_Reactive_LED_Table_Control

1 file(s) 0.00 KB Download ArduinoでWS2812B LEDをマスターする─ ステップバイステップガイド

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とHC-05 Bluetoothモジュール間のシリアル通信を定義(接続ピン指定)。setup()でボーレート設定。メインループでBluetooth.available()で着信チェック、Bluetooth.readString()で文字列受信。.startsWith()で先頭マーカーをチェックし、反応色/背景色/明るさのどれを変更するか判別。.substring()で受信テキストからRGB値を抽出し整数変換。これらをforループでLED色設定に使用。明るさも同様に調整。

このチュートリアルは以上です。ご質問はコメント欄でお気軽にお尋ねください。

製造プロセス

  1. ArduinoでユニバーサルIRリモコンを自作:ステップバイステップガイド
  2. Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
  3. Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
  4. IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
  5. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  6. FirmataとXbox OneコントローラーでArduinoローバーをシームレス操作
  7. Arduinoで地球の質量を測定:ステップバイステップDIYガイド
  8. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  9. Bolt IoTとArduino UNOでLED輝度をシームレス制御
  10. Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
  11. ArduinoとProcessingで作るリアルタイムデジタルコンパス