Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Komponen dan Perlengkapan

Arduino Nano 33 BLE1
Electret Microphone Amplifier Max98141
Layar OLED I2C 0.91 inci 128 x 32 Piksel1
Kapasitor 4.7 nF1
Kapasitor 470 µF1
Resistor 2K1

Aplikasi dan Layanan Online

Arduino IDE

Tentang Proyek Ini

Pengantar

Lihat bagaimana bar graph merespons musik dan suara di layar OLED kecil. Frekuensi terendah di ujung kiri grafik, frekuensi tertinggi di ujung kanan.

Konstruksi

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Koneksi

Mendapatkan derau frekuensi rendah?

Derau berasal dari perangkat listrik di sekitar sistem pengukuran Anda yang sedang bekerja. Semua perangkat elektronik bekerja dengan frekuensi dan tegangan arus bolak-balik (AC) tetap dengan frekuensi 50 Hz atau 60 Hz adalah frekuensi jaringan listrik di negara Anda. Anda dapat menggunakan kandang Faraday untuk menghilangkan derau dengan mudah. Letakkan rangkaian Anda di dalam kotak dan hubungkan kotak ke ground. Ground rangkaian dengan baik.

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Pinout Arduino Nano 33 BLE

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Menggunakan arduino core AnalogRead dan Arduino Nano 33 BLE kita hanya bisa mendapatkan sekitar 35.000 sampel per detik jadi kita tidak dapat menggunakan FFT untuk frekuensi di atas 17,5 Khz, karena kita harus membaca jam dan membuat beberapa perbandingan dalam loop tunggu sibuk kita akan berhati-hati dan mengambil batas atas 8 kHz. Jadi kita dapat menggunakan saringan RC low pass sederhana untuk menghindari solusi yang mengganggu di luar frekuensi tersebut.

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time
Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

R = 180Ω C = 0.1uF untuk frekuensi pemotongan fc = 8842 [Hz]

Di sini menggunakan resistor 2K Ohm dan kapasitor 4.7 nF untuk frekuensi pemotongan fc = 17000[Hz]

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Perkiraan kasar laju sampel maksimum

Menggunakan fungsi arduino core AnalogRead() yang normal terlalu lambat untuk sampling audio, jadi mari kita hitung laju sampel maksimum.

Kita akan memperkirakan berapa banyak sampel yang bisa kita dapatkan menggunakan arduino core AnalogRead dan Arduino Nano 33 BLE.

Mari kita jalankan program kecil ini untuk memperkirakan.

/*
* Perkiraan kasar laju sampel maksimum dengan AnalogRead
*/

#define ANALOG_PIN A0

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

Serial.begin(9600);
Serial.println("Sampling... please, wait. ");
}

void loop() {
// put your main code here, to run repeatedly:
newTime = micros();

// 1 juta sampel
for (int i = 0; i < (int)SAMPLES; i++){
analogValue = analogRead(ANALOG_PIN);
}
float elapsedTimePerSampleUs = (micros()- newTime) / SAMPLES;
Serial.print("Time per sample (us): ");
Serial.println(elapsedTimePerSampleUs);
Serial.print("Max sampling freq(hz): ");
Serial.println(pow(10,6) /elapsedTimePerSampleUs );
}
Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Menggunakan arduino core AnalogRead dan Arduino Nano 33 BLE kita hanya bisa mendapatkan sekitar 35.000 sampel per detik. Persyaratan laju ganda, konsekuensi dari teorema Nyquist akan membatasi visualizer spektrum kami ke frekuensi di bawah 17 kHz. Kita dapat menggunakan saringan low pass untuk melewatkan frekuensi di atas batas tersebut.

Kita harus membaca jam dan membuat beberapa perbandingan dalam loop tunggu sibuk, kita akan berhati-hati dan mengambil batas atas 8 kHz.

// take samples
for (int i = 0; i < SAMPLES; i++) {
unsigned long newTime = micros();
int value = analogRead(ANALOG_PIN);
vReal[i] = value;
vImag[i] = 0;
while (micros() < (newTime + sampling_period_us)) {
yield();
}
}

Antarmuka Pengguna

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Layar terbagi menjadi 11 zona frekuensi dan Anda menggunakan skala logaritmik yang mengelompokkan frekuensi seperti yang dirasakan oleh telinga manusia.

