見出し画像

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() { }


この記事が気に入ったらサポートをしてみませんか?