DIY万華鏡インフィニティミラー - Arduino 101で作る美しいLEDライトディスプレイ
必要なパーツと用品
| パーツ | 数量 | 備考 |
|---|---|---|
| Arduino 101 | 1 | |
| 1m アドレサブル非防水LED (60個) | 1 | このSparkFun版は本プロジェクト向けに配線済み。Adafruit NeoPixel等も使用可能 |
| 単芯ワイヤーまたはジャンパーピン (短め) | 1 | より線をArduinoピン対応にするため |
| ヒートシュリンクチューブ | 1 | お好みで |
| バレルジャック メス コネクタ (ネジ端子付き) | 1 | |
| バレルジャック オス コネクタ (ネジ端子付き) | 1 | |
| 単3電池ホルダー (スイッチ付き) | 1 | |
| Pololu 昇圧レギュレータ | 1 | この$4のレギュレータで、単3電池3本1パックからプロジェクト全体に給電可能。省略して9V電池でArduino 101を駆動することも可能。その場合はLED用に別途単3電池パックが必要。詳細は Adafruit NeoPixel Uberguide 参照 |
| 単3電池 | 1 | |
| 12インチ角「シャドーボックス」額縁 | 1 | この額縁の深さとサイズが最適 |
| 12インチ角ミラー | 1 | 額縁の裏側に収まるサイズ |
| 11インチ フォトイーゼル | 1 | 完成品の展示用 |
| ミラー調プライバシーティンティングフィルム | 1 | オプション - 効果が大幅に向上するが、必須ではない |
| フォームコアボード | 1 | 標準 3/16インチまたは 1/4インチ。白を使用したが黒も良いかも。12×12インチ1枚分 + 1m長×0.5インチ幅のストリップを作る分の量 |
必要な工具と機械
- ハンダゴテ (汎用)
- カッターナイフ (新しい刃)
- グルーガン (汎用)
- ワイヤーストリッパー
使用するアプリとオンラインサービス
- Arduino IDE - Adafruit NeoPixelライブラリ が必要。Arduino 101初心者の場合は、Curie Core のインストールも必要 (位置センサーアクセス用)
プロジェクト概要
万華鏡とインフィニティミラーを融合させた作品です。ミラーの回転角度に応じてライトが変化します。市販のミラーと額縁、いくつかのパーツで構築します。Arduino 101開発ボードには内蔵の位置センサーがあり、これを使って角度を検知し、ライト表示を制御します。
注意: このプロジェクトは「Holiday Shadow Theater」と同じ電子回路構成です。基本的にArduino 101、LEDストリップ、バッテリーパックのみ。$4の電圧レギュレータを使って同じバッテリーパックでLEDとArduino 101の両方に給電しています。レギュレータを省略して9V電池でArduinoを駆動することも可能です。
パート1: ミラーの製作
ステップ1
鋭いカッターナイフやホビーナイフで、12×12インチのフォームコアボードを切り出し、鉛筆で中心をマークします。額縁の裏段ボールを参考にできます。

ステップ2
コンパスや糸と鉛筆を使って、12×12インチの中心に半径5.25インチの完全な円を描きます。定規で12×12インチの端から0.75インチの位置に印をつけ、そこを基準点にできます。
ステップ3
新しい刃のカッターナイフやホビーナイフで、慎重に円を切り抜きます。この切り口が最終製品で見えるため、できるだけ綺麗に切ってください。

ステップ4
穴を切り抜いたら、より綺麗な面を選んで、それを下にして清潔な作業面に置きます。
ステップ5
別途、幅0.5インチ、長さ約36インチのフォームコアストリップを切り出します。短いセグメントをテープで繋げても構いません。定規を使って、幅をできるだけ均一な0.5インチに保ってください。

ステップ6
完成したストリップをテーブルに水平に置き、全長にわたって2インチごとに表面の紙だけを垂直に切り込み(スコア)を入れます。

ステップ7
ストリップを裏返し、ホットグルーでLEDストリングをフォームコアストリップの長さに沿って貼り付けます。

ステップ8
ステップ6で入れたスコアを折り曲げポイントとして、完成したストリップを大まかな円形に曲げます。

ステップ9
LEDストリップをリング状にして、12×12インチフォームコアの穴の上に置きます。LEDストリップ全長だと長すぎます。穴より少し大きいサイズにリングを調整し、余分なLED(約6個分)をカットします。余ったLEDは別のプロジェクトで再利用可能です。

ステップ10
LEDリングを12×12インチボードの表面(悪い面)の穴の縁に沿ってホットグルーで固定します。LEDリングの背面が12×12インチボードの端から少なくとも0.25インチ内側にあることを確認してください(そうしないと額縁の黒いプラスチックスペーサーが回りきれません)。



ステップ11
半透明ミラーフィルムを使用する場合、シャドーボックス額縁からガラスを取り出し、メーカーの指示に従ってフィルムを貼ります。これが最も手間のかかるステップでした。まずガラスを綺麗にし、水(または石鹸水)を使って気泡を取り除きやすくします。ミラーフィルムを使うとイリュージョン効果が強くなり、LEDが隠れますが、必須ではありません(後から追加も可能)。フィルムを貼ったら、フィルム面を上/内側にして額縁に戻します。
ステップ12
額縁を下向きにし、ガラスを綺麗にした状態で、フォームコアをガラスの上に置きます(綺麗な面を下、LEDリングを上)。額縁付属のスペーサーを2個入れ、さらに12×12インチミラーを表面を下にして重ねます。LEDの配線はミラーの後ろから額縁の外へ出します。ミラーのフィットがきつくて配線が通らない場合、カッターナイフで額縁の端に配線用の切り欠きを慎重に彫ってください。


