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

Visualizer Spektrum Suara dengan Arduino Nano 33 BLE

Komponen dan persediaan

Arduino Nano 33 BLE
× 1
Electret Microphone Amplifier Max9814
× 1
Layar OLED I2C 0,91 inci 128 x 32 Piksel
× 1
Kapasitor 4.7 nF
Tergantung pada Filter lolos rendah RC dan frekuensi batas yang dipilih
× 1
Kapasitor 470 F
× 1
Resistor 2K
Tergantung pada Filter lolos rendah RC dan frekuensi batas yang dipilih
× 1

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Pendahuluan

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

Konstruksi

Koneksi

  • Hubungkan Mic GAIN tergantung sensibilitas yang lebih sesuai dengan sistem Anda:VCC ke mikrofon MENDAPATKAN untuk 40dB, sensitivitas rendah, GND ke mikrofon MENDAPATKAN untuk 50dB, sensitivitas sedang atau biarkan mikrofon mengambang MENDAPATKAN untuk 60dB, sensitivitas tinggi.
  • Hubungkan pin Analog 0 A0 ke mic amp OUT
  • Hubungkan 3.3V , GND , SDA (atau analog 4 A4 ) dan SCL (analog 5 A5 ) ke I2C SSD1306
  • hubungkan kapasitor 470 uF antara VCC dan GND di bus daya

Mendapatkan gangguan frekuensi rendah?

Kebisingan berasal dari perangkat listrik di dekat sistem pengukuran Anda yang berfungsi. Semua perangkat elektronik bekerja dengan frekuensi tetap dan tegangan arus alternatif (AC) dengan frekuensi 50 Hz atau 60 Hz adalah frekuensi saluran listrik di negara Anda. Anda dapat menggunakan sangkar faraday untuk menghilangkan kebisingan dengan mudah. Letakkan sirkuit Anda di dalam kotak dan hubungkan kotak itu ke ground. Atur sirkuit dengan baik.

Pinout dari Arduino Nano 33 BLE

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

R =180Ω C =0,1uF untuk frekuensi Cut-off fc =8842 [Hz]

Disini menggunakan resistor 2K Ohm dan kapasitor 4,7 nF untuk frekuensi Cut-off fc =17000[Hz]

Perhitungan kasar dari sample rate maksimum

Menggunakan fungsi analogRead() Arduino normal terlalu lambat untuk pengambilan sampel audio, jadi mari kita hitung laju sampel maksimum.

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

Mari kita jalankan program kecil ini untuk mendapatkan perkiraan.

/*
* Perhitungan kasar sample rate maksimum dengan AnalogRead
*/

#define ANALOG_PIN A0

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

Serial.begin(9600);
Serial.println("Sampling. .. tolong, tunggu. ");
}

void loop() {
// letakkan kode utama Anda di sini, untuk dijalankan berulang kali:
newTime =micros ();

// 1 juta sampel
untuk (int i =0; i <(int)SAMPLES; i++){
analogValue =analogRead(ANALOG_PIN);
}
float elapsedTimePerSampleUs =(micros()- newTime) / SAMPLES;
Serial.print("Waktu per sampel (kami):");
Serial.println(elapsedTimePerSampleUs);
Serial.print("Max sampling freq(hz):");
Serial.println(pow(10,6) /elapsedTimePerSampleUs );
}

Menggunakan inti arduino AnalogRead dan Arduino Nano 33 BLE kita hanya bisa mendapatkan sekitar 35.000 sampel per detik. Persyaratan tingkat kira-kira dua kali lipat, konsekuensi dari teorema Nyquist akan membatasi visualisator spektrum kami ke frekuensi di bawah 17 kHz. Kita dapat menggunakan filter lolos rendah untuk melewati frekuensi di atas batas itu.

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

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

Antarmuka Pengguna

Layar dibagi menjadi sebelas zona frekuensi dan Anda memiliki skala logaritmik yang mengelompokkan frekuensi yang serupa dengan cara telinga manusia merasakannya.

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 mereka dewasa; batas atas pada orang dewasa rata-rata sering mendekati 15-17 kHz.)

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