Manusia dapat mendeteksi suara dalam rentang frekuensi dari sekitar 20 Hz hingga 20 kHz. (Bayi manusia sebenarnya dapat mendengar frekuensi sedikit lebih tinggi dari 20 kHz, tetapi kehilangan beberapa sensitivitas frekuensi tinggi saat berkembang matang; batas atas pada dewasa rata-rata sering kali lebih dekat 15–17 kHz.)

Kita akan menggunakan zona 3 hingga 13 (11 zona) untuk representasi kami.

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Setiap bar mewakili nilai maksimum dalam band dengan garis terpisah dan nilai rata-rata dalam band dengan persegi panjang terisi.

Nilai ditampilkan menggunakan decibel dengan referensi yang dipilih sebelumnya dengan cara heuristik.

Bagaimana cara kerjanya?

Sampel audio dikonversi menjadi spektrum frekuensi menggunakan fast Fourier transform atau FFT.

Selanjutnya spektrum dibagi dan dikelompokkan dalam 14 zona dan hanya 11 zona yang direpresentasikan dalam dB.

Tentang modul mikrofon

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time
Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time
Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Mikrofon Electret

Electret adalah dielektrik yang diisi muatan secara hampir permanen. Ini dibuat dengan memanaskan bahan keramik, menempatkannya dalam medan magnet lalu membiarkannya mendingin sambil masih berada dalam medan magnet. Ini adalah ekuivalen elektrostatik dari magnet permanen. Dalam mikrofon electret irisan dari bahan ini digunakan sebagai bagian dari dielektrik kapasitor di mana diafragma mikrofon membentuk salah satu plat. Tekanan suara menggerakkan diafragma. Gerakan plat mengubah kapasitansi sesuai dengan tekanan suara. Dengan muatan tetap bawaan dielektrik, tegangan di seluruh kapasitor juga akan bervariasi. Kapasitor electret terhubung ke input dari penguat FET bawaan. Mikrofon electret kecil, memiliki sensitivitas yang baik, respons frekuensi yang luas dan umumnya biaya sangat rendah.

Penguat Mikrofon MAX9814

MAX9814 adalah penguat mikrofon dengan kontrol gain otomatis (AGC) dan bias mikrofon rendah derau dan memiliki beberapa opsi yang dapat Anda konfigurasikan dengan breakout.

Modul MAX9814 memiliki tiga pengaturan penguat (40dB, 50dB, 60dB). Default adalah 60dB, tetapi dapat diatur ke 40dB atau 50dB dengan menghubungkan pin Gain ke VCC atau ground.

Bias mikrofon rendah derau internal 1.25V, 2Vpp. Output dari penguat sekitar 2Vpp maks pada bias DC 1.25V, jadi dapat dengan mudah digunakan dengan konverter Analog/Digital apa pun dengan input hingga 3.3V.

Rasio Attack/Release juga dapat dimodifikasi, dari default 1:4000 ke 1:2000 atau 1:500.

Untuk menghubungkan langsung ke Line Input, Anda perlu kapasitor blokir / kapasitor coupling untuk memblokir komponen DC. Anda dapat menggunakan kapasitor blokir dalam seri di atas 1uF, tergantung pada sistem Anda, jika ragu coba dari 33 uF hingga 100uF. Rangkaian coupling memungkinkan sinyal AC mengalir dari satu bagian ke bagian lain sambil memblokir komponen DC. Dalam rangkaian audio, ini dilakukan untuk mencegah komponen DC merusak output audio. Efektivitas kapasitor coupling tergantung pada berbagai parameter tergantung frekuensi termasuk insertion loss, equivalent series resistance dan frekuensi resonansi seri.

Pasokan daya: 2.7V hingga 5.5V

Sensitivitas

Sensitivitas, rasio dari output voltage analog atau nilai output digital terhadap tekanan input, adalah spesifikasi kunci dari setiap mikrofon. Pemetaan unit dalam domain akustik ke unit dalam domain listrik menentukan magnitudo output signal mikrofon, dengan input yang diketahui.

