Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Визуализатор звукового спектра с Arduino Nano 33 BLE

Компоненты и расходные материалы

Arduino Nano 33 BLE
× 1
Электретный микрофонный усилитель Max9814
× 1
0,91-дюймовый OLED-дисплей I2C, 128 x 32 пикселей
× 1
Конденсатор 4,7 нФ
В зависимости от вашего RC-фильтра низких частот и выбранной вами частоты среза
× 1
Конденсатор 470 мкФ
× 1
Резистор 2 кОм
В зависимости от вашего RC-фильтра низких частот и выбранной вами частоты среза
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Введение

Посмотрите, как гистограмма реагирует на музыку и звук на маленьком OLED-дисплее. Самые низкие частоты - к левому краю графика, самые высокие - к правому.

Строительство

Подключения

  • Подключите Mic GAIN в зависимости от чувствительности, которая больше подходит вашей системе: VCC на микрофон GAIN для 40 дБ, низкая чувствительность, GND на микрофон GAIN для 50 дБ, средняя чувствительность или плавающий микрофон GAIN для 60 дБ, высокая чувствительность.
  • Подключите аналоговый вывод 0 A0 на микрофонный усилитель OUT
  • Подключите 3,3 В , GND , SDA (или аналог 4 A4 ) и SCL (аналог 5 A5 ) на I2C SSD1306
  • подключите конденсатор емкостью 470 мкФ между VCC и GND на шине питания.

Получаете низкочастотный шум?

Шум исходит от любых работающих электрических устройств рядом с вашей измерительной системой. Все электронные устройства работают с фиксированной частотой и напряжением переменного тока с частотой 50 Гц или 60 Гц - это частота электросети в вашей стране. Вы можете использовать клетку Фарадея, чтобы легко устранить шум. Поместите вашу схему в коробку и подключите коробку к земле. Хорошо заземлите цепь.

Распиновка Arduino Nano 33 BLE

Используя ядро ​​Arduino AnalogRead и Arduino Nano 33 BLE, мы можем получить только около 35000 выборок в секунду, поэтому мы не можем использовать БПФ для частот выше 17,5 кГц, так как мы должны считывать часы и делать несколько сравнений в загруженном цикле ожидания. буду осторожен и возьму верхний предел 8 кГц. Таким образом, мы можем использовать простой RC-фильтр нижних частот, чтобы избежать раздражающих решений за пределами этой частоты.

R =180 Ом C =0,1 мкФ для частоты отсечки fc =8842 [Гц]

Здесь используется резистор 2 кОм и конденсатор 4,7 нФ для частоты среза fc =17000 [Гц]

Грубый расчет максимальной частоты дискретизации

Использование обычной функции Arduino analogRead () слишком медленно для дискретизации звука, поэтому давайте рассчитаем максимальную частоту дискретизации.

Мы собираемся оценить, сколько образцов мы можем получить, используя ядро ​​Arduino AnalogRead и Arduino Nano 33 BLE.

Давайте запустим эту небольшую программу, чтобы получить оценку.

  / * 
* Грубый расчет максимальной частоты дискретизации с помощью AnalogRead
* /

#define ANALOG_PIN A0

#define SAMPLES 1000000.0
int newTime;
int analogValue;
void setup () {

Serial.begin (9600);
Serial.println ("Sampling. .. пожалуйста, подождите. ");
}

