シリアルLED(WS2812B)をArduinoで制御

この記事では、Arduinoを使ってシリアルLED(WS2812B)を制御する方法を解説していく。 シリアルLEDは、いくつものシリアルLEDを繋げることができ、それを通信線たった1本で制御できる。各シリアルLEDの色をフルカラーで独立して変えることができ、Arduinoやラズパイからも簡単に制御できるようになっている。

開発環境

開発環境はこちら。

項目バージョン
ArduinoデバイスSeeeduino XIAO
シリアルLEDWS2812B
Arduino IDE1.8.10
パソコンmacOS Big Sur 11.0.1

シリアルLED「WS2812B」がテープ上に60個並べられているこちらの製品を使用した。

購入したWS2812BのLEDテープライト
購入したWS2812BのLEDテープライト

BTF-LIGHTING LEDイルミネーション WS2812B LEDテープライト5050 SMD RGB 個別にアドレス指定可能 切断可能 プログラマブル可能 DC5V ドリームフルカラー IP65シリコンコーティング防水 ネオピクセル 1m 60LEDs 黒PCB
BTF-LIGHTING LEDイルミネーション WS2812B LEDテープライト5050 SMD RGB 個別にアドレス指定可能 切断可能 プログラマブル可能 DC5V ドリームフルカラー IP65シリコンコーティング防水 ネオピクセル 1m 60LEDs 黒PCB

Amazon

また、Arduinoの互換機である超小型マイコン「Seeeduino XIAO」を使った。Seeeduino XIAOの使い方はこちらの記事を参考に。

Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)

Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。

Amazon

シリアルLEDの仕組み

シリアルLEDの構造

シリアルLED「WS2812B」を拡大した写真がこちら。ICチップが埋め込まれていて、Arduinoなどから送られてきたデータを受け取り、赤・緑・青の各LEDを点灯する仕組み。

シリアルLEDの拡大写真
シリアルLEDの拡大写真

また、DOUTでは他のシリアルLEDのDINへ接続する。いくつものシリアルLEDを数珠繋ぎのようにして、しかも、ひとつひとつのLEDを制御できるのだ。

シリアルLEDArduino
VDD5V
VSSGND
DINデジタルピン
DOUT他のシリアルLEDのDINへ

シリアルLEDの制御信号の流れ

シリアルLEDがDINから送られてきたデータを受信すると、先頭のデータだけ取り出し、残りのデータをDOUTから他のシリアルLEDへ渡すようになっている。それぞれのデータの中には、赤・緑・青のLEDの明るさ情報が入れられており、それに基づいて各シリアルLEDは点灯される。

シリアルLEDへ送る制御信号の流れ
シリアルLEDへ送る制御信号の流れ

シリアルLEDとSeeeduino XIAOの配線

シリアルLEDとSeeeduino XIAOの配線はこちら。デジタルピン1番をシリアルLEDのDINへ繋いだ。他のArduinoの場合は、各自で置き換えてほしい。

シリアルLEDとSeeeduino XIAOの配線図
シリアルLEDとSeeeduino XIAOの配線図

図のようにシリアルLEDは数珠繋ぎにいくつも配線できる。今回はテープ型を使用するので、すでにDOUTとDINが繋がっている。テープ型は、使いたい分の長さでカットすることができるので大変便利だ。

シリアルLEDテープライトの拡大写真
シリアルLEDテープライトの拡大写真

なお、たくさんのシリアルLEDを同時に点灯させる場合は、マイコンからの電圧では追いつかない可能性があるので、シリアルLED用に別電源を用意しよう。

ライブラリのインストール

Arduino IDEのメニューから、SketchInclude LibraryManage Libraresへと進みLibrary Managerを開く。そこで「neopixel」で検索し、図のAdafruit NeoPixel/Arduino library for controlling single-wire-based LED pixels and strip.をインストールする。

ライブラリマネージャから「NeoPixel」で検索
ライブラリマネージャから「NeoPixel」で検索

ちなみにシリアルLEDは、もともと中国のWorldSemi社が開発したもので「NeoPixel」と呼ばれている。

シリアルLEDのプログラム例

シリアルLEDを1つだけ点灯させてみよう!

シリアルLEDを1つだけ点灯させた画像
シリアルLEDを1つだけ点灯させた画像

それではまず、シリアルLEDを1つだけ点灯させてみよう。プログラムは次の通り。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-serial-led.html
*/

#include <Adafruit_NeoPixel.h>

const int DIN_PIN = 1; // D1
const int LED_COUNT = 60; // LEDの数

Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
}

void loop() {
  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(128, 0, 0)); // 0番目の色を変える
  pixels.show();
}

プログラムの解説