Setiap batang mewakili nilai maksimum dalam pita dengan garis spasi dan nilai rata-rata dalam pita dengan persegi panjang yang diisi.

Nilai ditampilkan menggunakan desibel dengan referensi yang telah dipilih sebelumnya yang diperoleh dengan cara heuristik.

Bagaimana cara kerjanya?

Sampel audio diubah menjadi spektrum frekuensi menggunakan transformasi Fourier cepat atau FFT.

Kemudian spektrum tersebut dibagi dan dikelompokkan dalam 14 zona dan hanya 11 zona yang terwakili dalam dB.

Tentang modul mikrofon

Mikrofon Listrik

Electret adalah dielektrik yang bermuatan kuasi-permanen. Dibuat dengan cara memanaskan bahan keramik, menempatkannya dalam medan magnet kemudian dibiarkan dingin saat masih berada di dalam medan magnet. Ini adalah setara elektrostatik dari magnet permanen. Dalam mikrofon electret sepotong bahan ini digunakan sebagai bagian dari dielektrik kapasitor di mana diafragma mikrofon membentuk satu pelat. Tekanan suara menggerakkan diafragma. Pergerakan pelat memvariasikan kapasitansi sesuai dengan tekanan suara. Mengingat muatan tetap built-in dari dielektrik, tegangan kapasitor juga akan bervariasi. Kapasitor electret terhubung ke input penguat FET bawaan. Mikrofon electret berukuran kecil, memiliki sensitivitas yang sangat baik, respons frekuensi yang luas, dan umumnya berbiaya sangat rendah.

Penguat Mikrofon MAX9814

MAX9814 adalah penguat mikrofon dengan kontrol penguatan otomatis (AGC) dan bias mikrofon dengan noise rendah, serta memiliki beberapa opsi yang dapat Anda konfigurasikan dengan breakout.

Modul MAX9814 memiliki tiga pengaturan amplifier (40dB, 50dB, 60dB). Standarnya adalah 60dB, tetapi dapat diatur ke 40dB atau 50dB dengan melakukan jumper pin Gain ke VCC atau ground.

Bias mikrofon kebisingan rendah internal 1.25V, 2Vpp. Output dari amp adalah sekitar 2Vpp maks pada bias 1,25V DC, sehingga dapat dengan mudah digunakan dengan konverter Analog/Digital apa pun yang memiliki input hingga 3,3V.

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

Untuk menghubungkan langsung ke Line Input, Anda memerlukan kapasitor pemblokiran / kapasitor kopling untuk memblokir komponen DC. Anda dapat menggunakan kapasitor pemblokiran secara seri di atas 1uF, tergantung pada sistem Anda, jika ragu coba dari 33 uF hingga 100uF. Rangkaian kopling memungkinkan sinyal AC mengalir dari satu bagian ke bagian lain sambil memblokir komponen DC. Di sirkuit audio, ini dilakukan untuk mencegah komponen DC mendistorsi output audio. Keefektifan kapasitor kopling bergantung pada beragam parameter yang bergantung pada frekuensi termasuk rugi-rugi penyisipan, resistansi seri ekivalen, dan frekuensi resonansi seri.

Catu daya:2,7V hingga 5,5V

Sensitivitas

Sensitivitas , rasio tegangan keluaran analog atau nilai keluaran digital terhadap tekanan masukan, adalah spesifikasi utama mikrofon apa pun. Pemetaan unit dalam domain akustik ke unit dalam domain listrik menentukan besarnya sinyal keluaran mikrofon, dengan masukan yang diketahui.

