みなさん、こんにちわ。
都心の街やビルにはイルミネーションが飾られ、残業の光と合わせ幻想的な夜景が広がっております。
さて、今回の投稿はクリスマスツリーに音楽に合わせて光るLEDを装飾したお話です。
材料と費用
今回の材料はスイッチサイエンスとAmazonで購入しました。
名前 | 値段 |
---|---|
スペクトラムシールド | 3,118 円 |
Arduino Uno R3 | 3,240 円 |
USB2.0ケーブル (A-Bタイプ)50cm | 162 円 |
ACアダプター 9V/1.3A | 945 円 |
Arduinoシールド用ピンソケットのセット(R3対応) | 185 円 |
ジャンパワイヤ(オス~オス) | 492 円 |
WS2812B LEDテープ 1m | 1,480 円 |
3.5mmステレオミニケーブル 10cm | 498 円 |
クリスマスツリーセット ミニ 60cm | 2,380 円 |
合計: | 12,500 円 |
環境とツール
- Arduino IDEがインストール済みのPC
- ハンダごて
- ハンダ
スペクトラムシールドにピンソケットをハンダ付け
まずは、スペクトラムシールドにピンソケットをハンダ付けをします。
ハンダ付けが初めての方はこちらの動画を参考にしてください。
→Arduino用シールド基板へのピンソケットの半田付け方法
マイコンボードとシリアルポートの設定
私の環境はMacのため、この記事ではMacでの説明になります。
3. メニューから「ツール」→「ボード」でプルダウンからArduino Unoを選択します。
4. メニューから「ツール」→「シリアルポート」をプルダウンからUSBを選択します。
FastLEDライブラリのインストール
-
メニューから「スケッチ」→「ライブラリをインクルード」→「ライブラリ管理...」でライブラリマネージャを起動します。
-
検索フィールドに「FastLED」と入力して表示されたFastLEDをインストールをします。
Arduinoにスケッチ(コード)書き込み
1.以下のコードをIDEにコピペする。
#include "FastLED.h"
// LEDの設定
#define LED_PIN 6
#define NUM_LEDS 60 // LEDの数
#define BRIGHTNESS 64
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
#define UPDATES_PER_SECOND 100
#define REACT_LEVEL 1023L // 音の反応レベル値
CRGB leds[NUM_LEDS];
// オーディオ入力の設定
int strobe = 4;
int reset = 5;
int audio1 = A0;
int audio2 = A1;
int left[7];
int right[7];
int band;
int audio_input = 0;
int freq = 0;
// ビジュアライザの変数
int midway = NUM_LEDS / 2; // 真ん中のLED
int loop_max = 0;
int k = 255;
int decay = 0;
int decay_check = 0;
long pre_react = 0;
long react = 0;
long post_react = 0;
int wheel_speed = 2;
void setup()
{
// スペクトルの設定
pinMode(audio1, INPUT);
pinMode(audio2, INPUT);
pinMode(strobe, OUTPUT);
pinMode(reset, OUTPUT);
digitalWrite(reset, LOW);
digitalWrite(strobe, HIGH);
// LEDの明るさを調整
delay( 3000 );
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
// LEDの初期化
for (int i = 0; i < NUM_LEDS; i++)
leds[i] = CRGB(0, 0, 0);
FastLED.show();
// シリアル入力にの設定
Serial.begin(115200);
Serial.println("\nListening...");
}
// 虹色の作成
// 参考 https://github.com/NeverPlayLegit/Rainbow-Fader-FastLED/blob/master/rainbow.ino
CRGB Scroll(int pos) {
CRGB color (0, 0, 0);
if (pos < 85) {
color.g = 0;
color.r = ((float)pos / 85.0f) * 255.0f;
color.b = 255 - color.r;
} else if (pos < 170) {
color.g = ((float)(pos - 85) / 85.0f) * 255.0f;
color.r = 255 - color.g;
color.b = 0;
} else if (pos < 256) {
color.b = ((float)(pos - 170) / 85.0f) * 255.0f;
color.g = 255 - color.b;
color.r = 1;
}
return color;
}
// MSGEQ7(スペクトラムアナライザ)から値を読み込む
void readMSGEQ7()
{
digitalWrite(reset, HIGH);
digitalWrite(reset, LOW);
for (band = 0; band < 7; band++)
{
digitalWrite(strobe, LOW);
delayMicroseconds(30); //
left[band] = analogRead(audio1);
right[band] = analogRead(audio2);
digitalWrite(strobe, HIGH);
}
}
// 真ん中のLEDから両端に向けてビジュアライズする
void doubleVisualizer()
{
for (int i = NUM_LEDS - 1; i >= midway; i--) {
if (i < react + midway) {
leds[i] = Scroll((i * 256 / 50 + k) % 256);
leds[(midway - i) + midway] = Scroll((i * 256 / 50 + k) % 256);
}
else
leds[i] = CRGB(0, 0, 0);
leds[midway - react] = CRGB(0, 0, 0);
}
FastLED.show();
}
// オーディオ信号からLEDを光らせるレベルを算出
void convertDouble()
{
if (left[freq] > right[freq])
audio_input = left[freq];
else
audio_input = right[freq];
if (audio_input > 80)
{
pre_react = ((long)midway * (long)audio_input) / REACT_LEVEL;
if (pre_react > react)
react = pre_react;
Serial.print(audio_input);
Serial.print(" -> ");
Serial.println(pre_react);
}
}
void doubleLevel()
{
readMSGEQ7();
convertDouble();
doubleVisualizer();
k = k - wheel_speed;
if (k < 0)
k = 255;
decay_check++;
if (decay_check > decay)
{
decay_check = 0;
if (react > 0)
react--;
}
}
void loop()
{
doubleLevel();
}
2. スケッチの定数を自分の環境に合わせて変更します。
定数 | 説明 |
---|---|
NUM_LEDS | 使用するLED数を設定してください。 |
REACT_LEVEL | 音の反応レベルです。出力レベルや曲のジャンルに合わせて調整してください。 |
3.「コンパイルボタン」を押してコンパイルします。
4.「書き込みボタン」を押してArduinoへ書き込みをします。
ピンの接続
WS2812B LEDテープ | Arduino の ピン | |
---|---|---|
GND | ---> | GND |
DATA | ---> | 6 |
5v | ---> | 5v |
音楽プレイヤーを接続して音楽を再生してみる
LEDとビジュいあらクリスマスツリーに装飾する
動画
クリスマスツリーに音楽に合わせて光るLEDを装飾をしてみた pic.twitter.com/SXCOqjqFVW
— kokichi@opst (@kokichi_opst) 2018年12月10日
最後に
ハンダ付けを含めても1時間半くらいで作成できました。ただ、材料費が高いですね。もし社内に設置するなら社内クラウドファンディングで資金調達してみてはどうでしょうか。また、音楽プレイヤーとしてスマホを直接繋いで使用しましたが、Volumioをインストール済みのRaspberry PiとArduinoを接続し、AirPlayでスマホに入れている音楽を流すのもいいかもしれません。
家庭や職場のクリスマスツリーをバージョンアップしてみましょう!