Реактивный настольный светильник для звука Arduino
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Необходимые инструменты и машины
|
Приложения и онлайн-сервисы
|
Об этом проекте
ПРИВЕТ, МИР !!
Привет! В этой сборке мы сделаем красивый свет, который танцует под любые звуки и музыку, используя простые компоненты и некоторые базовые Arduino . программирование. Он производит потрясающий эффект, когда вы стоите на столе во время игр, воспроизведения музыки и всего остального, что действительно издает звук. Поехали!
Это проект, за которым я следую, основанный на написанном ими YouTube-канале "Natural Nerd". Это моя версия проекта. Вся заслуга им, и им большое спасибо за то, что они предоставили мне подробную информацию о том, как сделать проект.
Ссылка на Youtube
ШАГ 1. ОСНОВНЫЕ ТОВАРЫ
Перво-наперво:какие материалы нам нужны и сколько они стоят? Что ж, они в основном необязательны и могут быть сделаны с большой импровизацией. Тем не менее, если вы хотите следовать этому руководству, необходимы некоторые ключевые элементы:
- Arduino Nano (или любой другой такой же маленький тип Arduino) (ссылка для покупки за 12,50 малайзийских ринггитов)
- Модуль детектора звука (Ссылка для покупки за 5,90 малайзийских ринггитов)
- 5 вольт блок питания (или 12 В с модулем Stepdown)
- Индивидуально Адресный светодиод полосы 60 светодиодов на. метр (ссылка на покупку)
В зависимости от того, какой образ вам нужен, вы можете расположить полоски по-другому или по-другому рассеивать свет. Вот где вы можете проявить творческий подход. Если вам нравится мой подход, я использовал следующие элементы:
- Самая высокая банка IKEA Droppar (Ссылка IKEA)
- Небольшой отрезок трубы из ПВХ.
- Пенопласт
- Горячий клеевой пистолет
Учитывая все обстоятельства, я потратил около 83,30 малайзийских ринггитов в зависимости от магазина, в который вы ходите и покупаете товары, где светодиодные ленты были, безусловно, самой дорогой частью, которая стоила мне 40 малайзийских ринггитов всего за 1 метр.
ШАГ 2. ПОДКЛЮЧЕНИЕ КОМПОНЕНТОВ
Включение компонента будет прямым методом. Я просто использую USB-кабель Arduino Nano и подключаюсь напрямую к компьютеру. Если вы используете внешний источник питания, такой как источник питания переменного тока в постоянный, вам понадобится понижающий модуль, который поможет вам уменьшить величину тока, протекающего в вашей цепи. В противном случае, если вы его не используете, у вас может быть очень высокая вероятность сжечь Arduino, включая подключенные компоненты.
Гвоздь шоу - модуль детектора звука. Это обеспечит аналоговый сигнал для Arduino, который мы можем использовать (надеюсь) для умного освещения RGB-подсветки. Для этого нам нужно запитать оба устройства. К счастью, им обоим требуется входное напряжение 5 В. Я использую понижающий модуль для понижения напряжения с 12 до 5 вольт, но было бы проще напрямую использовать источник питания на 5 вольт. Подключите VIN на Arduino и на плате детектора звука к положительному входу. Затем подключите GND к Arduino и детектору к отрицательному. Посмотрите на черный и красный провода на прилагаемой схеме. Нам также необходимо подключить положительный и отрицательный вход светодиодной ленты к источнику питания.
ШАГ 3. ДЕТЕКТОР И ПОЛОСЫ
После подключения всех трех частей к источнику питания, нам нужно соединить их друг с другом.
Модуль детектора звука будет связываться с Arduino через аналоговые входные контакты. В этом случае я буду использовать контакт номер 0.
Светодиодные ленты нуждаются в цифровом импульсе, чтобы понимать, к какому светодиоду мы хотим обратиться. Следовательно, нам нужно подключить цифровой выходной контакт к Arduino nano. Я буду использовать пин №6.
Используйте термоусадочную трубку на выбранной области, чтобы кабели не сталкивались друг с другом в дальнейшем в ограниченном пространстве.
Просто следуйте схематической диаграмме, которую я предоставил здесь, и все будет в порядке!
Замечательно, теперь с электроникой в основном покончено!
ШАГ 4. ЗАГРУЗКА КОДА
Самой важной частью этой сборки, вероятно, будет код. Он может изменить эту сборку с довольно крутой до безумно крутой. Вы можете использовать код, который я предоставил вместе с этим проектом. Главный принцип - сопоставить аналоговое значение, которое мы получаем от датчика, с количеством отображаемых светодиодов.
ШАГ 5. ПОДГОТОВКА КОРПУСА
Сначала я подумал, что крышка сделана из акрила, после того как купила банку и поняла, что это не акрил, а стекло. Поэтому мне нужно скорректировать свой план, сделав крышку, в которую легко потянуть и установить Arduino и светодиод. Поэтому я выбрал пенопласт.
Первый шаг , мне нужно вырезать пенопласт, чтобы он был ровно круглым и имел такой же диаметр, как стеклянная крышка банки. У меня нет подходящих инструментов для измерения диаметра, поэтому я импровизирую метод, используя влажный маркер, отмечаю диаметр стекла и штампую его на листах бумаги. После этого я наклеиваю бумагу на пенопласт и доску, следуя краю круга на бумаге. Он не идеален, но должен быть достаточно хорошим, чтобы вмещать все компоненты Arduino и светодиоды.
Второй шаг , мне нужно разбить стекло о крышке банки. ВНИМАНИЕ! накройте банку толстым полиэтиленовым пакетом чтобы стекло не разлеталось по комнате и делалось это на открытом пространстве. Осведомленность о вашем окружении. После разбивания стекла убедитесь, что все стекла, прилипшие к боковой трещине крышки банки, должны быть удалены. Это сделано для того, чтобы вы или кто-то другой не порезался о застрявшее стекло.
Третий шаг Поместите пенопласт в форме круга в центр крышки банки. Убедитесь, что пена плотная и не слишком рыхлая, чтобы она хорошо ложилась на банку.
Четвертый шаг, Я просто понимаю, что мне нужно изменить макет этого проекта. Я хотел бы, чтобы пользователь мог легко получить доступ к компонентам Arduino в случае неисправности. Итак, я решил использовать мини-макет и поместил его в центре крышки. Мало того, я вырезал два отверстия для кабеля от звукового модуля, который я буду размещать в нижней части крышки банки, чтобы войти внутрь банки и на макетную плату, и еще одно отверстие для Arduino, чтобы подключить кабель USB для работы. в качестве источника питания схемы.
Шаг пятый , Помечаю ПВХ трубу малярным скотчем и провожу линию по центру ленты. Затем я прикрепляю его к трубе из ПВХ. Маркировка является индикатором того, что я разрезаю ПВХ трубу ровно и стараюсь иметь чистый разрез.
После измерения длины ПВХ, которую мне нужно использовать, я аккуратно отрезаю ее, следуя отметке, которую я предоставил. Длина трубы из ПВХ зависит от высоты вашей банки. Вы можете использовать любую длину, какую захотите.
Шестой шаг , я деформирую трубу из ПВХ, которую я разрезал, с помощью светодиодной ленты вокруг нее, и делаю ее слегка наклонной и идущей по спирали к верхней части ПВХ. Я делаю небольшое отверстие, чтобы спрятать лишнюю длину кабеля внутри емкости из ПВХ для укладки кабелей. Затем мне нужно найти способ поставить ПВХ на макетную плату. Используя термоклеевой пистолет или двусторонний скотч, я могу приклеить ПВХ-трубу к дополнительной пенопластовой плате, а затем приклеить ее к неиспользуемой области на макетной плате. На этом этапе я смог подключить некоторые компоненты к макетной плате.
Используйте предоставленную схематическую диаграмму, чтобы соединить все компоненты.
(Левая часть макета будет положительной, а правая часть макетной платы - отрицательной. '
На седьмом шаге я разместил звуковой модуль снаружи крышки банки. Это сделано специально для того, чтобы модуль впоследствии мог улавливать звук за пределами банки. После размещения модуля подключите его кабелем и совместите, как указано на приведенной принципиальной схеме. Затем подключите весь кабель с датчиком и Arduino к макету. Arduino устанавливается вертикально, так что кабель для питания схемы может легко подключаться к плате Arduino через пенопласт.
Итак, я завершаю проект. Мне нужно время плюс попытки и ошибки, но мне удалось это завершить.
Код
- Кодирование для Arduino
Кодирование для Arduino Arduino
Этот код позволит светодиоду реагировать на звук, обнаруживаемый звуковым модулем.#include/ ** ОСНОВНАЯ КОНФИГУРАЦИЯ ** /// Количество светодиодов в настройке # define NUM_LEDS 60 // Вывод, который управляет светодиодами # define LED_PIN 6 // Вывод, который мы считываем значения датчика, формируют #define ANALOG_READ 0 // Подтвержденное нижнее значение микрофона и максимальное значение # define MIC_LOW 0.0 #define MIC_HIGH 200.0 / ** Другие макросы * /// Сколько предыдущих значений датчика влияет на рабочее среднее? #Define AVGLEN 5 // Сколько предыдущих значений датчика определяет, находимся ли мы на пике / HIGH (например, в песне) #define LONG_SECTOR 20 // Mneumonics #define HIGH 3 #define NORMAL 2 // Как долго мы сохраняем "текущий средний" звук перед перезапуском измерения # define MSECS 30 * 1000 # define CYCLES MSECS / DELAY / * Иногда показания неправильные или странные. Насколько показаниям разрешено отклоняться от среднего значения, чтобы их нельзя было отбросить? ** / # define DEV_THRESH 0.8 // Задержка цикла Arduino # define DELAY 1float fscale (float originalMin, float originalMax, float newBegin, float newEnd, float inputValue, float curve); void insert (int val, int * avgs, int len); int compute_average (int * avgs, int len); void visualize_music (); // Сколько светодиодов мы отображаем int curshow =NUM_LEDS; / * На самом деле еще не используется. Предполагалась возможность переключения между звуковым реактивным режимом и общим градиентным пульсирующим / статическим цветом * / int mode =0; // Отображение разных цветов в зависимости от режима. Int songmode =NORMAL; // Среднее измерение звука за последний CYCLESunsigned long song_avg; // Количество итераций с момента сброса song_avg int iter =0; // Скорость, с которой светодиоды становятся черными, если не relitfloat fade_scale =1.2; // Массив светодиодов CRGB leds [NUM_LEDS]; / * Среднее значение короткого звука, используемое для "нормализации" входные значения. Мы используем короткое среднее вместо прямого использования входа датчика * / int avgs [AVGLEN] ={-1}; // Более длинный звук avgint long_avg [LONG_SECTOR] ={-1}; // Отслеживаем, как часто , и как долго мы попадаем в определенный режим struct time_keeping {unsigned long times_start; short times;}; // На сколько увеличивать или уменьшать каждый цвет в каждом циклеstruct color {int r; int g; int b;}; struct time_keeping high; struct color Color; void setup () {Serial.begin (9600); // Устанавливаем все источники света, чтобы убедиться, что все работают должным образом FastLED.addLeds (leds, NUM_LEDS); for (int i =0; i (song_avg / iter * 1.1)) {if (high.times! =0) {if (millis () - high.times_start> 200.0) {high.times =0; songmode =НОРМАЛЬНЫЙ; } еще {high.times_start =millis (); high.times ++; }} else {high.times ++; high.times_start =миллис (); }} if (high.times> 30 &&millis () - high.times_start <50.0) songmode =HIGH; иначе, если (millis () - high.times_start> 200) {high.times =0; songmode =НОРМАЛЬНЫЙ; }} // Основная функция для визуализации звуков в lampvoid visualize_music () {int sensor_value, mapped, avg, longavg; // Фактическое значение датчика sensor_value =analogRead (ANALOG_READ); // Если 0, немедленно отменить. Наверное, не прав и экономия ЦП. если (sensor_value ==0) возврат; // Отбросить показания, которые слишком сильно отличаются от прошлых ср. mapped =(float) fscale (MIC_LOW, MIC_HIGH, MIC_LOW, (float) MIC_HIGH, (float) sensor_value, 2.0); avg =compute_average (avgs, AVGLEN); if (((avg - mapped)> avg * DEV_THRESH)) // || ((avg - сопоставлено) <-avg * DEV_THRESH)) return; // Вставить новое средн. вставка значений (сопоставлено, avgs, AVGLEN); вставить (среднее, long_avg, LONG_SECTOR); // Вычислить значение датчика "среднее по песне" song_avg + =avg; iter ++; если (iter> ЦИКЛЫ) {song_avg =song_avg / iter; iter =1; } longavg =compute_average (long_avg, LONG_SECTOR); // Проверяем, входим ли мы в ВЫСОКИЙ режим check_high (longavg); если (режим песни ==ВЫСОКИЙ) {fade_scale =3; Color.r =5; Color.g =3; Color.b =-1; } иначе, если (songmode ==NORMAL) {fade_scale =2; Color.r =-1; Color.b =2; Color.g =1; } // Определяет, сколько светодиодов будет гореть curshow =fscale (MIC_LOW, MIC_HIGH, 0.0, (float) NUM_LEDS, (float) avg, -1); / * Устанавливаем разные светодиоды. Контроль слишком высоких и слишком низких значений. Интересная вещь, которую стоит попробовать:не учитывайте переполнение в одном направлении, появляются интересные световые эффекты! * / for (int i =0; i 255) leds [i]. г =255; иначе, если (leds [i] .r + Color.r <0) leds [i] .r =0; иначе светодиоды [i] .r =светодиоды [i] .r + Color.r; if (leds [i] .g + Color.g> 255) leds [i] .g =255; иначе, если (leds [i] .g + Color.g <0) leds [i] .g =0; иначе светодиоды [i] .g =светодиоды [i] .g + Color.g; if (leds [i] .b + Color.b> 255) leds [i] .b =255; иначе, если (leds [i] .b + Color.b <0) leds [i] .b =0; иначе светодиоды [i] .b =светодиоды [i] .b + Color.b; // Все остальные светодиоды начинают свой путь затухания к возможной полной темноте} else {leds [i] =CRGB (leds [i] .r / fade_scale, leds [i] .g / fade_scale, leds [i] .b / fade_scale ); } FastLED.show (); } // Вычислить среднее значение массива int, учитывая начальный указатель и длину int compute_average (int * avgs, int len) {int sum =0; для (int i =0; i 10) curve =10; если (кривая <-10) кривая =-10; кривая =(кривая * -.1); // - инвертировать и масштабировать - это кажется более интуитивным - положительные числа придают больший вес верхнему пределу на выходе curve =pow (10, curve); // преобразование линейной шкалы в логратимическую экспоненту для другой функции pow // Проверка выхода за пределы диапазона inputValues if (inputValue originalMax) {inputValue =originalMax; } // Ноль Ссылка на значения OriginalRange =originalMax - originalMin; если (newEnd> newBegin) {NewRange =newEnd - newBegin; } еще {NewRange =newBegin - newEnd; invFlag =1; } zeroRefCurVal =inputValue - originalMin; normalizedCurVal =zeroRefCurVal / OriginalRange; // нормализация до 0–1 с плавающей запятой // Проверка на originalMin> originalMax - математика для всех остальных случаев, т.е. отрицательные числа, кажется, работают нормально if (originalMin> originalMax) {return 0; } если (invFlag ==0) {rangedValue =(pow (normalizedCurVal, curve) * NewRange) + newBegin; } else // инвертируем диапазоны {rangedValue =newBegin - (pow (normalizedCurVal, curve) * NewRange); } return rangedValue;}
Схема
Производственный процесс
- Детектор языка TinyML на основе Edge Impulse и Arduino
- Игра с гироскопом Arduino с MPU-6050
- Цифровые игральные кости Arduino
- Железный человек
- Найди меня
- Воспроизведение звука в Arduino
- Управление увлажнителем Arduino
- Сонар с использованием Arduino и отображение при обработке IDE
- MobBob:самостоятельный робот Arduino, управляемый смартфоном Android
- NeoMatrix Arduino Pong