Sensitivitas mikrofon adalah respons listrik pada outputnya terhadap input akustik standar yang diberikan. Sinyal input referensi standar untuk pengukuran sensitivitas mikrofon adalah gelombang sinus 1 kHz pada tingkat tekanan suara (SPL) 94 dB, atau 1 pascal (Pa, pengukuran tekanan). Mikrofon dengan nilai sensitivitas yang lebih tinggi memiliki tingkat output yang lebih tinggi untuk input akustik tetap daripada mikrofon dengan nilai sensitivitas yang lebih rendah. Sensitivitas mikrofon dalam desibel (dB) biasanya berupa 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 desibel dengan mengacu pada 1,0 V rms.

Tingkat referensi dan Respons Frekuensi

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

Layar OLED I2C 0,91 inci 128 x 32 Piksel

Ini adalah layar kecil, hanya sekitar 1" diagonal. Ini terbuat dari 128x32 piksel OLED putih individu, masing-masing dihidupkan atau dimatikan oleh chip pengontrol. Tidak diperlukan lampu latar. Ini mengurangi daya yang dibutuhkan 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 hanya perlu menyambungkan ke pin Arduino Uno I2C:

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

Untuk mengontrol tampilan OLED, Anda memerlukan adafruit_SSD1306.h dan adafruit_GFX.h library. Ikuti petunjuk selanjutnya untuk menginstal perpustakaan tersebut.

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

Langkah selanjutnya

Arduino Nano 33 BLE menggunakan kaleng yang lebih baik untuk membaca analog. Versi berikutnya saya akan menggunakan input FFT dan Analog yang dioptimalkan untuk nrf52840.

Kode

  • Visualizer Spektrum Suara untuk Arduino Nano 33 BLE
