シリアルLED(WS2812B)をArduinoで制御
この記事では、Arduinoを使ってシリアルLED(WS2812B)を制御する方法を解説していく。 シリアルLEDは、いくつものシリアルLEDを繋げることができ、それを通信線たった1本で制御できる。各シリアルLEDの色をフルカラーで独立して変えることができ、Arduinoやラズパイからも簡単に制御できるようになっている。
開発環境
開発環境はこちら。
項目 | バージョン |
---|---|
Arduinoデバイス | Seeeduino XIAO |
シリアルLED | WS2812B |
Arduino IDE | 1.8.10 |
パソコン | macOS Big Sur 11.0.1 |
シリアルLED「WS2812B」がテープ上に60個並べられているこちらの製品を使用した。
また、Arduinoの互換機である超小型マイコン「Seeeduino XIAO」を使った。Seeeduino XIAOの使い方はこちらの記事を参考に。
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を点灯する仕組み。
また、DOUTでは他のシリアルLEDのDINへ接続する。いくつものシリアルLEDを数珠繋ぎのようにして、しかも、ひとつひとつのLEDを制御できるのだ。
シリアルLED | Arduino |
---|---|
VDD | 5V |
VSS | GND |
DIN | デジタルピン |
DOUT | 他のシリアルLEDのDINへ |
シリアルLEDの制御信号の流れ
シリアルLEDがDINから送られてきたデータを受信すると、先頭のデータだけ取り出し、残りのデータをDOUTから他のシリアルLEDへ渡すようになっている。それぞれのデータの中には、赤・緑・青のLEDの明るさ情報が入れられており、それに基づいて各シリアルLEDは点灯される。
シリアルLEDとSeeeduino XIAOの配線
シリアルLEDとSeeeduino XIAOの配線はこちら。デジタルピン1番をシリアルLEDのDINへ繋いだ。他のArduinoの場合は、各自で置き換えてほしい。
図のようにシリアルLEDは数珠繋ぎにいくつも配線できる。今回はテープ型を使用するので、すでにDOUTとDINが繋がっている。テープ型は、使いたい分の長さでカットすることができるので大変便利だ。
なお、たくさんのシリアルLEDを同時に点灯させる場合は、マイコンからの電圧では追いつかない可能性があるので、シリアルLED用に別電源を用意しよう。
ライブラリのインストール
Arduino IDEのメニューから、Sketch → Include Library → Manage Libraresへと進みLibrary Managerを開く。そこで「neopixel」で検索し、図のAdafruit NeoPixel/Arduino library for controlling single-wire-based LED pixels and strip.をインストールする。
ちなみにシリアルLEDは、もともと中国のWorldSemi社が開発したもので「NeoPixel」と呼ばれている。
シリアルLEDのプログラム例
シリアル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);
- pixels関数を初期化しているが、この記述はシリアルLEDWS2812Bを使う場合の書き方。他の型番のシリアルLEDではNEO_GRB + NEO_KHZ800を変える必要があるかもしれないので注意しよう。
- pixels.clear()を呼び出すことで、すべてのシリアルLEDがリセットされる。つまり、点灯しているLEDを消灯するために必要。
- pixels.setPixelColorでは、(LED番号, 色)のように制御したいシリアルLEDの番号を指定する。
- pixels.Color(128, 0, 0)では、赤・緑・青の順で0から255の範囲で明るさをセットする。数字が大きければ明るくなるが、シリアルLEDは非常に明るいので小さい値でも問題なく見える。
詳しくは、AdafruitのNeoPixelライブラリーを覗いてみよう。
シリアル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を順番に点灯させる
さらに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で虹を走らせてみた。
/*
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」であれば、書籍やネットに情報がたくさんあるので安心だと思う。
Seeeduino XIAO開発ボードは、ARMCortex-M0+ 32ビット48MHzマイクロコントローラー(SAMD21G18)を搭載し、低消費電力です。クロック周波数は48MHzと、Arduino Uno、Arduino Nanoの3倍です。 又、このArduino IDE互換ボードには256KBのフラッシュメモリ、32KBのSRAMも搭載されています。
AmazonArduinoの参考書
本書では、開発者自らが、Arduinoの哲学、ハードウェア、ソフトウェアの基礎を解説、誰にでもできる簡単なチュートリアルを行います。
Amazon最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