DIY ホリデーシャドーシアター:ArduinoとアドレサブルLEDで作る光の影絵劇
必要な部品と材料
- Arduino 101 × 1
- SparkFun アドレサブルRGB LEDストリップ × 1 (接続が簡単なため選択。他のアドレサブルLEDストリップでも微調整で動作可能)
- SparkFun オスバレルジャックアダプタ × 1 (地元の電子部品店で入手可能)
- SparkFun メスバレルジャックアダプタ × 1
- SparkFun 単3電池ボックス (スイッチ付き、3本用) × 1
- SparkFun 単3電池 × 3 (汎用品でOK。SparkFunを選んだのはサプライヤーを絞るため。単3電池3本必要)
- Pololu 昇圧レギュレータ 12V × 1 (LEDストリップと同じ電池でArduino 101を駆動する便利な方法)
- 普通紙 A4 4枚
- 厚紙 (100lb、A4 4枚)
- 白色発泡コアボード 3/16インチ、A4サイズ4枚分
必要な工具と機器
- ホットボンド (汎用)
- はんだごて (汎用)
- デザインナイフ (Xactoナイフ)
- 替え刃 (#11)
- ワイヤーストリッパー (12-20 AWG)
- プリンター (厚紙印刷対応)
- 小型ドライバー (バレルジャック端子の締め付け用)
アプリとオンラインサービス
- Arduino IDE
- Blynk
- Adafruit NeoPixelライブラリ
プロジェクト概要
概要

このプロジェクトでは、Arduino 101、アドレサブルLEDストリップ、発泡コアボード、厚紙を使って、スマホで制御できるアニメーション付きシャドーシアター(影絵劇)を作ります。電子部品は非破壊的に使用するため、後で別のプロジェクトに流用できます。電子部品のほぼすべてを含むSparkFunのウィッシュリストを用意しました。

仕組み:


1本のアドレサブルLEDストリップを、シャドーシアター中央の発泡コアボードに巻き付けます。下部付近のLEDを順番に点灯させ、ピンホールを通して光を投影することでアニメーションする影を作ります。上部のLEDは上部の建物に導光し、ストリップの最後のLEDはシーン全体を照らしてメインの影を作ります。

Arduino 101にはBluetooth無線が内蔵されており、Blynkというクイックプロトタイピングアプリでリモート制御します。サンプルコードでは、建物のライトの色変更、揺らめく炎の演出、メイン影ライトの明るさ調整が可能です。
パート1: 電子部品のセットアップ
ステップ1
LEDストリップの端側ハーネスを、ライトから約1cmの位置でカットし、ワイヤー端を剥きます。


ステップ2
昇圧レギュレータ付属の曲がったヘッダーピンを分解し、緑と黄色のワイヤー先端にはんだ付けします。これでArduino 101のピンに簡単に挿せるようになります。

ステップ3
赤いワイヤーを昇圧レギュレータのVIN端子にはんだ付けし、GNDとVOUTピンに真っ直ぐなヘッダーピンを2本はんだ付けします(写真参照)。

ステップ4
バレルジャックアダプタを接続します。まず電池ボックスから出ているワイヤー端を剥き、オスバレルジャックの端子に取り付けてドライバーで締めます。赤を(+)端子、黒を(-)端子に。

次に、LEDストリップ始端側のワイヤーにメスバレルジャックアダプタを接続します。黄色を(-)端子、赤を(+)端子に。

ステップ5
ハーネスをArduino 101に接続します。緑のワイヤーをピン6、黄色のワイヤーを#13付近のGNDピンに。昇圧レギュレータの2本のヘッダーピンは、GNDをGND、VOUTをArduino 101の「Vin」ピンに挿します。逆接続厳禁! 逆さに挿すと発煙・発火の原因になります。身をもって知っています。


パート2: 発泡コアステージの組み立て
発泡コア用パターンを普通紙(4枚)に、厚紙用パターンを厚紙(4枚)に印刷します。
ステップ1
印刷した発泡コア用パターンを使って発泡コアピースを切り出します。パターンを発泡コアに置き、ホビーナイフで軽くなぞって線を転写します。


ステップ2
ピースが切り出せたら、まずLEDストリップホルダーを組み立てます:

LEDストリップの最初のLEDをテープまたはホットボンドで底部に固定し、写真のように巻き付けます。きつく巻く必要はありません。ストリップを傷めないことが大切です。


3周巻いたら、末端は自由にし、テープまたはホットボンドで上部を固定します。
ステップ3
このLEDストリップはアドレサブルLEDなので、「ねえ、真ん中の君、赤になって!」と指示できます。でも「ねえ、君」では通じません。各LEDの番号を知る必要があります。
折り目より下のLEDはシャドーシアターの背面から光を出し、アニメーションに使います。下の例では、アニメーション用LEDは 0, 1, 2, 20, 21, 22, 40, 41, 42 です。上部の2つのLEDは建物に光を導きます。LED 23 を奥の家に、LED 25 を手前の家の炎の揺らめきに使います。
LEDを数え、後でコードに入力しやすいよう簡単な参照マップを作成してください。 ストリップの先頭からゼロベースで数えることを忘れずに(コンピュータは0から数えるため)。

ステップ4
LEDホルダーを発泡コア底板にホットボンドで固定します。写真の位置に配置し、幅広のライトストライプが底板の長手方向にだいたい中央になるようにします。


発泡コアの曲がった側面ピースを両端にホットボンドで取り付けます。

ステップ5
次に ライトディバイダー(遮光板) と発泡コアの トップピース を取り付けます。ライトディバイダーはアニメーション用ライトが建物に漏れるのを防ぎ、逆も防ぎます。大きいディバイダーをLEDホルダーの折り目近くに、小さいディバイダーをその上に配置し、間に少なくとも1つLEDが入るようにします(写真参照)。トップピースを底板と直角になるよう配置し、ホットボンドで固定します。





ステップ6
LEDストリップの末端を前面上部エッジにホットボンドで固定し、ストリップの最後のLEDがシーン全体を照らせるようにします。これがメインシャドー用LEDです。


パート3: Arduino 101のプログラミングとBlynk設定
USBプログラミングケーブルをArduino 101に接続し、LEDストリップ、電池ボックス、Arduino 101をすべて接続します(電池ボックスのスイッチは「オフ」のまま)。
Arduino IDE がPCにインストール済みで、Intel Curieコアが導入済みであること(Arduino 101入門ガイド参照)。さらに Adafruit NeoPixelライブラリ と Blynkライブラリ をインストールしてください。
Arduino初心者の方は、基本的なサンプルスケッチを動かしてすべて正常に動くか確認することをお勧めします。
ステップ1
スマホにBlynkアプリをインストールします。
Blynkは迅速なプロトタイピングとArduino 101のリモート制御に最適なツールです。BLEサポートにはまだバグがありますが、Arduino 101プロジェクトをスマホから制御する最速の方法です。
ステップ2
サンプルコードをArduino IDEで開き、先ほど作成したマップに合わせてLEDピクセル番号を必要に応じて変更します。
プログラムは "pos[ ]" 配列のLED番号を順にアニメーションさせて「降る雪」の錯覚を作ります。あなたのセットアップに合わせてこれらの番号を変更してください(アニメーション用LEDはLEDホルダーの折り目より下にあるものです)。点灯させたい順序で番号を並べます。ライトはピンホールを通って「雪」になるため、下から上へ点灯させれば雪が降って見え、左から右へなら右から左へ雪が吹くように見えます。
// 雪アニメーション用ライト
int pos[] = {0, 1, 2, 20, 21, 22, 40, 41, 42};
// アニメーション用ピクセル数
int numLeds = 9;
// ストランド末端のメインシャドー投影用LED (60ピクセルストリップなら #59)
int shadowPixel = 59;
// 奥の家を照らすピクセル (2つのライトディバイダーの間にあるはず)
int lightHousePixel = 23;
// 手前の家を照らす「炎ピクセル」 (小さいライトディバイダーのすぐ手前)
int firePixel = 24;
上記を必要に応じて修正したら、コンパイルしてArduino 101にアップロードします。アップロード成功後、USBケーブルを外し、電池ボックスのスイッチを「オン」にします。shadowPixelが点灯し、アニメーションピクセルが順番に光ります。家と炎のピクセルはBlynkで操作するまで消灯したままです。
ステップ3
Blynkアプリの読み込み:
スマホでBlynkアプリを開き、右上の「スキャン」ボタンを押します。下記QRコードをスキャンするとコントローラーインターフェースが自動的に読み込まれます。

読み込まれたインターフェースは以下のようになります:

手動でインターフェースを作りたい場合は、BLEウィジェットと、0-100をV0、V1、V2に出力するスライダー3つで始めてください。
ステップ4
Arduino 101とBLE接続します。 BLEウィジェットをタップし、Arduino 101の電源が入っていれば「ShadowTheatre」が表示されます。接続後、右上の「再生」矢印アイコンをタップしてプロジェクトを制御します。スマホがスリープした後は再接続が必要な場合があります。
難しい作業は以上です。あとはクラフト作業! 最終完成まで電源を切っておいてもOKです。
パート4: 厚紙シルエット、建物、仕上げ
ステップ1
印刷した厚紙4枚を用意します。ホビーナイフと新しい刃で背景シルエットを切り抜きます。刃はこまめに交換! 切れ味が悪いと非常にストレスです。このシルエットを切るのに3回刃を交換しました。





ステップ2
家のパーツを切り抜き、裏面をホットボンドで貼り合わせます。印刷面は背面側(観客から見えない側)にします。以下の写真をスクロールして確認してください。





ステップ3
家をステージに設置します。ホットボンドまたはテープで固定。光が家の中に入りつつ、横から漏れないよう隙間を塞ぎます。



ステップ4
シルエットシートの側面を折り、底辺をステージ背面エッジにホットボンドで固定します(印刷面は観客側と反対に)。


ステップ5
壁に投影する雪景色を切り抜きます。ピンや爪楊枝で穴を開けたり、複雑な形を切り抜いたりします。完成したら、曲がったエッジにホットボンドで貼り付けて投影面を作ります。


ステップ6
左側面と前面シートをホットボンドで固定します。


右側面シートはテープで緩く固定し、内部の電池ボックススイッチで電源オン/オフできるようにします。

完成! 暗い場所で壁の近くに置いて試してみましょう! 電源を入れると、シーンの影と降る雪が投影されます。Blynkアプリでメインライトと建物のライトを制御できます。
コード
- Shadow Theater Arduino Sketch
Shadow Theater Arduino Sketch (Arduino)
このスケッチはAdafruit NeoPixelライブラリとBlynkライブラリを使用します。アドレサブルLEDストリングのLEDをリモート制御して、シャドーシアターの効果を作り出します。
/* Copyright (c) 2016 Intel Corporation. All rights reserved. See license notice at end of file. */
/////////////////////// 以下の変数をあなたのシャドーシアターセットアップに合わせて変更してください //////////////////////////////////////////
// 雪アニメーション用ライト
int pos[] = {0, 1, 2, 20, 21, 22, 40, 41, 42}; // アニメーションに使うLED。左から右へ順に呼び出されます。
int numLeds = 9; // 上記配列のアニメーションピクセル数
int shadowPixel = 59; // ストランド末端のメインシャドー投影用LED
int lightHousePixel = 23; // 奥の家のライト用ピクセル
int firePixel = 24; // 手前の家の揺らめく炎用ピクセル
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <Adafruit_NeoPixel.h>
#include <BlynkSimpleCurieBLE.h>
#include <CurieBLE.h>
#define PIN 6
int v0 = 0; // Blynkからの入力値を保持する変数
int v1 = 0;
int v2 = 0;
int fadeup = 0; // ライトアニメーション滑らか化用変数
int fadedown = 0;
int firetimer = 0; // 炎の揺らめき用変数
int fireinterval = 50;
int flicker = 0;
unsigned long lightcounter = 0; // アニメーションライトを永遠にカウントする変数
int stp = 0; // アニメーションステップ。現在のライトを点灯、前のライトを消灯用
int stpOld = 0;
unsigned long timer = 0;
int interval = 0;
char auth[] = "YourAuthToken"; // Auth Tokenは現在BlynkのBLEでは未使用。将来有効になる場合、Blynkアプリから取得して "" 内に貼り付け。
BLEPeripheral blePeripheral; // BLE接続設定
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); // ライトストリップ設定。60ピクセル以外の場合は最初の数字を変更。
void setup() {
delay(1000);
timer = millis();
strip.begin();
strip.show(); // 全ピクセルを「オフ」で初期化
blePeripheral.setLocalName("ShadowTheatre");
blePeripheral.setDeviceName("ShadowTheatre");
blePeripheral.setAppearance(384);
Blynk.begin(auth, blePeripheral);
blePeripheral.begin();
interval = 350; // 雪アニメーション間隔 350ms
}
void loop() {
Blynk.run(); // Blynkリアルタイム制御
blePeripheral.poll();
//////// メインシャドーピクセル点灯とBlynk制御
strip.setPixelColor(shadowPixel, 200 - v2, 160 - v2, 160 - v2); // シャドーライト点灯、v2 (Blynkアプリから) で明るさ変更
// 炎の揺らめき
if ((millis() - firetimer) > fireinterval) {
firetimer = millis();
flicker = random(0, 40); // 設定時間ごとに炎の明るさを0-40でランダム変更
}
if (v0 > 1) {
strip.setPixelColor(firePixel, 80 + v0 + flicker, v0 + flicker, 0); // 炎 = Blynkスライダーの明るさ + 揺らめき値、赤寄りに重み付け
} else {
strip.setPixelColor(firePixel, 0, 0, 0); // Blynkスライダーが0より大きい時のみ炎点灯
}
// 家のライト
if (v1 > 1) {
strip.setPixelColor(lightHousePixel, 200 - v1, v1, 0); // Blynkの家ライトスライダー >0 なら奥の家のライト制御、 else 消灯
} else {
strip.setPixelColor(lightHousePixel, 0, 0, 0);
}
// 雪アニメーション
if ((millis() - timer) > interval) {
stpOld = stp;
timer = millis();
lightcounter++;
stp = (lightcounter % numLeds); // 0 から numLeds-1 を繰り返しカウント
fadeup = 0; // インターバルごとにフェード値リセット
fadedown = 170;
}
fadeup += 2;
fadeup = constrain(fadeup, 0, 170);
fadedown -= 2;
fadedown = constrain(fadedown, 0, 170);
for (int i = 0; i < numLeds; i++) {
strip.setPixelColor(pos[i], 0, 0, 0); // 全アニメーションLED消灯
}
strip.setPixelColor(pos[stp], fadeup, fadeup, fadeup); // 選択ピクセルを現在の「fadeup」値で点灯
strip.setPixelColor(pos[stpOld], fadedown, fadedown, fadedown); // 前ピクセルを現在の「fadedown」値で点灯
strip.show(); // 現在の色値をすべてLEDストリップに送信して表示
}
// Blynkから新しい信号が来たとき、グローバル変数 v0, v1, v2 を更新
BLYNK_WRITE(V0) // 暖炉スライダーウィジェットがピン V0 に書き込み
{
v0 = param.asInt();
}
BLYNK_WRITE(V1) // 家ライトスライダーウィジェットがピン V1 に書き込み
{
v1 = param.asInt();
}
BLYNK_WRITE(V2) // メインシャドーLEDスライダーウィジェットがピン V2 に書き込み
{
v2 = param.asInt();
}
////////////////////////////////////////////////////////////////////////////////////////////
/* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
回路図・パターン
- 発泡コアカット用パターン:普通紙に印刷してガイドとして使用。上に置いてホビーナイフでなぞって転写。
- 厚紙用パターン:A4厚紙4枚に印刷。家、側面、シャドーシルエットを作成。
- レーザーカッター/ビニールカッターをお持ちの方用:SVGファイルで厚紙パーツをカット可能。
30bn6Le68V1Lpp2spRMw.svg
製造プロセス
- ホリデーライトの進化と職人技:古代伝統から現代エンジニアリングへ
- 発光ダイオード(LED):誕生から100年寿命へ
- Arduinoで「棺桶ダンス」メロディーを再現するプロジェクト
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- DIYクラウドコスチューム: LEDストリップ、Arduino Nano & SparkFunパーツで光る雲に
- Arduino Megaで作る美しい5x5x5 LEDキューブ
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- スマートArduino水筒:リアルタイム監視とアラート機能付き
- 音声反応型 8 LED ライトディスプレイ
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト