DIY Калейдоскоп-бесконечное зеркало: потрясающий LED-дисплей
Компоненты и материалы
- Arduino 101 — 1 шт.
- Адресуемая LED-лента (1 м, 60 светодиодов) — 1 шт. (подойдет SparkFun, Adafruit NeoPixel или аналоги)
- Твердой провод или джамперы для подключения к пинам Arduino — 1 комплект
- Термоусадочная трубка (опционально) — 1 шт.
- Розетка Jack (female) с винтовыми клеммами — 1 шт.
- Вилочка Jack (male) с винтовыми клеммами — 1 шт.
- Короб для 3-х батареек AA с выключателем — 1 шт.
- Повышающий регулятор напряжения Pololu (5V) — 1 шт. (позволяет питать всё от одного короба с 3х АА; альтернатива — 9V батарея «Крона» для Arduino + 3х АА для ленты)
- Батарейки AA — 3 шт.
- Рама для фотографий «shadow box» 12×12 дюймов — 1 шт.
- Зеркало 12×12 дюймов — 1 шт.
- Настольный подставка для фото 11 дюймов — 1 шт.
- Зеркальная тонирующая пленка (опционально, но сильно улучшает эффект) — 1 шт.
- Пенопласт (FoamCore) 3/16″ или 1/4″ — достаточно для основы 12×12 дюймов и полосы 1 м × 0.5″
Инструменты
- Паяльник
- Канцелярский нож с новой лезвией
- Клеевой пистолет
- Обкусачи/зачиска для проводов
Программное обеспечение
- Arduino IDE (требуется библиотека Adafruit NeoPixel и ядро Curie для Arduino 101)
О проекте
Это кросс между калейдоскопом и бесконечным зеркалом! При вращении зеркала меняется цветовая гамма подсветки. Проект построен на готовых зеркале и рамке, а также на плате Arduino 101 со встроенным акселерометром/гироскопом (Intel Curie), который определяет угол наклона и управляет лентой.
Важно: Электроника аналогична проекту «Holiday Shadow Theater» — Arduino 101, LED-лента, батарейный блок. Повышающий регулятор за $4 позволяет питать всё от одного короба с 3х АА. Можно обойтись без регулятора, используя 9V батарею для Arduino.
Часть 1: Сборка зеркала
- Вырежьте из пенопласта квадрат 12×12 дюймов, отметьте центр.
- Начертите идеальный круг радиусом 5.25″ в центре.
- Аккуратно вырежьте круг острым ножом — этот край будет виден в конечном изделии.
- Выберите лучшую сторону, положите её вниз на чистую поверхность.
- Вырежьте полосу пенопласта шириной 0.5″ и длиной ~36″ (можно склеить из кусков).
- На полосе сделайте вертикальные надрезы каждые 2″ (не режьте насквозь) — это позволит согнуть её в круг.
- Переверните полосу, приклейте горячим клеем LED-ленту вдоль всей длины.
- Согните полосу в круг по надрезам.
- Положите кольцо из ленты в вырезанное отверстие. Лента будет длиннее — подрежьте лишнее (~6 светодиодов), чтобы кольцо было чуть больше отверстия.
- Приклейте кольцо к плоской стороне квадрата (той, что вверху), прижимая к краю отверстия. Оставьте зазор ~0.25″ от края квадрата для пластиковых 스페йсеров рамы.
- Опционально: наклейте зеркальную пленку на стекло рамы по инструкции (очистите стекло, используйте мыльный раствор для удаления пузырей). Пленка создает более сильный эффект и скрывает светодиоды. Стекло вставляйте в раму пленкой вверх.
- Раму положите вниз стеклом. На стекло положите пенопластовую основу «хорошей» стороной вниз (LED-кольцо вверх). Добавьте два 스페йсера из комплекта рамы, затем зеркало лицевой стороной вниз. Провода должны выходить за рамой. Если зеркало слишком плотно сидит — аккуратно вырежьте паз для проводов в крае рамы.
- При необходимости добавьте картонную подкладку из комплекта или зафиксируйте зеркало защелками рамы. Механическая часть готова!
Часть 2: Электроника
- Возьмите отрезанные 6 светодиодов с конца ленты, отрежьте шлейф с запасом ~1 см, зачистите концы проводов.
- Распаяйте гнутые пины с регулятора напряжения, припаяйте два из них к зеленому и желтому проводам ленты (для удобного подключения к пинам Arduino).
- Красный провод ленты припаяйте к входу VIN регулятора. В GND и VOUT регулятора впаяйте прямые пины.
- Подключите короб для батареек к male-джеку: красный на (+), черный на (-).
- Подключите female-джек к проводам входа ленты (выходят из-за зеркала): желтый на (-), красный на (+).
- Соедините всё с Arduino 101:
- Зеленый провод (данные ленты) → Pin 6
- Желтый провод (GND ленты) → GND рядом с pin 13
- GND регулятора → GND Arduino
- VOUT регулятора → Vin Arduino (не перепутайте!)
- Соедините джеки: батарейный блок → female-джек ленты. Всё подключено!
- Закрепите Arduino 101 на задней стороне зеркала (орентация параллельно любой стороне) на липучке/двустороннем скотче/клее. Батарейный блок рядом, провода зафиксируйте. Загрузите скетч через USB и Arduino IDE (или Web Editor).
Проверка: При вращении зеркала цвета меняются в зависимости от угла. В одном положении — выключено, в другом — «бегущие огни» последнего цвета. Код открыт для модификаций.
Важно для постоянной установки: Можно использовать блок питания 3.5–5V вместо батареек. Напряжение выше 5V (например, 9V «Крона») может сжечь ленту!
Код (основной скетч)
/* Copyright (c) 2016 Intel Corporation. All rights reserved.
Arduino 101 "Infinity Mirror."
Rotation angle changes Neopixel strip colors.
Uses Adafruit Neopixel library.
Install Curie Core for Arduino 101: https://www.arduino.cc/en/Guide/Arduino101
*/
#include "CurieIMU.h"
#include <Adafruit_NeoPixel.h>
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(54, PIN, NEO_GRB + NEO_KHZ800);
int tr = 0, tg = 0, tb = 0; // target color
int r = 0, g = 0, b = 0; // current color
int rawX = 0, rawY = 0;
float angle = 0.0;
void setup() {
CurieIMU.begin();
CurieIMU.setAccelerometerRange(2); // 2g
strip.begin();
strip.show(); // all off
}
void loop() {
rawX = CurieIMU.readAccelerometer(X_AXIS);
rawY = CurieIMU.readAccelerometer(Y_AXIS);
int rawZ = CurieIMU.readAccelerometer(Z_AXIS);
angle = atan2(rawX, rawY); // -3.14 to 3.14 radians
if (abs(angle) > 2.5) { // pins down -> off
tr = tg = tb = 0; runlights();
}
else if (angle > 1.5 && angle < 2.5) { // white
tr = tg = tb = 100; runlights();
}
else if (angle < 1.5 && angle > 0.5) { // red
tr = 100; tg = tb = 0; runlights();
}
else if (angle < 0.5 && angle > -0.5) { // green
tr = tb = 0; tg = 100; runlights();
}
else if (angle < -1.5 && angle > -2.5) { // blue
tr = tg = 0; tb = 100; runlights();
}
else if (angle < -0.5 && angle > -1.5) { // theater chase
theaterChase();
}
else { // fallback
tr = tg = tb = 0; runlights();
}
}
void runlights() {
// smooth color transition
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);
}
// Theater chase with current color
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 += 3)
strip.setPixelColor(i + q, r, g, b);
strip.show(); delay(50);
for (uint16_t i = 0; i < strip.numPixels(); i += 3)
strip.setPixelColor(i + q, 0);
}
}
// Color wheel helper for rainbow
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);
}
Схема
Производственный процесс
- Калейдоскоп: от науки Брюстера к современному дизайну
- Наука и мастерство современных зеркал: от полированного металла к diéлектрическим покрытиям
- Infinity Gears: 41‑ступенчатый редуктор с периодом вращения 346 квинтиллионов лет
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- DIY зеркальный гигрометр на Arduino: точное измерение точки росы и влажности
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Бесконечное зеркало-часы: элегантный дизайн и точное время