スペースがあれば段ボールの裏板を入れ、なければ額縁のタブでミラーを固定します。これでミラー部分は完成。次は電子工作の魔法です。
パート2: 電子回路のセットアップ
ステップ1
先ほどカットした余分な6個分のLEDを用意。端のハーネスを、ライトから約1cmの位置でカットし、ワイヤー端をストリップします。

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

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

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

次に、ミラー裏側から出ているLEDストリップ始端のルーズなワイヤーに、メス側バレルジャックアダプタを接続。このストリップでは黄色が(-)端子、赤が(+)端子です。
ステップ5
ハーネスをArduino 101に接続。緑のワイヤーをピン6、黄色のワイヤーを#13付近のGNDピンに。
昇圧レギュレータの2本のヘッダーピンでは、GNDをGND、VOUTをArduino 101の「Vin」ピンに接続。これを間違えないでください!逆に挿すと焦げ臭くなり、基板が焼けます。経験済みです。


ステップ6
Arduino 101側とLEDストリップ側のワイヤーハーネスを接続し、バッテリーパックのバレルジャックをLEDストリップのバレルジャックに接続。配線完了!
ステップ7
電子工作が完了したら、Arduino 101をミラーの裏側に、ミラーのいずれかの辺と平行になる向きで配置。ベルクロ、両面テープ、またはホットグルーで固定。バッテリーパックも近くに固定し、ルーズなワイヤーはテープやグルーで固定。
コンピュータ、USBケーブル、Arduino IDEを使ってサンプルコードをアップロード。または、Arduino Web Editorでコードにアクセス、編集、アップロードすることも可能。
試してみよう!

サンプルコードは、Intel Curieコンピュートモジュール内蔵の加速度計から読み取ったミラーの角度に基づいてLEDの色を変化させます。現在、1つの位置では全ライトが消灯し、もう1つの角度では最後に使用した色でチェイシングライト効果が出ます。コードを自由に変更して、クレイジーな照明効果を作ってみてください。Adafruit NeoPixel Uberguide が良いスタート地点になります。
重要! このミラーを常設設置する場合、バッテリーパックの代わりにプラグイン電源を使えますが、出力が3.5V〜5Vであることを確認してください!より高い電圧(9V角型電池など)はLEDストリップを過負荷にする可能性があります。
コード
Arduino 101 インフィニティミラー スケッチ
Arduino 101内蔵加速度計から角度を読み取り、NeoPixel LEDストリップの色を制御するシンプルなスケッチ。
/* Copyright (c) 2016 Intel Corporation. All rights reserved. See license notice at end of file. Arduino 101 "Infinity Mirror." The rotation angle of the Arduino 101 changes the lights in a Neopixel strip. This code uses the Adafruit Neopixel library. Library installation instructions here: https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation If using the desktop version of the Arduino IDE, make sure you have the latest Intel Curie Core installed. For more info, visit https://www.arduino.cc/en/Guide/Arduino101 */ #include "CurieIMU.h" #include#define PIN 6 Adafruit_NeoPixel strip = Adafruit_NeoPixel(54, PIN, NEO_GRB + NEO_KHZ800); int tr = 0, tg = 0, tb = 0; int r = 0, g = 0, b = 0; int rawX = 0, rawY = 0; float angle = 0.0; void setup() { CurieIMU.begin(); CurieIMU.setAccelerometerRange(2); strip.begin(); strip.show(); } void loop() { rawX = CurieIMU.readAccelerometer(X_AXIS); rawY = CurieIMU.readAccelerometer(Y_AXIS); int rawZ = CurieIMU.readAccelerometer(Z_AXIS); angle = atan2(rawX, rawY); if (abs(angle) > 2.5) { tr = 0; tg = 0; tb = 0; runlights(); } if ((angle > 1.5) && (angle < 2.5)) { tr = 100; tg = 100; tb = 100; runlights(); } else if ((angle < 1.5) && (angle > 0.5)) { tr = 100; tg = 0; tb = 0; runlights(); } else if ((angle < 0.5) && (angle > -0.5)) { tr = 0; tg = 100; tb = 0; runlights(); } else if ((angle < -1.5) && (angle > -2.5)) { tr = 0; tg = 0; tb = 100; runlights(); } else if ((angle < -0.5) && (angle > -1.5)) { theaterChase(); } else { tr = 0; tg = 0; tb = 0; runlights(); } } void runlights() { if (tr > r + 1) r++; if (tg > g + 1) g++; if (tb > b + 1) b++; if (tr < r) r--; if (tg < g) g--; if (tb < b) b--; for (int i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, r, g, b); } strip.show(); delay(10); } void rainbowCycle(uint8_t wait) { uint16_t i, j; for(j=0; j<256*5; j++) { for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } strip.show(); delay(wait); } } void theaterChase(){ for (int j = 0; j < 3; j++) { for (int q = 0; q < 3; q++) { for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, r, g, b); } strip.show(); delay(50); for (uint16_t i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, 0); } } } } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); }
ライセンス
このライブラリはフリーソフトウェアです。GNU Lesser General Public License version 2.1またはそれ以降のバージョンの条件に従って再配布および変更が可能です。詳細はGNU LGPLを参照してください。
製造プロセス
- 万華鏡:ブレッサーの科学から現代デザインへ
- 現代ミラーの科学と技術:古代から最新コーティングまで
- Infinity Gears:41段ギアボックスが実現する346京年分の回転
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 自作冷却ミラー式湿度計(チルドミラーヒグロメーター)──Arduinoで高精度な温湿度測定
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- インフィニティミラー時計:終わりなき美しさと正確な時刻の融合