Sensitivitas mikrofon adalah respons listrik di outputnya terhadap input akustik standar tertentu. Sinyal input referensi standar untuk pengukuran sensitivitas mikrofon adalah gelombang sinus 1 kHz pada 94 dB sound pressure level (SPL), atau 1 pascal (Pa, pengukuran tekanan). Mikrofon dengan nilai sensitivitas yang lebih tinggi memiliki output yang lebih tinggi untuk input akustik yang sama dibandingkan mikrofon dengan nilai sensitivitas yang lebih rendah. Sensitivitas mikrofon dalam decibel (dB) biasanya adalah angka negatif; oleh karena itu, sensitivitas yang lebih tinggi adalah nilai absolut yang lebih kecil.

Untuk mikrofon analog, sensitivitas biasanya ditentukan dalam satuan dBV, yaitu, decibel dengan referensi 1.0 V rms.

Tingkat Referensi dan Respons Frekuensi

Respons frekuensi mikrofon menggambarkan tingkat outputnya di seluruh spektrum frekuensi. Batas frekuensi tinggi dan rendah dijelaskan sebagai titik di mana respons mikrofon 3 dB di bawah tingkat output referensi pada 1 kHz. Tingkat referensi pada 1 kHz biasanya dinormalisasi ke 0 dB.

Layar OLED I2C 0.91 inci 128 x 32 Piksel

Ini adalah layar kecil, hanya sekitar 1" diagonal. Ini terdiri dari 128x32 piksel OLED putih individual, masing-masing dinyalakan atau dimatikan oleh chip pengontrol. Tidak diperlukan backlight. Ini mengurangi daya yang diperlukan untuk menjalankan OLED.

Model yang kami gunakan di sini hanya memiliki empat pin dan berkomunikasi dengan Arduino menggunakan protokol komunikasi I2C. Model ini tidak memiliki pin RESET. Anda cukup perlu menghubungkan ke pin I2C Arduino Uno:

Untuk mengontrol layar OLED Anda perlu perpustakaan adafruit_SSD1306.h dan adafruit_GFX.h. Ikuti instruksi berikut untuk menginstal perpustakaan ini.

Kami menggunakan perpustakaan Adafruit. Ingat Anda dapat membeli sesuatu dari Adafruit untuk mendukung mereka.

Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time
Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time
Arduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Langkah selanjutnya

Arduino Nano 33 BLE menggunakan yang bisa lebih baik mendapatkan analog reads. Versi selanjutnya saya akan menggunakan FFT dan Analog input yang dioptimalkan untuk nrf52840.

Kode

