LoginSignup
4
4

More than 5 years have passed since last update.

クリスマスツリーに音楽に合わせて光るLEDを装飾をしてみた

Posted at

みなさん、こんにちわ。
都心の街やビルにはイルミネーションが飾られ、残業の光と合わせ幻想的な夜景が広がっております。

さて、今回の投稿はクリスマスツリーに音楽に合わせて光る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用シールド基板へのピンソケットの半田付け方法
Sparkfun Spectrum Shield_Soldering.JPG

マイコンボードとシリアルポートの設定

私の環境はMacのため、この記事ではMacでの説明になります。

  1. ArduinoとPCをUSBケーブルで繋ぎます。 USB_Connection.JPG

2. Arduino IDEを起動します。
Arduino_IDE.png

3. メニューから「ツール」→「ボード」でプルダウンからArduino Unoを選択します。
DropShadow ~ Arduino_Bord.png

4. メニューから「ツール」→「シリアルポート」をプルダウンからUSBを選択します。
DropShadow ~ Arduino_Port.png

FastLEDライブラリのインストール

  1. メニューから「スケッチ」→「ライブラリをインクルード」→「ライブラリ管理...」でライブラリマネージャを起動します。

  2. 検索フィールドに「FastLED」と入力して表示されたFastLEDをインストールをします。
    DropShadow ~ FastLED.png

Arduinoにスケッチ(コード)書き込み

1.以下のコードをIDEにコピペする。

sketch_visualizer.ino
#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.「コンパイルボタン」を押してコンパイルします。

IDE_Compile_skitch.png

4.「書き込みボタン」を押してArduinoへ書き込みをします。
IDE_Uplode_skitch.png

ピンの接続

  1. WS2812B LEDテープ側にジャンパワイヤを差し込みます。
    connect_jumper.jpg

  2. 以下のようにピンを接続します。

WS2812B LEDテープ Arduino の ピン
GND ---> GND
DATA ---> 6
5v ---> 5v

connect_sheld.jpg

音楽プレイヤーを接続して音楽を再生してみる

スマホを音楽プレイヤーとして接続し音楽を再生しました。
test_play.gif

LEDとビジュいあらクリスマスツリーに装飾する

隣席の人がUSBスピーカーを持っていたため拝借しました。
illumination.jpg

動画

最後に

ハンダ付けを含めても1時間半くらいで作成できました。ただ、材料費が高いですね。もし社内に設置するなら社内クラウドファンディングで資金調達してみてはどうでしょうか。また、音楽プレイヤーとしてスマホを直接繋いで使用しましたが、Volumioをインストール済みのRaspberry PiとArduinoを接続し、AirPlayでスマホに入れている音楽を流すのもいいかもしれません。

家庭や職場のクリスマスツリーをバージョンアップしてみましょう!

参考

スペクトラムシールドの使い方
FastLED

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4