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

RGB 32-Band Audio Spectrum Visualizer

Komponen dan persediaan

Arduino Nano R3
× 1
WS2812B 8x32 RGB LED MATRIX
× 1
Resistor 4.75k ohm
× 3
Resistor 100k ohm
× 2
Resistor 10k ohm
× 1
Melalui Resistor Lubang, 390 ohm
× 1
Kapasitor 100 nF
× 2
Kapasitor 1000 F
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1
Papan prototipe multilubang 4x6 cm
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)
Kabel splitter Jack 3,5 mm

Tentang proyek ini

Proyek

Proyek ini untuk membuat visualisator spektrum frekuensi audio (musik) 32-band RGB menggunakan Arduino Nano dan 8x32 WS2812B RGB Led Matrix.

Proyek asli yang menginspirasi ini

Terima kasih banyak untuk Shajeeb penulis proyek asli berdasarkan matriks yang dipimpin MAX72xx. Saya hanya memodifikasi bagian pilot dari matriks led untuk menyesuaikannya dengan Matriks Led RGB WS2812B.

Tautan ke proyek asli:Penganalisis Visualizer Spektrum Audio 32-Band

Matriks Led RGB WS2812B

Menggunakan matriks LED RGB berbasis 5050 SMD LED kecerahan tinggi, perlu menggunakan catu daya eksternal karena matriks RGB dapat menyerap lebih dari 10mA per LED, oleh karena itu dengan semua LED yang menyala pada kecerahan maksimum dapat menyerap lebih dari 2,5 Ampere.

Untuk alasan ini saya telah memasukkan dioda secara seri pada +5V agar dapat memberi daya Arduino dalam mode berdiri sendiri, ketika kabel USB tidak terhubung, dan untuk menghindari Arduino menjadi sumber daya dari matriks RGB, jadi Anda menghindari membebani sirkuit internal papan dengan arus yang tidak dapat disuplai.

Untuk Proyek asli, selain dioda input, untuk melindungi input matriks LED dari kemungkinan puncak tegangan, saya juga menambahkan resistor 390 ohm secara seri antara pind Arduino D6 dan input Data, dan kapasitor 1000 F 12V untuk meningkatkan stabilitas tegangan suplai Arduino.

Perakitan perangkat keras

Seperti terlihat pada foto utama saya membuat prototipe pertama pada papan multi-lubang 4x6 cm menggunakan dua soket audio RCA (disolder langsung pada papan) yang juga dapat diganti dengan soket Jack female 3,5 mm. Hal penting untuk menghindari dengungan adalah membuat koneksi antara sumber dan input audio kartu dengan kabel berpelindung. Tip lainnya adalah menjaga koneksi antara Arduino dan matriks led sesingkat mungkin.

Kode

Pada akhirnya, semua perangkat lunak didasarkan pada pekerjaan besar yang dilakukan oleh penulis prosedur pengambilan sampel melalui perpustakaan FFT dan realisasi definitif Shajeeb.

Saya telah menambahkan dua fungsi:

Yang pertama adalah GetLedFromMatrix(...) untuk memetakan matriks ke dalam baris dan kolom dan untuk dapat menangani masing-masing dari 256 LED melalui koordinat baris dan kolom.

Yang kedua adalah yang - yang saya sebut sewenang-wenang SetColumn(...) - yang menyalakan LED setiap kolom berdasarkan nilai puncak yang diperoleh dengan digitalisasi audio (nilai antara 0 dan 7 ) dan berdasarkan warna prasetel dalam larik dua dimensi. Anda dapat bersenang-senang mengubah nilai dan warna sesuai keinginan. Untuk menyederhanakan kode saya menggunakan sobroutine yang disebut Wheel() (diambil dari demo yang dilampirkan ke perpustakaan Neopixel Adafruit) yang mulai dari nilai antara 0 dan 255 mengembalikan nilai panjang 32-bit yang tidak ditandatangani untuk diteruskan langsung ke fungsi setPixelColor. Di sini Anda dapat bermain sesuka hati, dengan mengingat keterbatasan memori Arduino, sedapat mungkin hindari penggunaan variabel 32-bit untuk menyimpan nilai warna RGB.

Audio persamaan

Selanjutnya, karena saya telah menjalankan tes dengan audio yang berasal dari kartu suara yang terintegrasi di motherboard PC, untuk meningkatkan respons frekuensi, saya menambahkan array byte dari 32 nilai yang pada dasarnya merupakan kurva pemerataan untuk melemahkan bass dan meningkatkan treble. Jika Anda tidak membutuhkannya, cukup setel variabel EQ_ON ke false atau ubah tingkat redaman dengan mengubah 32 nilai dari persamaan[32] array, nilai 100 membuat amplitudo tidak berubah, satu kurang dari 100 melemahkan dan satu lebih besar dari 100 menonjolkan pita frekuensi.

