Arduinoを使ってLEDテープを光らせるにあたって、まず回路を組みました。
まずはテストなので、電源の入り切りで回路の入り切りをするだけの回路です。
「VCC DC5V」は今回搭載する制御系統、LEDテープの電源です。
バイクのバッテリから取るか、スマホの充電用バッテリから取るか悩み中です。
「Arduino電源」はArduinoに電源を供給するためのUSBメス端子です。
中央のでっかい四角がArduino本体です。電源はUSBケーブルで「Arduino電源」に挿します。
右にあるのがLEDテープの「WS2812」です。図には2個しか描いていませんが、実際には144個連なっています。Arduinoと接続するのは左端の1個のみです。
LEDが焼損しないようにするため、1000μFのコンデンサーをLED電源に並列配線し、300~500Ωの抵抗器を1番目のLED素子のDIN端子とArduinoの間に直列配線するらしいです。理屈はよく分かりません。
そして、実際に配線した写真がこれです。
コンデンサと抵抗が1個ずつの、超が付くほどシンプルな回路です。
今はテストなので、バッテリはスマホ用のやつです。
この時、注意してください。
GNDは共通ですが、「5V」の電源までArduinoから取っちゃうと、電流が流れすぎてICがぶっ壊れます。
LEDテープの電源は、必ず別電源としましょう。
GNDは共通にしないと、1個目のLEDがちらつきます。
そして、こいつに入っているスケッチ(プログラム)がこちらです。
// 【重要】NeoPixelが焼損しないようにするため、1000μFのコンデンサーをLED電源に並列配線し、
// 300~500Ωの抵抗器を1番目のLED素子のDIN端子とArduinoの間に直列配線します。
// Arduino と1番目のLED素子は出来るだけ近接させます。
// 配線作業は、電源投入済みの回路では行なわないでください。
// もし、どうしてもそれが必要な場合、GNDから先に配線してください。
//1A以上の電流をかけようとしている場合(LED 1素子あたり20~50mA)は、テープLEDに5V電源を直接接続します。
//テープLEDのGNDは、Arduino のGNDと共有する必要があります。
//ライブラリの読み込み
#include <Adafruit_NeoPixel.h> //Adafruit_NeoPixelライブラリ
//変数定義
#define LEDPIN 6 //Adafruit_NeoPixelで使用する入出力ピン
#define Pixels 144 //LEDテープのLED素子の数
//NeoPixelオブジェクトを宣言します。この名前を後で参照しピクセルのストリップを制御します
//Adafruit_NeoPixel( Parameter 1 , Parameter 2 , Parameter 3 )
//Parameter 1 = テープ上のLED素子数
//Parameter 2 = Arduino ピン番号 (おおかた利用可)
//Parameter 3 = LED素子タイプフラグ(必要に応じて追加)
// NEO_KHZ800 800 KHz ビット信号 (LED「WS2812」を使用したほとんどの NeoPixel 品)
// NEO_KHZ400 400 KHz ビット信号 (旧い v1 (v2でない) FLORA, LEDドライバー「WS2811」)
// NEO_GRB LED素子はGRBビット信号で接続 (ほとんどの NeoPixel 品)
// NEO_RGB LED素子はRGBビット信号で接続 (v1 FLORA,v2 ではありません)
Adafruit_NeoPixel strip = Adafruit_NeoPixel( Pixels , LEDPIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin();
//初期化を行う処理です。ここで指定の出力ピンにpinMode(pin, OUTPUT);を行ってます。
strip.setBrightness(15);
//LEDの明るさを指定します。0-255の範囲です。
strip.show();
//strip.show()は絶対に必要なわけではありません。
//この関数で実際に接続している全てのLEDに出力します。
//この関数は、まだ色が設定されていないので、ピクセルにデータをプッシュアウトします。
//この場合、以前のプログラムによって一部が点灯された場合、すべてのNeoPixelsを初期の「オフ」状態に初期化します。
}
void loop() {
colorWipe(strip.Color(255, 0, 0), 10); // Red
colorWipe(strip.Color(0, 255, 0), 10); // Green
colorWipe(strip.Color(0, 0, 255), 10); // Blue
// strip.Color()関数では、赤、緑、青の輝度レベルで表現されるピクセルカラー(0-255)値を構造体に格納し、色をセットできます
// 一括して色を変更したい場合はfor文でLEDの数分だけ
// setPixelColorを呼びます
// strip.setPixelColor(n, red, green, blue);
//colorWipe()関数を呼び出し、
//strip.Color()で指定した次の3つの引数、赤、緑、青の輝度レベルで表現されるピクセルカラー(0は最も暗く、255は最大輝度)と、
//待ち時間(ms)を全てのNeoPixelsへ反映します。
}
void colorWipe(uint32_t c, uint8_t wait) {
//この関数を1度処理すると、
//uint32_t c で指定した1つの色が、
//uint8_t wait の間隔を開けて
//Arduino側から端まで流れる。
//for(uint16_t i=strip.numPixels(); i>-1; i--) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
//strip.numPixels()関数は、Adafruit_NeoPixelで宣言したストリップのピクセル数を照会することができます。
strip.setPixelColor(i, c);
//strip.setPixelColor(i, red, green, blue)関数の最初の引数(この例ではi)は、ストリップに沿ったピクセル番号で、Arduinoに最も近い0から始まります。
//30ピクセルのストリップがある場合、0〜29の番号が付けられます。
//forループを使用してコード内のさまざまな場所を表示し、ループカウンタ変数をこの関数のピクセル番号として渡して、複数のピクセルの値を設定します。
//setPixelColor()はLEDに直接影響を与えません。次の行のstrip.show()を使用する事で初めてカラーデータをストリップに送信します。
strip.show();
delay(wait);
//colorWipe(c,wait)で指定した時間待て(ms)
}
}
//補足①:strip.getPixelColor()
//strip.getPixelColor()関数は、以前に設定した指定ピクセルのカラー値(32bit)を返します。
前回載せたサイトのどっかかしらから引用しています。
で、実際光らせたのがこちらです。
赤→緑→青の順にスライドしています。
これで光ることは確認出来ました。
さて、ここまで来たら次はバイクに搭載することを考えます。
今の状態では、バイクのキーをオンにしている間ずっと光ります。もちろん走行中にこんなにピカピカ光るのは違法ですから、その問題を解決しなくてはいけません。
そして、この赤緑青のイルミネーション、ださいです。自分でかっちょいいイルミネーションを考えないといけません。
テストは終わったので、一旦こいつらはバラバラにして、次回からバイクに搭載することを考えて新たに構築し直します。