Proses manufaktur
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
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.
/* 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);}
Proses manufaktur
Komponen dan persediaan Arduino Due × 1 Regulator Linier dengan Output yang Dapat Disesuaikan × 1 Texas Instruments Tujuan Umum Dual Op-Amp × 1 Resistor 20k ohm × 3 Resistor 220 ohm × 1 Resistor 1k ohm × 2 NPN Transistor Serbaguna
Komponen dan persediaan Arduino Nano R3 × 1 Resistor 10k ohm × 1 Resistor 1k ohm × 1 Resistor 100 ohm × 1 Resistor 100k ohm × 1 Resistor 1M ohm × 1 ElectroPeak 0.96 Modul Tampilan OLED 64x128 × 1 Kabel jumper (generik)
Komponen dan persediaan Arduino Nano R3 × 1 Penguat operasional IC TL061 × 1 Resistor 10k ohm × 2 Resistor 1M ohm × 1 Kapasitor Cakram Keramik, 39 pF × 1 kumparan sekunder dari trafo 1-2W kecil × 1 Alat dan mesin yang diperlukan
Komponen dan persediaan Arduino UNO × 1 Adafruit LCD Standar - 16x2 Putih di Atas Biru × 1 Sakelar Tombol Tekan SparkFun 12mm × 4 Resistor 10k ohm × 4 Resistor 221 ohm Yah, 220 ohm... × 2 Potensiometer Putaran Tunggal- 100k ohm × 1