Dipimpin kecerahan

Kecerahan matriks diatur dalam kode pada 32 (konst BRIGHTNESS). Nilai kecerahan maksimum matriks WS2812B (di atas kertas) adalah 255 tetapi sudah dengan nilai lebih besar dari 100, sayangnya lampu LED berubah dari putih menjadi kuning pucat, mungkin perlu untuk memasok matriks melalui dua kabel merah dan hitam pusat sebagai gantinya dari konektor sisi kanan.

Saya masih mencoba ...

Terakhir, jika Anda menggunakan kecerahan maksimum 64, catu daya 1A mungkin sudah cukup, jika tidak, 2A sangat penting.

Udate Mendatang

Saya sedang mengerjakan versi baru yang menggunakan OpenMusicLabs FHT library yang ternyata beberapa kali lebih cepat daripada FFT Arduino.

Tetap disini. :)

Tolong maafkan bahasa Inggris saya yang buruk, saya menggunakan penerjemah google.

Kode

  • Spectrum_Analyzer_WS2812B.ino
Spectrum_Analyzer_WS2812B.inoArduino
/* Hak Cipta (c) 2019 Shajeeb TM Izin dengan ini diberikan, gratis, kepada siapa pun yang memperoleh salinan perangkat lunak ini dan file dokumentasi terkait ("Perangkat Lunak"), untuk menangani Perangkat Lunak tanpa batasan, termasuk tanpa batasan hak untuk menggunakan, menyalin, memodifikasi, menggabungkan, menerbitkan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak, dan untuk mengizinkan orang yang diberikan Perangkat Lunak untuk melakukannya, dengan tunduk pada ketentuan berikut:pemberitahuan hak cipta dan pemberitahuan izin ini harus disertakan dalam semua salinan atau bagian substansial dari Perangkat Lunak. PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN DALAM BENTUK APA PUN, TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN DIPERDAGANGKAN, KESESUAIAN UNTUK TUJUAN TERTENTU DAN TANPA PELANGGARAN. DALAM KEADAAN APA PUN PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU TANGGUNG JAWAB LAINNYA, BAIK DALAM TINDAKAN KONTRAK, KERUSAKAN ATAU LAINNYA, TIMBUL DARI, DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU DALAM DEALING LAINNYA PERANGKAT LUNAK. WS2812B Led Matrix vesion oleh Janux*/#include #include #include #define SAMPLES 64 //Harus pangkat 2#define xres 32 // Jumlah total kolom dalam tampilan, harus <=SAMPEL/2#menentukan thn 8 // Jumlah baris dalam tampilan#menentukan ledPIN 6 // pint untuk mengontrol Matriks Led#menentukan NUM_LEDS (xres * thn)#menentukan BRIGHTNESS 32#mendefinisikan buttonPin 5 // jumlah dari pushbutton pin untuk mengubah yvalue byte warna; byte kolom tampilan, nilai tampilan; puncak int[xres]; byte state =HIGH; // pembacaan saat ini dari pinbyte input sebelumnyaState =LOW; // pembacaan sebelumnya dari input pinbyte displaycolor =0;//Arrays for sampligdouble vReal[SAMPLES];double vImag[SAMPLES];byte data_avgs[xres];arduinoFFT FFT =arduinoFFT(); // FFT objectunsigned long lastDebounceTime =0; // terakhir kali pin output di-toggledunsigned long debounceDelay =100; // waktu debounce; meningkat jika output berkedip// Parameter 1 =jumlah led dalam matriks// Parameter 2 =nomor pin (sebagian besar valid)// Parameter 3 =flag tipe piksel, tambahkan sesuai kebutuhan:// NEO_KHZ800 800 KHz bitstream (kebanyakan NeoPixel produk w/WS2812 LED)// NEO_KHZ400 400 KHz (klasik 'v1' (bukan v2) piksel FLORA, driver WS2811)// NEO_GRB Piksel dihubungkan untuk bitstream GRB (sebagian besar produk NeoPixel)// Piksel NEO_RGB dihubungkan untuk bitstream RGB ( v1 FLORA piksel, bukan v2)Adafruit_NeoPixel pixel =Adafruit_NeoPixel(NUM_LEDS, ledPIN, NEO_GRB + NEO_KHZ800);// Filter EQ untuk melemahkan bass dan meningkatkan treble// Berguna pada kartu suara PC yang biasanya memiliki banyak bass dan frekuensi tinggi yang burukbool EQ_ON =true; // set ke false untuk menonaktifkan eqbyte eq[32] ={50, 55, 60, 70, 75, 80, 85, 95, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 115, 125, 140, 160, 185, 200, 225, 255 };//Tentukan warna untuk led tunggal, digunakan dalam fungsi setColumn, 0 untuk warna khusus//Warna adalah dihitung dengan fungsi Roda, lihat warna byte di bawah[][8] ={ {170, 160, 150, 140, 130, 120, 1, 1}, {1, 5, 10, 15, 20, 25, 90, 90} , {90, 85, 80, 75, 70, 65, 1, 1}, {90, 90, 90, 30, 30, 30, 1, 1}, {170, 160, 150, 140, 130, 120, 0, 0}, {170, 160, 150, 140, 130, 120, 1, 1}, {170, 160, 150, 140, 130, 120, 1, 1}};pengaturan batal() { pixel.begin (); pixel.setBrightness(KECERAHAN); // Mulai operasi FFT ADCSRA =0b11100101; // setel ADC ke mode lari bebas dan setel pra-skalar ke 32 (0xe5) ADMUX =0b00000000; // gunakan pin A0 dan referensi tegangan eksternal}void loop() { // ++ Sampling for (int i =0; i  puncak[i]) puncak[i] =nilai; //simpan puncak jika> nilai puncak sebelumnya y =puncak[i]; kolom tampilan =i; nilai tampilan =nilai y; setColumn(kolom tampilan, nilai tampilan); // menggambar ember } pixel.show(); // tampilkan ember displaycolorChange(); // periksa apakah tombol ditekan untuk mengubah mode warna}//------------------------------------- ----------------------------// Lampu led kolom x menurut nilai yvoid setColumn(byte x, byte y) { byte led , Saya; for (i =0; i  i) { switch (displaycolor) { case 4://menempatkan nol 0 pada nilai array untuk menyesuaikan warna puncak if (colors[displaycolor][i]> 0) { //warna normal yang ditentukan pada pixel array warna.setPixelColor(led, Wheel(colors[displaycolor][i])); } else { //warna kustom untuk puncak hanya dengan 0 pada nilai array pixel.setPixelColor(led, 255, 255, 255); //Nomor led, nilai R, G, B } break; case 5://ubah warna menurut kolom pixel.setPixelColor(led, Wheel(x * 16)); merusak; case 6://ubah warna menurut baris pixel.setPixelColor(led, Wheel(i * 36)); merusak; default://tampilan set warna -> warna tampilan dari 0 hingga 3 //warna ditentukan pada piksel array warna.setPixelColor(led, Wheel(colors[displaycolor][i])); }//END SWITCH } else { pixel.setPixelColor(led, 0); } }}//=======================================================================// Hitung nomor led dengan koordinat x,y// valid untuk WS2812B dengan tata letak serpentine ditempatkan di horizontal// dan nol led di kanan bawah (konektor input di sisi kanan)// nilai input:x=0-31, y=0-7, kembalikan nomor led dari 0 hingga 255//========================================================================byte GetLedFromMatrix(byte x, byte y) { x =xres - x - 1; if (x &0x01) { //Kolom ganjil bertambah mundur kembali ((x + 1) * thn - y - 1); } else { //Peningkatan kolom genap secara normal kembali ((x + 1) * thn - yres + y); }}//========================================================================void displaycolorChange() { int reading =digitalRead(buttonPin); if (membaca ==HIGH &&sebelumnyaState ==LOW &&millis() - lastDebounceTime> debounceDelay) // hanya berfungsi saat ditekan { displaycolor++; if (warna tampilan> 6) warna tampilan =0; lastDebounceTime =milis(); } status sebelumnya =membaca;}/* Utilitas dari sketsa demo Adafruit Neopixel Masukkan nilai 0 hingga 255 untuk mendapatkan nilai warna. Warna adalah transisi R - G - B - kembali ke R.*/unsigned long Wheel(byte WheelPos) { WheelPos =255 - WheelPos; if (WheelPos <85) { mengembalikan piksel.Warna(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) { WheelPos -=85; mengembalikan pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -=170; return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0);}

Suku cadang dan penutup khusus

arduino_rgb_audio_analyzer_lX4Dv4Pta2.zip

Skema


Proses manufaktur

  1. 32 (Linier) / 11 (Pseudo Log) band Audio Spectrum Analyzer
  2. Alarm Tanaman Peringatan Haus
  3. Jam Kata Italia
  4. Sigfox kWh Meter
  5. Pemantau Suhu Bluetooth
  6. Kunci yang Dikendalikan Gerakan
  7. IC Pendamping
  8. Adaptor MIDI USB
  9. Input Analog Terisolasi untuk Arduino
  10. Ukur waktu reaksi Anda