====== Светомузыка на Arduino ====== ** [[slot-box:start#хочу_собрать|Проекты на Arduino и Slot Shield]] ** Устрой светомузыкальное шоу и прокачай домашнюю вечеринку. Технокотик слушает музыку аналоговым микрофоном [[amp>product/troyka-sound-loudness-sensor?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|датчика шума]] и зажигает [[amp>product/troyka-led-module?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|сверхъяркие «Пираньи»]] в зависимости от частоты и амплитуды звуковой волны — красный диод реагирует на низкие частоты, зелёный на средние, жёлтый на высокие, а синий задаёт ритм. Для обработки звука мы воспользовались быстрым преобразованием Фурье, поэтому в скетче используется библиотека FFT. Не забудьте {{:slot-box:light-show:fft.zip|скачать}} её. {{ :slot-box:light-show:light-show.jpg |}} * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Iskra Neo]] * Язык программирования: Arduino (C++) ===== Видеоинструкция ===== {{youtube>5ZVc_96GZuI?large}} ===== Что потребуется ===== [[amp>collection/light-show?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят: * [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Iskra Neo]] * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Troyka Slot Shield]] * [[amp>product/structor-slot-box?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|#Slot Box]] * [[amp>product/troyka-sound-loudness-sensor?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|датчик уровня шума]] * четыре разноцветных [[amp>product/troyka-led-module?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|сверхъярких светодиода «Пиранья»]] ===== Как собрать ===== Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/iskra-neo?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|Iskra Neo]] {{ :slot-box:light-show:step01.png |}} Возьмите [[amp>product/troyka-sound-loudness-sensor?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|датчик шума]], поверните его на 90 градусов против часовой стрелки и вставьте в верхний левый слот. {{ :slot-box:light-show:step02.png |}} Вставьте два сверхъярких [[amp>product/troyka-led-module?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|светодиодиода «Пиранья»]] в слоты верхнего ряда. Светодиод в среднем слоте покажет низкие частоты, а в правом — общий фон. {{ :slot-box:light-show:step03.png |}} Вставьте ещё две [[amp>product/troyka-led-module?utm_source=proj&utm_campaign=slot-proj-7&utm_medium=wiki|«Пираньи»]] под уже установленными светодиодами. Не забудьте перевернуть их на 180 градусов. Светодиод в среднем слоте покажет средние частоты, а в правом — высокие. {{ :slot-box:light-show:step04.png |}} **//Осторожно!//** Cветодиодные модули «Пиранья» очень яркие, поэтому не смотрите в середину светодиода с близкого расстояния, это очень вредно для глаз. ===== Скетч ===== Прошейте контроллер скетчем через [[articles:arduino-ide-install|Arduino IDE]]. // включаем функцию для логарифмического формата #define LOG_OUT 1 // задаем количество выходных отсчетов #define FFT_N 128 // подключаем библиотеку FFT — быстрое преобразование Фурье #include // номер пина датчика микрофона #define MIC_PIN A5 // номера цифровых пинов светодиодов #define RED_LED 3 #define BLUE_LED 4 #define GREEN_LED 9 #define YELLOW_LED 10 // распределяем номера отчётов по частотам // весь диипазон (FFT_N / 2) #define FREQ_LOW_FFT 2 #define FREQ_MIDDLE_FFT 30 #define FREQ_HIGH_FFT 60 #define FREQ_LOW_LEVEL 38 #define FREQ_MIDDLE_LEVEL 18 #define FREQ_HIGH_LEVEL 15 void setup() { // открываем последовательный порт Serial.begin(115200); // назначаем пины светодиодов в режим выхода pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED , OUTPUT); pinMode(YELLOW_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); } void loop() { // считываем заданное количество отсчётов for (int i = 0 ; i < FFT_N; i++) { // считываем показания микрофона и вычитаем отрицательную полу-волну int sample = analogRead(MIC_PIN) - 511; // игнорируем помехи АЦП if(sample < 5 && sample > -5) { sample = 0; } // сохраняем действительные значения в четные отсчеты fft_input[i++] = sample; // задаем нечетным отсчетам значение «0» fft_input[i] = 0; } // функция-окно, повышающая частотное разрешение fft_window(); // реорганизовываем данные перед запуском FFT fft_reorder(); // обрабатываем данные в FFT fft_run(); // извлекаем данные, обработанные FFT fft_mag_log(); // выводим значения преобразования Фурье Serial.print("<"); Serial.print(FFT_N / 2); Serial.print(":"); for (int curBin = 0; curBin < FFT_N / 2; ++curBin) { if (curBin > 0) { Serial.print(","); } Serial.print(fft_log_out[curBin]); } // если значение низких частот превысило предел if (fft_log_out[FREQ_LOW_FFT] > FREQ_LOW_LEVEL) { // зажигаем красный светодиод digitalWrite(RED_LED, HIGH); } else { // гасим красный светодиод digitalWrite(RED_LED, LOW); } // если значение средних частот превысило предел if (fft_log_out[FREQ_MIDDLE_FFT] > FREQ_MIDDLE_LEVEL) { // зажигаем зелёный светодиод digitalWrite(GREEN_LED, HIGH); // гасим синий светодиод (фон средних частот) digitalWrite(BLUE_LED, LOW); } else { // гасим зелёный светодиод digitalWrite(GREEN_LED, LOW); // зажигаем синий светодиод (фон средних частот) digitalWrite(BLUE_LED, HIGH); } // если значение высоких частот превысило предел if (fft_log_out[FREQ_HIGH_FFT] > FREQ_HIGH_LEVEL) { // зажигаем жёлтый светодиод digitalWrite(YELLOW_LED, HIGH); } else { // зажигаем жёлтый светодиод digitalWrite(YELLOW_LED, LOW); } Serial.println(">"); } ===== Что дальше? ===== Хотите собрать другой девайс? Выберите своё будущее устройство из [[slot-box:start#хочу_собрать|списка проектов на Slot Shield]]. ===== FAQ ===== * {{:slot-box:light-show:fft.zip|Библиотека FFT}} * [[http://wikihandbk.com/wiki/Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/FFT|Описание библиотеки FFT]] * [[программирование:библиотеки|Как установить библиотеку?]]