Sound Spectrum Visualizer for Arduino Nano 33 BLEArduino
Sound Spectrum Visualizer for Arduino Nano 33 BLE
uses arduinoFFT https://github.com/kosme/arduinoFFT
uses Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Sound Spectrum Visualizer for Arduino Nano 33 BLE Arduino based sound visualizer @author Enrique Albertos Hardware requirements: - Arduino or Arduino-compatible boards. - ssd1306 oled I2C 128x32 display - Electret Microphone Amplifier with max9814 - Optional: battery for portable use (else power through USB) Software requirements: - arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Connections: - Mic GAIN: * VCC to mic GAIN for 40dB * GND to mic GAIN for 50dB * floating mic GAIN for 60dB - Analog pin 0 to mic amp output - +3.3V, GND, SDA (or analog 4) and SCL (analog 5) to I2C SSD1306 @uses arduinoFFT https://github.com/kosme/arduinoFFT @uses Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "arduinoFFT.h" #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SAMPLES 1024 // power of 2 #define SAMPLING_FREQ 24000 // 12 kHz Fmax = sampleF /2 #define AMPLITUDE 100 // sensitivity #define FREQUENCY_BANDS 14 #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define BARWIDTH 11 #define BARS 11 #define ANALOG_PIN A0 // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) 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); // adjust reference to get remove background noise noise float reference = log10(50.0); double coutoffFrequencies[FREQUENCY_BANDS]; void setup() { // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 for (;;); // Don't proceed, loop forever } // Setup display display.clearDisplay(); display.display(); display.setRotation(0); display.invertDisplay(false); sampling_period_us = (1.0 / SAMPLING_FREQ ) * pow(10.0, 6); // Calculate cuttoff frequencies,meake a logarithmic scale base basePOt double basePot = pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies[0] = basePot; for (int i = 1 ; i < FREQUENCY_BANDS; i++ ) { coutoffFrequencies[i] = basePot * coutoffFrequencies[i - 1]; } // draw dashed lines to sperate frequency bands for (int i = 0; i < BARS - 1 ; i++) { for (int j = 0; j < SCREEN_HEIGHT ; j += 4) { display.writePixel((i + 1)*BARWIDTH + 2 , j, SSD1306_WHITE ); } } display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE); } int oldHeight[20]; int oldMax[20]; double maxInFreq; void loop() { // take samples for (int i = 0; i < SAMPLES; i++) { unsigned long newTime = micros(); int value = analogRead(ANALOG_PIN); vReal[i] = value; vImag[i] = 0; while (micros() < (newTime + sampling_period_us)) { yield(); } } // compute FFT fft.DCRemoval(); fft.Windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD); fft.Compute(FFT_FORWARD); fft.ComplexToMagnitude(); double median[20]; double max[20]; int index = 0; double hzPerSample = (1.0 * SAMPLING_FREQ) / SAMPLES; // double hz = 0; double maxinband = 0; double sum = 0; int count = 0; for (int i = 2; i < (SAMPLES / 2) ; i++) { count++; sum += vReal[i]; if (vReal[i] > max[index] ) { max[index] = vReal[i]; } if (hz > coutoffFrequencies[index]) { median[index] = sum / count; sum = 0.0; count = 0; index++; max[index] = 0; median[index] = 0; } hz += hzPerSample; } // calculate median and maximum per frequency band if ( sum > 0.0) { median[index] = sum / count; if (median[index] > maxinband) { maxinband = median[index]; } } int bar = 0; for (int i = FREQUENCY_BANDS - 1; i >= 3; i--) { int newHeight = 0; int newMax = 0; // calculate actual decibels if (median[i] > 0 && max[i] > 0 ) { newHeight = 20.0 * (log10(median[i] ) - reference); newMax = 20.0 * (log10(max[i] ) - reference); } // adjust minimum and maximum levels if (newHeight < 0 || newMax < 0) { newHeight = 1; newMax = 1; } if (newHeight >= SCREEN_HEIGHT - 2) { newHeight = SCREEN_HEIGHT - 3; } if (newMax >= SCREEN_HEIGHT - 2) { newMax = SCREEN_HEIGHT - 3; } int barX = bar * BARWIDTH + 5; // remove old level median if (oldHeight[i] > newHeight) { display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK); } // remove old max level if ( oldMax[i] > newHeight) { for (int j = oldMax[i]; j > newHeight; j -= 2) { display.drawFastHLine(barX , j, 7, SSD1306_BLACK); } } // paint new max level for (int j = newMax; j > newHeight; j -= 2) { display.drawFastHLine(barX , j, 7, SSD1306_WHITE); } // paint new level median 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(); } 

Skematik

soundspectrumvisualizer_qLzRsVPVlc.fzzArduino Nano 33 BLE Sound Spectrum Visualizer: Tampilan Audio Real-Time

Proses manufaktur

  1. Membuat Game Pong Klasik pada Arduino UNO dengan Layar OLED – Tutorial Langkah demi Langkah
  2. Sensor CO2 K30: Pemantauan Kualitas Udara Indoor dalam Waktu Nyata
  3. Memfasilitasi Komunikasi Tuna Netra Tuna Rungu Menggunakan 1Sheeld dan Arduino
  4. Bangun Tabung Pintar: Kendalikan Penerima Koin dengan Arduino Nano
  5. Kontrol LED melalui Bluetooth dengan Arduino – Panduan DIY Sederhana
  6. Kendalikan Dua Motor Stepper dengan Arduino Nano dan Joystick – Tutorial Sederhana
  7. Transmisi Data Audio dengan Arduino Nano 33 BLE Sense
  8. Buat Penghitung Geiger Tangan dengan Arduino Nano
  9. Pengukuran Radiasi Matahari Akurat dengan Arduino UNO dan Ethernet Shield
  10. Bangun Robot Makan Berbasis Arduino Nano – Panduan Langkah demi Langkah