DIY: Световой меч со звуком
Всем привет!
Мне с детства нравится вселенная Звездных Войн. Когда мне было 7 лет я столько раз пересматривал эпизоды 4–6, что мог в мельчайших подробностях пересказать их содержимое.
Бесспорно самые яркие впечатления от фильмов — битвы на световых мечах.
Два года назад я наткнулся в интернете на краткую статью о выборе реплики светового меча в подарок, заинтересовался и изучил эту тему в подробностях.
В конце года выходит 8 эпизод, 4 Мая не за горами и в предверии международного дня Звездных Войн я решил написать эту статью.
Под катом я поделюсь информацией о производителях световых мечей и расскажу о создании бюджетного меча со звуком на базе Arduino.
Сейчас в интернете существует много коммерческих производителей реплик световых мечей, самые достойные внимания на мой взгляд:
Genesis Custom Sabers — Очень качественные реплики на заказ, цена за элитный кастомный меч со звуком варьируется в районе 1500–3000 USD.
Saber Forge — большой выбор, цены более демократичные, но и реплики не столь аутентичны как в Genesis CS. Цена на меч со звуком около 300 USD.
Ultrasabers — один из самых гуманных магазинов в отношении цен. Меч с базовым звуком стоит около 160 USD. Можно заказывать отдельные составные части для своего проекта.
The Custom Saber Shop — сайт с магазином и конструктором для сборки своего меча.
Есть и другие производители реплик, например Makoto Tsai, который делает самые яркие световые мечи на базе самодельных светодиодных лент.
Но что делать если вам не хочется тратить много денег на покупку реплики, а световой меч очень хочется? Выход один — накопить 5,000 рублей и сделать меч самому.
На момент начала своего проекта опыта программирования у меня практически небыло, познания в электронике полностью отсутствовали. Возможно я сделал что-то не лучшим образом, но продолжаю учиться и буду рад вашим советам.
В описании процесса создания меча я постараюсь описать все основные сложности.
Итак, приступим. Вот список всего что я использовал:
- Arduino Pro micro 5v ~250 рублей на Ali
- Звуковой модуль WT588D-U ~250 рублей на Ali
- Step-up 3–5В ~100 рублей на Ali
- Динамик Ø28 мм, 8Ом, 2Вт ~40 рублей на Ali
- Акселерометр ADXL335 ~200 рублей на Ali
- N-MOSFET IRF530N x2 ~40 рублей на Амперке
- Светодиод Luxeon rebel 3Вт ~70 рублей на Ali
- Линза для светодиода 8° ~50 рублей на Ali
- Аккумулятор CR123A х2 3.7В ~400 рублей на Ali
- Батарейка Крона 9в для питания Arduino
- Держатель для аккумулятора ~15 рублей на Ali
- Антивандальная кнопка ~100 рублей на Ali
- Тумблер ~50 рублей на Ali
- Белая поликарбонатовая трубка 1» ~800 рублей в Москве (магазинов много, они есть в гугле)
- Труба ПВХ для изготовления рукояти
Вам так же понадобятся провода, винт для фиксации поликарбонатовой трубы в рукоятке и колпачок для поликарбонатовой трубки с отражателем.
Колпачок с отражателем я заказывал в Custom saber shop от стоит там 7 долларов, доставка для малогабаритных товаров стоит 14 долларов.
Еще нужно будет где-то раздобыть звуки для меча, обычно это набор из звуков включения/выключения, шума работы (hum), звуки взмахов (swing), звуки столкновений (clash).
Я покупал набор звуков на сайте Saberfont за 7 долларов, но я уверен что можно найти бесплатные звуки.
Итого по компонентам выходит около 5,000 рублей если покупать звуки, если нет, то в районе 4,000.
Существует два основных вида подсветки «лезвия» — один мощный светодиод у основания поликарбонатовой трубки, свет которого отражается колпачком на конце трубки и второй тип — самодельная сегментированая светодиодная лента. Сегменты нужны для плавного включения меча, как в фильмах.
К примеру, Makoto в своих самых ярких мечах использует несколько сегментированных лент.
Я рекомендую использовать для первого билда один мощный светодиод, это гораздо проще и достаточно ярко.
Хочу сразу сказать, что мечи на видео выглядят ярче чем в жизни, т.к. матрица камеры накапливает свет в отличие от наших глаз. Не ждите что ваш меч будет светится как в фильмах.
Предлагаю начать сборку прототипа с настройки звука.
Самое сложное в проекте было разобраться со звуком, модуль WT588D в моем случае оказался идеальным вариантом, т.к. он обеспечивает непрерывное воспроизведение звуковых файлов, для него не требуется флешка.
Перед загрузки файлов на WT, мне пришлось их немного отредактировать, для этого можно использовать бесплатную программу Audacity.
Нужно по очереди открыть каждый файл, выделить область со звуком (у меня в конце каждого файла было по несколько секунд тишины), в левом нижнем углу экрана нужно задать частоту от 16000 до 22000 Khz. Если частота более 22000, WT не даст загрузить файл. Далее Export selected — 16 bit.
Для загрузки файтлов на WT588D, вам понадобится программа для загрузки звуков от производителя модуля — Waytronic (работает только под Windows, я запускал на MAC через BootCamp).
Нужно запустить ПО и выбрать в настройках English.
В WT588D существуют несколько режимов работы, я выбрал One-line mode, т.к. он требует минимума пайки, модуль обменивается данными с Arduino через один пин.
Рабочее поле разделено на 3 части, слева — список загруженных на модуль файлов, по середине — список плейлистов, справа — список файлов в плейлисте.
Для загрузки файлов нужно щелкнуть правой кнопкой мыши по списку загруженных файлов и выбрать Load — найти и выбрать обработанный в Audacity звуковой файл. Повторить для всех файлов.
Далее нужно составить плейлисты, добавив много повторяющихся звуков шума работы после звука включения и звуков взмахов/столкновений. Это нужно для того, чтобы не писать код для переключения на шум после включения/взмахов.
Номера плейлистов мы будем вызывать далее в нашем скетче.
После загрузки звуков и подготовки плейлистов нужно подключить питание к WT, подключить динамик, и соединить Data пин WT c Arduino. Так же подключить к Arduino кнопку для включения/выключения света/звука и светодиод через MOSFET.
Вот моя схема подключения:
Я питаю WT от отдельного аккумулятора 3.7В через MOSFET, используя step-up до 5.5в, в таком случае получаю максимальную громкость на выходе.
Для начала нужно прописать все что будет использовано в скетче:
#define WT588D_SDA 8 //прописываем номер пина к которому подключен WT588D
//прописываем пины для акселерометра и переменные для хранения значений времени
const int xpin = A0;
const int ypin = A1;
const int zpin = A2;
int oldtime;
int newtime;
int ADXL = 3;
int BUTTON_PIN = 7; //кнопка включения и выключения меча
int LED_PIN = 9; //MOSFET светодиода
int WT_MOSFET = 6; //MOSFET WT588D
int i = 0;
byte file_count = 1;
bool saberon;
bool swingsound;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(ADXL, OUTPUT);
pinMode(WT_MOSFET, OUTPUT);
pinMode(WT588D_SDA, OUTPUT);
digitalWrite(ADXL, LOW);
digitalWrite(LED_PIN, LOW);
digitalWrite(WT588D_SDA, HIGH);
digitalWrite(WT_MOSFET, LOW);
saberon = false;
swingsound = false;
oldtime = analogRead(xpin) + analogRead(ypin) + analogRead(zpin); //первое считывание показания акселерометра
}
Для работы WT, в скетче нужно декларировать комманду WT_Send_Command (*), для этого добавьте в конец скетча следующий код:
void WT588D_Send_Command(byte addr) {
digitalWrite(WT588D_SDA, LOW);
delay(100);
for (int i = 0; i < 9; i++) {
digitalWrite(WT588D_SDA, HIGH);
if (bitRead(addr, i)) {
delayMicroseconds(600);
digitalWrite(WT588D_SDA, LOW);
delayMicroseconds(200);
} else {
delayMicroseconds(200);
digitalWrite(WT588D_SDA, LOW);
delayMicroseconds(600);
}
}
digitalWrite(WT588D_SDA, HIGH);
delay(50);
}
Следующим шагом нужно написать код для того чтобы при нажатии кнопки, включался светодиод и проигрывался плейлист со звуком включения. При нажатии кнопки еще раз, светодиод выключался и играл плейлист выключения.
Если опыта программирования у вас нет, для лучшего понимания кода, рекоммендую ознакомиться со следующими материалами:
• Arduino If tutorial
• Arduino Boolean tutorial
• Arduino Button tutorial
Вот мой код для распознавания состояния кнопки и включения/выключения эффектов:
if (digitalRead(BUTTON_PIN) == LOW) {
if (saberon) {
WT588D_Send_Command(*номер плейлиста со звуком выключения);
delay(700);
saberon = false;
{
analogWrite(LED_PIN, LOW);
delay(1);
}
} else {
digitalWrite(WT_MOSFET, HIGH);
delay(100);
WT588D_Send_Command(*номер плейлиста со звуком включения);
{
analogWrite(LED_PIN, HIGH);
delay(1);
}
saberon = true;
}
}
Если все сделано правильно, вы должны при нажатии кнопки слышать звук включения и шума, светодиод должен включаться. При повторном нажатии, звук выключения и светодиод должен гаснуть.
Основная часть скетча готова, теперь подключим акселерометр и заставим WT воспроизводить звуки взмахов.
ADXL335 достаточно простой в использовании, для него не нужно подключать какие-либо библиотеки. Вот схема подключения:
Для работы акселероментра мы будем делать два замера и на основе сравнения показаний проигрывать звук взмаха.
Акселерометр я рекоммендую размещать как можно ближе к одному из концов рукоятки.
newtime = analogRead(xpin) + analogRead(ypin) + analogRead(zpin);
delay (100);
if (newtime - oldtime >= 75 || newtime - oldtime <= -75)
{
if (swingsound)
{
swingsound = false;
delay (50);
}
else
{
swingsound = true;
WT588D_Send_Command(*номер плейлиста со звуком взмаха);
delay (150);
}
}
Serial.print(oldtime);
Serial.print("\t");
Serial.print(newtime);
Serial.print("\t");
Serial.print(newtime - oldtime);
Serial.println();
oldtime = newtime;
Все, прототип готов.
Пора создать рукоять и поместить в нее всю начинку.
Рукоятку я делал из ПВХ трубы, вставка для лезвия диаметром: 28 мм.
С рукояткой у меня возникли проблемы, в итоге первая версия оказалась слишком маленькой, сейчас делаю новую.
В изготовлении рукояти из ПВХ вы ограничены только вашей фантазией, могу лишь дать один совет — перед покраской обработайте поверхность трубы мелкой наждачкой, иначе краска будет плохо держаться.
Вот первый вариант моей рукояти, в крышке я высверлил отверстия и разместил динамик, а лезвие фиксируется в трубе четырьмя винтами:
Я не включал в свой меч эффект столкновений (clash), возможно наверстаю в следующий раз. Но если вы захотите включить clash, вам понадобится датчик вибрации или настройка акселерометра под распознавание коротких ускорений. Если у кого-то получится настроить акселерометр, не поленитесь поделиться кодом, я включу его в статью с упоминанием вас как автора.
Вот небольшой тест меча ночью на улице:
Я уверен, что Geektimes читает большое количество очень талантливых и умелых людей, прошу вас, поделитесь своим мнением, дайте совет. Возможно что благодаря коллаборации мы сможем еще больше упростить/оптимизировать процесс.
Обязательно делитесь своими результатами, очень интересно посмотреть что получится у вас!
Всем спасибо за внимание! И да прибудет с вами сила!