Visualizer Spektrum Suara untuk Arduino Nano 33 BLEArduino
Visualizer Spektrum Suara untuk Arduino Nano 33 BLE
menggunakan arduinoFFT https://github.com/kosme/arduinoFFT
menggunakan Adafruit_GFX https://github.com/adafruit/Adafruit-GFX-Library
menggunakan Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306
/* Sound Spectrum Visualizer untuk Arduino Nano 33 BLE Visualizer suara berbasis Arduino @author Enrique Albertos Persyaratan perangkat keras:- Papan yang kompatibel dengan Arduino atau Arduino. - Layar ssd1306 oled I2C 128x32 - Amplifier Mikrofon Electret dengan max9814 - Opsional:baterai untuk penggunaan portabel (daya lain melalui USB) Persyaratan perangkat lunak:- arduinoFFT https://github.com/kosme/arduinoFFT - Adafruit_GFX https://github.com /adafruit/Adafruit-GFX-Library - Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Koneksi:- Mic GAIN:* VCC ke mic GAIN untuk 40dB * GND ke mic GAIN untuk 50dB * Floating mic GAIN untuk 60dB - Analog pin 0 ke output amp mic - +3.3V, GND, SDA (atau analog 4) dan SCL (analog 5) ke I2C SSD1306 @menggunakan arduinoFFT https://github.com/kosme/arduinoFFT @menggunakan Adafruit_GFX https://github. com/adafruit/Adafruit-GFX-Library @uses Adafruit_SSD1306 https://github.com/adafruit/Adafruit_SSD1306 Program ini adalah perangkat lunak gratis:Anda dapat mendistribusikan ulang dan/atau memodifikasinya di bawah persyaratan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi yang lebih baru. Program ini disebarluaskan dengan harapan dapat bermanfaat, tetapi TANPA JAMINAN APAPUN; bahkan tanpa jaminan tersirat tentang KELAYAKAN DIPERDAGANGKAN atau KESESUAIAN UNTUK TUJUAN TERTENTU. Lihat Lisensi Publik Umum GNU untuk lebih jelasnya.*/#include "arduinoFFT.h"#include #include #define SAMPLES 1024 // power of 2#define SAMPLING_FREQ 24000 // 12 kHz Fmax =sampleF /2 #menentukan AMPLITUDE 100 // sensitivitas#menentukan FREQUENCY_BANDS 14#menentukan SCREEN_WIDTH 128 // Lebar tampilan OLED, dalam piksel#menentukan SCREEN_HEIGHT 32 // Tinggi tampilan OLED, dalam piksel#menentukan BARWIDTH 11#menentukan BARS 11#menentukan ANALOG_PIN A0// Deklarasi untuk layar SSD1306 yang terhubung ke I2C (SDA, pin SCL)#define OLED_RESET -1 // Reset pin # (atau -1 jika berbagi pin reset 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);// sesuaikan referensi untuk menghilangkan kebisingan latar belakang referensi noisefloat =log10(50.0);double coutoffFrequencies[ FREQUENCY_BANDS];void setup() { // SSD1306_SWITCHCAPVCC =menghasilkan dis putar tegangan dari 3.3V secara internal if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat 0x3C untuk 128x32 untuk (;;); // Jangan lanjutkan, loop selamanya } // Atur tampilan display.clearDisplay(); tampilan.display(); tampilan.setRotation(0); display.invertDisplay(salah); sampling_period_us =(1.0 / SAMPLING_FREQ ) * pow(10.0, 6); // Hitung frekuensi cuttoff, buat basis skala logaritmik basePOt double basePot =pow(SAMPLING_FREQ / 2.0, 1.0 / FREQUENCY_BANDS); coutoffFrequencies[0] =basePot; for (int i =1; i  max[index] ) { max[index] =vReal[i]; } if (hz> coutoffFrequencies[indeks]) { median[indeks] =jumlah / hitungan; jumlah =0,0; hitung =0; indeks++; maks[indeks] =0; median[indeks] =0; } hz +=hzPerSampel; } // menghitung median dan maksimum per pita frekuensi jika ( sum> 0.0) { median[index] =sum / count; if (median[indeks]> maxinband) { maxinband =median[indeks]; } } batang int =0; for (int i =FREQUENCY_BANDS - 1; i>=3; i--) { int newHeight =0; int maks.baru =0; // menghitung desibel sebenarnya jika (median[i]> 0 &&max[i]> 0 ) { tinggi baru =20.0 * (log10(median[i] ) - referensi); newMax =20.0 * (log10(max[i] ) - referensi); } // sesuaikan level minimum dan maksimum if (newHeight <0 || newMax <0) { newHeight =1; baruMaks =1; } if (newHeight>=SCREEN_HEIGHT - 2) { newHeight =SCREEN_HEIGHT - 3; } if (newMax>=SCREEN_HEIGHT - 2) { newMax =SCREEN_HEIGHT - 3; } int barX =bar * BARWIDTH + 5; // hapus median level lama if (oldHeight[i]> newHeight) { display.fillRect(barX, newHeight + 1, 7, oldHeight[i], SSD1306_BLACK); } // hapus level maks lama if ( oldMax[i]> newHeight) { for (int j =oldMax[i]; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_BLACK); } } // melukis level maks baru untuk (int j =newMax; j> newHeight; j -=2) { display.drawFastHLine(barX , j, 7, SSD1306_WHITE); } // melukis tampilan median level baru.fillRect(barX , 1, 7, newHeight, SSD1306_WHITE); oldMax[i] =newMax; oldHeight[i] =tinggi baru; batang++; } display.drawFastHLine(0 , SCREEN_HEIGHT - 1, SCREEN_WIDTH, SSD1306_WHITE); display.display();}

Skema

soundspectrumvisualizer_qLzRsVPVlc.fzz

Proses manufaktur

  1. Game Arduino Pong - Tampilan OLED
  2. Pemantauan CO2 dengan Sensor K30
  3. Komunikasi Tunarungu dengan 1Sheeld/Arduino
  4. Kontrol Penerima Koin dengan Arduino
  5. Arduino dengan Bluetooth untuk Mengontrol LED!
  6. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  7. Kirim Data dengan Suara
  8. Penghitung Geiger Genggam dengan Arduino Nano
  9. Mengukur Radiasi Matahari dengan Arduino
  10. Membuat Robot Makan Dengan Arduino Nano | Sekrup Emas