WS2812B+NANO
年末にポンバシのシリコンハウスでNeoPixelのLED テープを見たが、けっこういい値段で買う気になれなかった。ところが、家に帰ってAmazonで見たら1mもの(60pixel)が999円で出ている。これは買わねばなるまい。ゲットした。これでしばらく遊べそうだ。
少しずつ試してこのページの記事を増やしていこうと思う。
WS2812B
WS2812Bは、シリアルLEDを数珠つなぎで増設することができ、5V線とGNDの他に信号線1本だけですべてを制御できるすぐれものである。
回路は、WS2812B、arduino NANO、モバイルバッテリー+ブレッドボード+...で組んだ。給電はarduino NANOはPCからUSB経由、WS2812Bはモバイルバッテリーで行った。(GND共通)
Rainbow spin
ArduinoとシリアルLED(WS2812B) のサンプルスケッチを少し触ってみた。サンプルでは テープの始点の7つのLED(0~7) がいきなり7色に光るところから始まり、移動の終了時中途半端にLEDが点いたままになる。次々とデモる時には気にならないが、単体でデモる時は少し気持ち悪いので、最初のLED(0)が赤く光るところから始まり、そのあと7色が伸びていき、終端では1色ずつ消えていくように変えた。
改変後
/*
* modified_sketch.ino
* spin rainbow colors
* from https://101010.fun/iot/arduino-serial-led.html
*/
#include <Adafruit_NeoPixel.h>
const int DIN_PIN = 6; // D6 to neoPixel
const int LED_COUNT = 60; // number of LED
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
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};
#define interval_time 50 // msec
void setup() {
pixels.begin();
forward(2); // 2 turns
}
void forward(int cycle) {
for (int i = 0; i < 7; i++) {
pixels.clear();
for (int j = 0; j < 7; j++) {
rainbow_index[j] = i - j;
// if (rainbow_index[j] >= LED_COUNT) rainbow_index[j] -= LED_COUNT;
pixels.setPixelColor(rainbow_index[j], rainbow_color[j]);
}
pixels.show();
delay(interval_time);
}
for (int k = 0; k < cycle; k++) {
for (int i = 0; i < LED_COUNT; i++) {
pixels.clear();
for (int j = 0; j < 7; j++) {
rainbow_index[j] = i + 7 - j;
if (k != cycle - 1) {
if (rainbow_index[j] >= LED_COUNT) rainbow_index[j] -= LED_COUNT;
}
pixels.setPixelColor(rainbow_index[j], rainbow_color[j]);
}
pixels.show();
delay(interval_time);
}
}
}
void loop() { }
オリジナルのサンプルスケッチ
/*
* original_sample_sketch.ino
* spin rainbow colors
* from https://101010.fun/iot/arduino-serial-led.html
*/
#include <Adafruit_NeoPixel.h>
const int DIN_PIN = 6; // D6 to neoPixel
const int LED_COUNT = 60; // number of LED
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800);
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};
#define interval_time 50 // msec
void setup() {
pixels.begin();
sample_forward();
}
void sample_forward() { // 2turns
for (int k = 0; k < 2; k++) {
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(interval_time);
}
}
}
void loop() { }