Adafruit_NeoPixel pixels(LEDの数, DINに繋ぐArduinoのデジタルピン, NEO_GRB + NEO_KHZ800);
  1. pixels関数を初期化しているが、この記述はシリアルLEDWS2812Bを使う場合の書き方。他の型番のシリアルLEDではNEO_GRB + NEO_KHZ800を変える必要があるかもしれないので注意しよう。
  2. pixels.clear()を呼び出すことで、すべてのシリアルLEDがリセットされる。つまり、点灯しているLEDを消灯するために必要。
  3. pixels.setPixelColorでは、(LED番号, 色)のように制御したいシリアルLEDの番号を指定する。
  4. pixels.Color(128, 0, 0)では、赤・緑・青の順で0から255の範囲で明るさをセットする。数字が大きければ明るくなるが、シリアルLEDは非常に明るいので小さい値でも問題なく見える。

詳しくは、AdafruitのNeoPixelライブラリーを覗いてみよう。

シリアルLEDの色を赤→緑→青の順に変える

シリアルLEDの色が赤緑青の順で変化する映像
シリアルLEDの色が赤緑青の順で変化する映像

先ほどのプログラムのloop関数の中を、次のように変えてみよう。シリアルLEDの色が、赤 → 緑 → 青の順番で変化する。

void loop() {
  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(128, 0, 0)); // red
  pixels.show();
  delay(1000);

  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(0, 128, 0)); // green
  pixels.show();
  delay(1000);

  pixels.clear();
  pixels.setPixelColor(0, pixels.Color(0, 0, 128)); // blue
  pixels.show();
  delay(1000);
}

60個のシリアルLEDを順番に点灯させる

60個シリアルLEDを高速で順番に点灯させている映像
60個シリアルLEDを高速で順番に点灯させている映像

さらにloop関数の中を次のように変えてみよう。まるで光が生き物のように流れていく。

void loop() {
  for(int i=0; i<LED_COUNT; i++) {
    pixels.clear();
    pixels.setPixelColor(i, pixels.Color(0, 0, 128)); // red
    pixels.show();
    delay(10);
  }
}

シリアルLEDで虹を走らせてみた!

シリアルLEDテープライトで虹を走らせるている映像
シリアルLEDテープライトで虹を走らせるている映像

最後にシリアルLEDで虹を走らせてみた。

/*
  Created by Toshihiko Arai.
  https://101010.fun/iot/arduino-serial-led.html
*/

#include <Adafruit_NeoPixel.h>

const int DIN_PIN = 1; // D1
const int LED_COUNT = 60; // LEDの数

Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
}


uint32_t red = pixels.Color(128, 0, 0);
uint32_t orange = pixels.Color(128, 82, 0);
uint32_t yellow = pixels.Color(128, 128, 0);
uint32_t green = pixels.Color(0, 128, 0);
uint32_t cyan = pixels.Color(0, 128, 128);
uint32_t blue = pixels.Color(0, 0, 128);
uint32_t purple = pixels.Color(128, 0, 128);

uint32_t rainbow_color[] = {red, orange, yellow, green, cyan, blue, purple};
int rainbow_index[] = {6, 5, 4, 3, 2, 1, 0};

void loop() {
  
  for(int i = 0; i < LED_COUNT; i++) {    
    pixels.clear();    
    for(int j = 0; j < 7; j++) {
      rainbow_index[j] = i + 6 - j;
      if(rainbow_index[j] >= LED_COUNT) rainbow_index[j] -= LED_COUNT;
      
      pixels.setPixelColor(rainbow_index[j], rainbow_color[j]);
    }
    pixels.show();
    delay(20);
  }
}

今回使用した製品

ArduinoでシリアルLEDを制御したい場合は、型番に注意しよう。「WS2812B」であれば、書籍やネットに情報がたくさんあるので安心だと思う。

BTF-LIGHTING LEDイルミネーション WS2812B LEDテープライト5050 SMD RGB 個別にアドレス指定可能 切断可能 プログラマブル可能 DC5V ドリームフルカラー IP65シリコンコーティング防水 ネオピクセル 1m 60LEDs 黒PCB
BTF-LIGHTING LEDイルミネーション WS2812B LEDテープライト5050 SMD RGB 個別にアドレス指定可能 切断可能 プログラマブル可能 DC5V ドリームフルカラー IP65シリコンコーティング防水 ネオピクセル 1m 60LEDs 黒PCB

Amazon
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)
Seeed Studio Seeeduino XIAO-Arduino IDE 互換ボード SAMD21 Cortex M0+搭載 ブレッドボード互換 USB Type-C(3pcs)

Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。

Amazon

Arduinoの参考書

電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版
電子部品ごとの制御を学べる! Arduino 電子工作実践講座 改訂第2版

電子パーツを自由自在に組み合わせて電子工作ができるように、Arduinoによる電子部品ごとの制御方法を詳しく解説。初心者や電子工作に躓いた人でも安心して取り組めるよう、豊富な図・写真で徹底解説。2018年発刊の「Arduino 電子工作 実践講座」の改訂版です。

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

本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。

Amazon

最後まで読んでいただきありがとうございました。

「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。

今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓

あなたにおすすめ