LEDテープ(WS2812B)

LEDテープ 電子工作
LEDテープ


だいぶ前にバカスク(死語)で流行ったLEDテープを緊急停止用発光体として作ってみた。
古い動画になるが、開発当初のものはこちらである。
トビラの絵で使ったLEDテープは一番上がAmazonで当時一番安かったLEDテープ(IP65 1mあたり60個)と年末にアリエクより購入したLEDテープ群。真ん中は発光サイズが小さいがmあたりのLED数はAmazonのLEDの倍はある。 一番下 下地が黒のLEDテープは1mあたり144個

PIC以外でなるべく小さく作りたかったので8ピンのAVRマイコンを使用した。
FastLEDライブラリが使えるなど、汎用性が良くAVR(ATTiny85)はArduino IDEでプログラム開発を実施した。
LEDテープに使用されるWS2812B(フルカラーLED)は、5V電源とDATA線とGNDの3本で制御出来るので回路も簡単なものとなる。

作ったというわりにはテキスト通りの回路図は以下の通り 。
5番ピンをスイッチ入力トリガーとしてサブルーチンを順次指定、発光パターンを切り替えている。

作ったプログラムは以下の通り、開発途中のプログラムなので余計なものも若干ある。視覚的にわかり易く作ったつもりである。点灯パターンは(白色、青チェイサー、赤青交互フラッシュ、紫フラッシュ)。輝度を0~255で表現していて、点灯LEDの数は30個。
白色=夜間ライト、青チェイサー=ナイトライダー風、赤青交互フラッシュ=アメリカンポリス風、紫フラッシュ=緊急停止ライトで本来の主役。
使ってない変数があったり、変数の実数が等倍でなかったりしてるのは開発を暇つぶしで行っていたので途中で何をしたか忘れたこともあり整理をしてないのである。整理整頓が好きなプログラマーが見たらぶち切れるかもしれないが、そこはへっぽこプログラマーが書いたとして大目に見てほしいのだ。

#include "Arduino.h"
#include <FastLED.h>

#define LED_PIN 1 // LED Strip Signal Connection 
#define buttonPin 0 // Push Button Pin
#define NUM_LEDS 30 // Total no of LEDs in the LED strip

CRGB leds[NUM_LEDS];

int LED_POWER_7 = 255;
int LED_POWER_6 = 255;
int LED_POWER_5 = 150;
int LED_POWER_4 = 100;
int LED_POWER_3 = 50;
int LED_POWER_2 = 20;
int LED_POWER_1 = 5;
int LED_POWER_0 = 0;

int SPEED1 = 75;
int SPEED2 = 30;
int SPEED3 = 400;
int SPEED4 = 60;
int SPEED5 = 300;

int numb = 1;

void setup() {
    pinMode(buttonPin, INPUT_PULLUP);
    FastLED.setTemperature(UncorrectedTemperature);
    FastLED.setCorrection(TypicalLEDStrip);
    FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
    FastLED.clear();
        for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB(0, 0, 0); // BLACK
    }
    FastLED.show();
}

void loop() {
    ButtonScan();

    switch (numb) {
        case 1: Pattern1(); break;
        case 2: Pattern2(); break;
        case 3: Pattern3(); break;
        case 4: Pattern4(); break;
        default: Pattern1(); break;
    }
}

void Pattern1() {
    for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB(255, 255, 255);
    }
    FastLED.show();
    delay(100); // Reliably displays white
}

void Pattern2() {
    fadeToBlackBy(leds, NUM_LEDS, 4);
    int pos = beatsin16(25, 0, NUM_LEDS-1);
    leds[pos] += CRGB(0, 0, 255); // blue chaser
    FastLED.show();
    FastLED.delay(5);
}

void Pattern3() {
    for (int i = 0; i < 3; i++) {
        for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(0, 0, 255); // blue blinking
        }
        FastLED.show();
        delay(SPEED4);

        for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(0, 0, 0);
        }
        FastLED.show();
        delay(SPEED4);
    }
    delay(SPEED5);

    for (int i = 0; i < 3; i++) {
        for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(255, 0, 0); // red blinking
        }
        FastLED.show();
        delay(SPEED4);

        for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(0, 0, 0);
        }
        FastLED.show();
        delay(SPEED4);
    }
    delay(SPEED5);
}

void Pattern4() {
    for (int i = 0; i < 3; i++) {
        for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(80, 0, 80); // Purple blinking 128->80
        }
        FastLED.show();
        delay(SPEED4);

        for (int i = 0; i < NUM_LEDS; i++) {
            leds[i] = CRGB(0, 0, 0);
        }
        FastLED.show();
        delay(SPEED4);
    }
    delay(SPEED5);
}

void ButtonScan() {
    static bool lastButtonState = HIGH;
    bool buttonState = digitalRead(buttonPin);

    if (buttonState == LOW && lastButtonState == HIGH) {
        delay(50); // Chattering Prevention
        if (digitalRead(buttonPin) == LOW) { // double check
            numb++;
            if (numb == 5) numb = 1;
        }
    }
    lastButtonState = buttonState;
}

初期の開発時、LEDバーで開発していたので10個のLEDを使っていた。その後、Amazonで買ったLEDテープに切り替えたところ、全体的に発色が悪く。1000円以下だしな。なんて考えていてアリエクから2種類のLEDテープを買ったところ、どのLEDテープでも白色が黄色っぽくなる現象が表れてしまった。
この問題の解決までに1ヶ月近くを要してしまった。

SETUPに見慣れない命令があるのはそのせいである。現在は原因が判明しているのでそれらの命令はカットしても構わないし、そのままでも特に問題はない。プログラム領域はまだ半分も消費していないからである。理由は電力不足だった。赤や青などの単色点灯はそんなに消費しないが白色にするには全点灯するので電気を沢山消費することが分かった。つまり、電力不足だと青が点灯してくれないのだ。なので赤と緑の点灯が強まってしまい。黄色となるのであった。LEDを10~20個点灯時には電力消費が低いため、全く気づけてなかったのだ。
LED60個を白色点灯するには簡易計算で5V4A程度の電力値が必要になる。
夜間の照明(ライト)の代わりになればいいなぁ~なんて暢気な考えで投入したが思わず自分で落とし穴を掘ってしまったのだ。今、アリエクから大電流が取れるDC・DCコンバータを購入中であるが、ノイズが酷そうなのでテール辺りに仕込んでおこうと思う。これだけ取れれば、5V系のUBS充電器は個別に必要無いかもしれないなぁなんて思ってます。

DC・DCコンバータが届いたら、導入方法を1から説明しますが、Arduino Uno Rev3(とその互換機も含む)を購入済みが前提なので少し難しいかもしれません。

コメント