void loop () {
// поместите сюда ваш основной код, чтобы он запускался повторно:
newTime =micros ();

// 1 миллион отсчетов
для (int i =0; i <(int) SAMPLES; i ++) {
analogValue =analogRead (ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros () - newTime) / SAMPLES;
Serial.print ("Время на выборку (нас):");
Serial.println (elapsedTimePerSampleUs);
Serial.print ("Макс. частота дискретизации (Гц):");
Serial.println (pow (10,6) / elapsedTimePerSampleUs);
}

Используя ядро ​​Arduino AnalogRead и Arduino Nano 33 BLE, мы можем получать только около 35 000 выборок в секунду. Требование приблизительно двойной скорости, следствие теоремы Найквиста, ограничивает наш визуализатор спектра частотами ниже 17 кГц. Мы можем использовать фильтр нижних частот, чтобы пропускать частоты выше этого предела.

Мы должны считать часы и сделать несколько сравнений в цикле ожидания занятости, мы будем осторожны и возьмем верхний предел 8 кГц.

  // берем образцы 
for (int i =0; i unsigned long newTime =micros ();
int value =analogRead (ANALOG_PIN );
vReal [i] =value;
vImag [i] =0;
while (micros () <(newTime + sampling_period_us)) {
yield ();
}
}

Пользовательский интерфейс

Экран разделен на одиннадцать частотных зон, а частоты сгруппированы по логарифмической шкале, аналогично тому, как их воспринимает человеческое ухо.

Люди могут улавливать звуки в диапазоне частот от 20 Гц до 20 кГц. (Младенцы на самом деле могут слышать частоты немного выше 20 кГц, но по мере взросления теряют некоторую чувствительность к высоким частотам; верхний предел у среднего взрослого часто бывает ближе к 15–17 кГц.)

Мы будем использовать зоны с 3 по 13 (11 зон) для нашего представления.

Каждая полоса представляет максимальное значение в полосе с разнесенными линиями и среднее значение в полосе с закрашенным прямоугольником.

Значения показаны в децибелах с предварительно выбранной ссылкой, полученной эвристическим способом.

Как это работает?

Аудиосэмплы преобразуются в частотный спектр с помощью быстрого преобразования Фурье или БПФ.

Затем спектр делится и группируется в 14 зон, и только 11 зон представлены в дБ.

О микрофонном модуле

Электретный микрофон

Электрет - это квазипостоянно заряженный диэлектрик. Его получают путем нагревания керамического материала, помещения его в магнитное поле и последующего охлаждения в магнитном поле. Это электростатический эквивалент постоянного магнита. В электретном микрофоне кусок этого материала используется как часть диэлектрика конденсатора, в котором диафрагма микрофона образует одну пластину. Звуковое давление перемещает диафрагму. Движение пластины изменяет емкость в зависимости от звукового давления. Учитывая встроенный фиксированный заряд диэлектрика, напряжение на конденсаторе также будет изменяться. Электретный конденсатор подключен ко входу встроенного усилителя на полевых транзисторах. Электретные микрофоны имеют небольшие размеры, превосходную чувствительность, широкий частотный диапазон и, как правило, очень низкую стоимость.

MAX9814 микрофонный усилитель

MAX9814 - это микрофонный усилитель с автоматической регулировкой усиления (АРУ) и малошумящим микрофонным смещением, а также имеет несколько опций, которые можно настроить с помощью коммутационного разъема.

Модуль MAX9814 имеет три настройки усилителя (40 дБ, 50 дБ, 60 дБ). Значение по умолчанию - 60 дБ, но можно установить значение 40 или 50 дБ, подключив контакт усиления к VCC или заземлению.

Внутренний малошумящий микрофонный смещение 1,25 В, 2 В пик. Выходной сигнал усилителя составляет около 2Vpp max при напряжении смещения 1,25 В постоянного тока, поэтому его можно легко использовать с любым аналогово-цифровым преобразователем, рассчитанным на вход до 3,3 В.

Соотношение атака / отдача также может быть изменено со значения по умолчанию 1:4000 до 1:2000 или 1:500.

Для прямого подключения к линейному входу вам понадобится блокирующий конденсатор / разделительный конденсатор для блокировки составляющей постоянного тока. Вы можете использовать блокировочный конденсатор последовательно выше 1 мкФ, в зависимости от вашей системы, в случае сомнений попробуйте от 33 мкФ до 100 мкФ. Схема связи позволяет сигналам переменного тока течь от одной части к другой, блокируя компоненты постоянного тока. В аудиосхемах это сделано для предотвращения искажения аудиовыхода компонентами постоянного тока. Эффективность разделительного конденсатора зависит от широкого набора частотно-зависимых параметров, включая вносимые потери, эквивалентное последовательное сопротивление и последовательную резонансную частоту.

Электропитание:от 2,7 В до 5,5 В

Чувствительность

Чувствительность отношение аналогового выходного напряжения или цифрового выходного значения к входному давлению является ключевой характеристикой любого микрофона. Сопоставление единиц в акустической области с единицами в электрической области определяет величину выходного сигнала микрофона при известном входном сигнале.

Чувствительность микрофона - это электрический отклик на его выходе на заданный стандартный акустический вход. Стандартный эталонный входной сигнал для измерения чувствительности микрофона представляет собой синусоидальную волну 1 кГц при уровне звукового давления (SPL) 94 дБ или 1 паскаль (Па, измерение давления). Микрофон с более высоким значением чувствительности имеет более высокий выходной уровень для фиксированного акустического входа, чем микрофон с более низким значением чувствительности. Чувствительность микрофона в децибелах (дБ) обычно является отрицательным числом; следовательно, чем выше чувствительность, тем меньше абсолютное значение.

Для аналоговых микрофонов чувствительность обычно указывается в единицах дБВ, то есть в децибелах относительно 1,0 В среднеквадратичного значения.

Контрольный уровень и частотная характеристика

Частотная характеристика микрофона описывает его выходной уровень в частотном спектре. Пределы высоких и низких частот описываются как точки, в которых характеристика микрофона на 3 дБ ниже эталонного выходного уровня на частоте 1 кГц. Эталонный уровень на 1 кГц обычно нормализуется до 0 дБ.

0,91-дюймовый OLED-дисплей I2C, 128 x 32 пикселей

Это небольшой дисплей, диагональ всего около 1 дюйма. Он состоит из отдельных белых OLED-пикселей 128x32, каждый из которых включается или выключается микросхемой контроллера. Подсветка не требуется. Это снижает энергопотребление, необходимое для работы OLED-дисплея.

Модель, которую мы здесь используем, имеет всего четыре контакта и взаимодействует с Arduino по протоколу связи I2C. Эта модель не имеет контакта RESET. Вам просто нужно подключиться к контактам Arduino Uno I2C:

  • Arduino Nano:SDA (A4); SCL (A5);

Для управления OLED-дисплеем вам потребуются библиотеки adafruit_SSD1306.h и adafruit_GFX.h. Следуйте следующим инструкциям, чтобы установить эти библиотеки.

Мы используем библиотеки Adafruit. Помните, что вы можете купить что-нибудь в Adafruit, чтобы поддержать их.

Дальнейшие действия

Arduino Nano 33 BLE может лучше получать аналоговые чтения. В следующей версии я буду использовать БПФ и аналоговый вход, оптимизированный для nrf52840.

Код

  • Визуализатор звукового спектра для Arduino Nano 33 BLE
Визуализатор звукового спектра для Arduino Nano 33 BLE Arduino
Визуализатор звукового спектра для Arduino Nano 33 BLE
использует arduinoFFT https://github.com/kosme/arduinoFFT
использует Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
использует Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Визуализатор звукового спектра для Arduino Nano 33 BLE Звуковой визуализатор на основе Arduino @author Enrique Albertos Требования к оборудованию:- Платы, совместимые с Arduino или Arduino. - Дисплей ssd1306 oled I2C 128x32 - Электретный микрофонный усилитель с max9814 - Дополнительно:аккумулятор для портативного использования (иначе питание через USB) Программные требования:- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com / adafruit / Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Подключения:- УСИЛЕНИЕ микрофона:* УСИЛЕНИЕ от VCC к микрофону на 40 дБ * ЗЕМЛЯ на усиление микрофона на 50 дБ * УСИЛЕНИЕ с плавающего микрофона на 60 дБ - Аналоговый вывод 0 на выход микрофонного усилителя - + 3,3 В, GND, SDA (или аналог 4) и SCL (аналог 5) на I2C SSD1306 @ использует arduinoFFT https://github.com/kosme/arduinoFFT @ использует Adafruit_GFX https:// github. com / adafruit / Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Эта программа является бесплатным программным обеспечением:вы можете распространять и / или изменять ее в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной Free Software Foundation, либо версии 3 Лицензии, либо (по вашему выбору) любой более поздней версии. Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий ТОВАРНОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Подробнее см. Стандартную общественную лицензию GNU. * / # Include "arduinoFFT.h" #include  #include  #define SAMPLES 1024 // степень двойки # define SAMPLING_FREQ 24000 // 12 кГц Fmax =sampleF / 2 #define AMPLITUDE 100 // чувствительность # define FREQUENCY_BANDS 14 # define SCREEN_WIDTH 128 // ширина OLED-дисплея в пикселях # define SCREEN_HEIGHT 32 // высота OLED-дисплея в пикселях #define BARWIDTH 11 # define BARS 11 # define ANALOG_PIN A0 // Объявление для дисплея SSD1306, подключенного к I2C (выводы SDA, SCL) #define OLED_RESET -1 // Сброс вывода № (или -1, если общий вывод сброса Arduino) Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double vImag [SAMPLES]; double vReal [SAMPLES]; unsigned long sampling_period_us; arduinoFFT fft =arduinoFFT (vReal, vImag, SAMPLES, SAMPLING_FREQ); // настраиваем ссылку, чтобы удалить фоновый шум, noisefloat reference =log10 (50.0); double coutoffFrequencies [ FREQUENCY_BANDS]; void setup () {// SSD1306_SWITCHCAPVCC =генерировать отображение v напряжение от 3,3 В внутри if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Адрес 0x3C для 128x32 для (;;); // Не продолжать, цикл бесконечно} // Настройка отображения display.clearDisplay (); display.display (); display.setRotation (0); display.invertDisplay (ложь); sampling_period_us =(1.0 / SAMPLING_FREQ) * pow (10.0, 6); // Вычислить частоты среза, принять логарифмическую основу basePOt double basePot =pow (SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies [0] =basePot; для (int i =1; i  max [индекс]) {max [индекс] =vReal [i]; } если (hz> coutoffFrequencies [индекс]) {медиана [индекс] =сумма / количество; сумма =0,0; count =0; index ++; макс [индекс] =0; медиана [индекс] =0; } hz + =hzPerSample; } // вычисляем медианное и максимальное значение для каждой полосы частот if (sum> 0,0) {median [index] =sum / count; если (медиана [индекс]> maxinband) {maxinband =median [индекс]; }} int bar =0; для (int я =FREQUENCY_BANDS - 1; я> =3; я--) {int newHeight =0; int newMax =0; // вычисляем фактические децибелы if (median [i]> 0 &&max [i]> 0) {newHeight =20.0 * (log10 (median [i]) - reference); newMax =20.0 * (log10 (max [i]) - ссылка); } // настраиваем минимальный и максимальный уровни if (newHeight <0 || newMax <0) {newHeight =1; newMax =1; } если (newHeight> =SCREEN_HEIGHT - 2) {newHeight =SCREEN_HEIGHT - 3; } если (newMax> =SCREEN_HEIGHT - 2) {newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // удаляем медиану старого уровня if (oldHeight [i]> newHeight) {display.fillRect (barX, newHeight + 1, 7, oldHeight [i], SSD1306_BLACK); } // удаляем старый максимальный уровень if (oldMax [i]> newHeight) {for (int j =oldMax [i]; j> newHeight; j - =2) {display.drawFastHLine (barX, j, 7, SSD1306_BLACK); }} // отрисовываем новый максимальный уровень для (int j =newMax; j> newHeight; j - =2) {display.drawFastHLine (barX, j, 7, SSD1306_WHITE); } // отрисовываем медианное значение нового уровня display.fillRect (barX, 1, 7, newHeight, SSD1306_WHITE); oldMax [i] =newMax; oldHeight [i] =newHeight; bar ++; } display.drawFastHLine (0, SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display ();} 

Схема

Soundspectrumvisualizer_qLzRsVPVlc.fzz

Производственный процесс

  1. Игра Arduino Pong - OLED-дисплей
  2. Мониторинг CO2 с помощью датчика K30
  3. Слепоглухое общение с 1Sheeld / Arduino
  4. Управление монетоприемником с помощью Arduino
  5. Arduino с Bluetooth для управления светодиодом!
  6. Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
  7. Отправка данных со звуком
  8. Портативный счетчик Гейгера с Arduino Nano
  9. Измерение солнечной радиации с помощью Arduino
  10. Создайте робота для еды с Arduino Nano | Золотой винт