Daftar Isi:
- Perlengkapan
- Langkah 1: Konstruksi - Breadboard
- Langkah 2: Konstruksi - Dorong Header / solder
- Langkah 3: Konstruksi - Pasang Pin Daya
- Langkah 4: Konstruksi - Pengkabelan I2S
- Langkah 5: Memasang Perpustakaan BtAudio
- Langkah 6: Menggunakan Perpustakaan BtAudio
- Langkah 7: DSP - Penyaringan
- Langkah 8: DSP - Kompresi Rentang Dinamis
- Langkah 9: Antarmuka Wifi
- Langkah 10: Rencana Masa Depan
Video: Pemrosesan Sinyal Audio & Digital Bluetooth: Kerangka Kerja Arduino: 10 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
Ringkasan
Ketika saya memikirkan Bluetooth, saya memikirkan musik tetapi sayangnya sebagian besar mikrokontroler tidak dapat memutar musik melalui Bluetooth. Raspberry Pi bisa tapi itu komputer. Saya ingin mengembangkan kerangka kerja berbasis Arduino untuk mikrokontroler untuk memutar audio melalui Bluetooth. Untuk sepenuhnya melenturkan otot mikrokontroler saya, saya akan menambahkan Digital Signal Processing (DSP) real-time ke audio (penyaringan high-pass, penyaringan low-pass dan kompresi rentang dinamis). Untuk ceri di atas, saya akan menambahkan server web yang dapat digunakan untuk mengkonfigurasi DSP secara nirkabel. Video yang disematkan menunjukkan dasar-dasar audio Bluetooth yang sedang beraksi. Ini juga menunjukkan kepada saya menggunakan server web untuk melakukan beberapa pemfilteran lolos tinggi, pemfilteran lolos rendah, dan kompresi rentang dinamis. Penggunaan pertama kompresi rentang Dinamis dengan sengaja menyebabkan distorsi sebagai contoh pilihan parameter yang buruk. Contoh kedua menghilangkan distorsi ini.
Untuk proyek ini, ESP32 adalah mikrokontroler pilihan. Harganya kurang dari £10 dan dilengkapi dengan fitur ADC, DAC, Wifi, Bluetooth Low Energy, Bluetooth Classic dan prosesor dual-core 240MHz. DAC onboard secara teknis dapat memutar audio tetapi tidak akan terdengar bagus. Sebagai gantinya, saya akan menggunakan decoder stereo Adafruit I2S untuk menghasilkan sinyal line-out. Sinyal ini dapat dengan mudah dikirim ke sistem HiFi mana pun untuk secara instan menambahkan audio nirkabel ke sistem HiFi Anda yang sudah ada.
Perlengkapan
Mudah-mudahan, sebagian besar pembuat akan memiliki papan tempat memotong roti, jumper, kabel USB, besi solder catu daya dan hanya perlu menghabiskan £15 untuk ESP32 dan dekoder stereo. Jika tidak, semua bagian yang diperlukan adalah daftar di bawah ini.
- ESP32 - diuji pada ESP32-PICO-KIT dan TinyPico - £9.50/ £24
- Adafruit I2S Stereo Decoder - £5.51
- Papan tempat memotong roti - £3- £5 masing-masing
- Kabel jumper - £3
- Headphone berkabel/sistem Hi-Fi - £££
- Header Dorong atau Besi Solder - £2,10 / £30
- Kabel USB mikro - £2,1/ £3
- Konektor 3,5 mm ke RCA / jack 3,5 mm ke jack (atau apa pun yang dibutuhkan speaker Anda) - £2,40/ £1,50
- Catu Daya USB - £5
Langkah 1: Konstruksi - Breadboard
Jika Anda membeli ESP32-PICO-KIT, Anda tidak perlu menyolder pin apa pun karena sudah disolder sebelumnya. Cukup letakkan di papan tempat memotong roti.
Langkah 2: Konstruksi - Dorong Header / solder
Jika Anda memiliki besi solder, solder pin ke dekoder stereo sesuai dengan instruksi di situs web Adafruit. Pada saat penulisan, besi solder saya sedang bekerja yang dikunci. Saya tidak ingin membayar untuk besi solder sementara jadi saya memotong beberapa header dorong dari pimoroni. Saya memotongnya agar pas dengan dekoder stereo. Ini bukan solusi terbaik (dan bukan bagaimana header dimaksudkan untuk digunakan) tetapi ini adalah alternatif termurah untuk besi solder. Pasang tajuk potong ke papan tempat memotong roti. Anda hanya perlu 1 baris 6 pin untuk decoder. Anda dapat menambahkan enam lagi ke sisi lain untuk stabilitas tetapi ini tidak diperlukan untuk sistem prototipe ini. Pin untuk memasukkan header ke dalam adalah vin, 3vo, gnd, wsel, din dan bclk.
Langkah 3: Konstruksi - Pasang Pin Daya
Tempatkan dekoder Stereo pada header push (pin vin, 3vo, gnd, wsel, din dan bclk) dan dorong dengan kuat bersama-sama. Sekali lagi, ini idealnya harus dilakukan dengan besi solder tetapi saya harus berimprovisasi. Anda akan melihat bahwa semua kabel dalam instruksi ini berwarna biru. Itu karena saya tidak punya kabel jumper jadi saya memotong 1 kabel panjang menjadi potongan-potongan kecil. Juga, saya buta warna dan tidak terlalu peduli dengan warna kawat. Pin daya terpasang sebagai berikut:
3v3 (ESP32) -> untuk vin pada dekoder stereo
gnd (ESP32) -> untuk gnd pada dekoder stereo
Langkah 4: Konstruksi - Pengkabelan I2S
Untuk mengirim audio Bluetooth dari ESP32 ke dekoder stereo, kita akan menggunakan metode komunikasi digital yang disebut I2S. Decoder stereo akan mengambil sinyal digital ini dan mengubahnya menjadi sinyal analog yang bisa dicolokkan ke speaker atau HiFi. I2S hanya membutuhkan 3 kabel dan cukup mudah dipahami. Garis bit clock (bclk) berubah tinggi dan rendah untuk menunjukkan bit baru ditransmisikan. Garis keluar data (dout) berubah tinggi atau rendah untuk menunjukkan apakah bit itu memiliki nilai 0 atau 1 dan kata pilih garis (wsel) berubah tinggi atau rendah untuk menunjukkan apakah saluran kiri atau kanan sedang ditransmisikan. Tidak semua mikrokontroler mendukung I2S tetapi ESP32 memiliki 2 jalur I2S. Ini menjadikannya pilihan yang jelas untuk proyek ini.
Pengkabelan adalah sebagai berikut:
27 (ESP32) -> wsel (Dekoder stereo)
25 (ESP32) -> din (Dekoder stereo)
26 (ESP32) -> bclk (Dekoder stereo)
Langkah 5: Memasang Perpustakaan BtAudio
Jika Anda belum menginstalnya, instal Arduino IDE dan inti Arduino untuk ESP32. Setelah Anda menginstalnya, kunjungi halaman Github saya dan unduh repositori. Di dalam Arduino IDE di bawah Sketch>>Include Library>> pilih "Add. ZIP library". Kemudian pilih file zip yang diunduh. Ini akan menambahkan perpustakaan btAudio saya ke perpustakaan Arduino Anda. Untuk menggunakan perpustakaan, Anda harus menyertakan header yang relevan dalam sketsa Arduino. Anda akan melihat ini di langkah berikutnya.
Langkah 6: Menggunakan Perpustakaan BtAudio
Setelah terinstal, sambungkan ESP32 Anda ke komputer melalui micro USB, lalu sambungkan dekoder stereo ke speaker dengan kabel 3,5 mm. Sebelum Anda mengunggah sketsa, Anda perlu mengubah beberapa hal di editor Arduino. Setelah Anda memilih papan Anda, Anda perlu mengedit skema partisi di bawah Tools >> Partition Scheme dan pilih "No OTA (Large APP)" atau "Minimal SPIFFS(Large APPS with OTA)". Ini diperlukan karena proyek ini menggunakan WiFi dan Bluetooth yang keduanya merupakan perpustakaan yang sangat banyak memori. Setelah Anda selesai, unggah sketsa berikut ke ESP32.
#termasuk
// Menyetel nama perangkat audio btAudio audio = btAudio("ESP_Speaker"); void setup() { // mengalirkan data audio ke ESP32 audio.begin(); // mengeluarkan data yang diterima ke I2S DAC int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck, dout, ws); } lingkaran kosong() {}
Sketsa secara garis besar dapat dibagi menjadi 3 langkah:
- Buat objek btAudio global yang menetapkan "nama Bluetooth" ESP32 Anda
- Konfigurasikan ESP32 untuk menerima audio dengan metode btAudio::begin
- Setel pin I2S dengan metode btAudio::I2S.
Itu saja di sisi perangkat lunak! Sekarang yang perlu Anda lakukan adalah memulai koneksi Bluetooth ke ESP32 Anda. Cukup pindai perangkat baru di ponsel/laptop/MP3 player Anda dan "ESP_Speaker" akan muncul. Setelah Anda puas bahwa semuanya berfungsi (musik diputar), Anda dapat memutuskan sambungan ESP32 dari komputer Anda. Nyalakan dengan catu daya USB dan itu akan mengingat kode terakhir yang Anda unggah ke sana. Dengan cara ini, Anda dapat membiarkan ESP32 Anda tersembunyi di balik sistem HiFi Anda selamanya.
Langkah 7: DSP - Penyaringan
Memperluas Penerima dengan Pemrosesan Sinyal Digital
Jika Anda mengikuti semua langkah (dan saya tidak meninggalkan apa pun), Anda sekarang memiliki penerima Bluetooth yang berfungsi penuh untuk sistem HiFi Anda. Meskipun ini keren, itu tidak benar-benar mendorong mikrokontroler hingga batasnya. ESP32 memiliki dua core yang beroperasi pada 240MHz. Itu berarti proyek ini jauh lebih dari sekadar penerima. Ini memiliki kapasitas untuk menjadi penerima Bluetooth dengan Digital Signal Processor (DSP). DSP pada dasarnya melakukan operasi matematika pada sinyal secara real-time. Satu operasi yang berguna disebut Penyaringan Digital. Proses ini melemahkan frekuensi dalam sinyal di bawah atau di atas frekuensi cutoff tertentu, tergantung pada apakah Anda menggunakan filter high-pass atau low-pass.
Filter lolos tinggi
Filter High-Pass melemahkan frekuensi di bawah pita tertentu. Saya telah membangun perpustakaan filter untuk sistem Arduino berdasarkan kode dari earlevel.com. Perbedaan utamanya adalah saya telah mengubah struktur kelas untuk memungkinkan pembuatan filter tingkat tinggi dengan lebih mudah. Filter orde lebih tinggi menekan frekuensi di luar batas Anda secara lebih efektif tetapi membutuhkan lebih banyak komputasi. Namun, dengan penerapan saat ini, Anda bahkan dapat menggunakan filter urutan ke-6 untuk audio waktu nyata!
Sketsanya sama dengan yang ditemukan pada langkah sebelumnya kecuali bahwa kita telah mengubah loop utama. Untuk mengaktifkan filter, kami menggunakan metode btAudio::createFilter. Metode ini menerima 3 argumen. Yang pertama adalah jumlah kaskade filter. Jumlah kaskade filter adalah setengah dari urutan filter. Untuk filter urutan ke-6, argumen pertama harus 3. Untuk filter urutan ke-8, akan menjadi 4. Argumen kedua adalah cutoff filter. Saya telah mengatur ini ke 1000Hz untuk memiliki efek yang sangat dramatis pada data. Akhirnya, kami menentukan jenis filer dengan argumen ketiga. Ini harus highpass untuk high-pass filter dan lowpass untuk low-pass filter. Skrip di bawah ini mengubah batas frekuensi ini antara 1000Hz dan 2Hz. Anda akan mendengar efek dramatis pada data.
#termasuk
btAudio audio = btAudio("ESP_Speaker"); void setup() { audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck, dout, ws); } void loop() { delay(5000); audio.createFilter(3, 1000, highpass); penundaan(5000); audio.createFilter(3, 2, highpass); }
Filter lolos rendah
Filter lolos rendah melakukan kebalikan dari filter lolos tinggi dan menekan frekuensi di atas frekuensi tertentu. Mereka dapat diimplementasikan dengan cara yang sama seperti filter lolos tinggi kecuali bahwa mereka memerlukan perubahan argumen ketiga menjadi lowpass. Untuk sketsa di bawah ini saya mengganti cutoff low-pass antara 2000Hz dan 20000Hz. Mudah-mudahan, Anda akan mendengar perbedaannya. Seharusnya terdengar cukup teredam ketika filter low-pass berada pada 2000Hz.
#termasuk
btAudio audio = btAudio("ESP_Speaker"); void setup() { audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck, dout, ws); } void loop() { delay(5000); audio.createFilter(3, 2000, lowpass); penundaan(5000); audio.createFilter(3, 20000, lowpass); }
Langkah 8: DSP - Kompresi Rentang Dinamis
Latar belakang
Kompresi rentang dinamis adalah metode pemrosesan sinyal yang mencoba meratakan kenyaringan audio. Ini memampatkan suara keras, yang naik di atas ambang batas tertentu, ke tingkat yang tenang dan kemudian, secara opsional memperkuat keduanya. Hasilnya adalah pengalaman mendengarkan yang jauh lebih merata. Ini sangat berguna saat saya menonton pertunjukan dengan musik latar yang sangat keras dan vokal yang sangat tenang. Dalam hal ini, hanya meningkatkan volume tidak membantu karena ini hanya memperkuat musik latar. Dengan kompresi rentang dinamis, saya dapat mengurangi musik latar yang keras ke tingkat vokal dan mendengar semuanya dengan benar lagi.
Kode
Kompresi rentang dinamis tidak hanya melibatkan penurunan volume atau ambang batas sinyal. Ini sedikit lebih pintar dari itu. Jika Anda menurunkan volume suara yang tenang akan berkurang serta yang keras. Salah satu cara mengatasinya adalah dengan ambang sinyal tetapi ini menghasilkan distorsi yang parah. Kompresi rentang dinamis melibatkan kombinasi soft thresholding dan filtering untuk meminimalkan distorsi yang akan didapat jika Anda melakukan threshold/clip sinyal. Hasilnya adalah sinyal di mana suara keras "terpotong" tanpa distorsi dan suara yang tenang dibiarkan apa adanya. Kode di bawah ini beralih di antara tiga tingkat kompresi yang berbeda.
- Kompresi dengan distorsi
- Kompresi tanpa distorsi
- Tanpa Kompresi
#termasuk
btAudio audio = btAudio("ESP_Speaker"); void setup() { audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck, dout, ws); } void loop() { delay(5000); audio.compress(30, 0,0001, 0,0001, 10, 10, 0); penundaan(5000); audio.compress(30, 0,0001, 0,1, 10, 10, 0); penundaan(5000); audio.dekompresi(); }
Kompresi rentang dinamis rumit dan metode btAudio::compress memiliki banyak parameter. Saya akan mencoba dan menjelaskannya (secara berurutan) di sini:
- Ambang - Tingkat pengurangan audio (diukur dalam desibel)
- Waktu serangan - Waktu yang diperlukan kompresor untuk mulai bekerja setelah ambang batas terlampaui
- Waktu rilis - Waktu yang diperlukan kompresor untuk berhenti bekerja.
- Rasio Pengurangan - faktor di mana audio dikompresi.
- Lebar Lutut - Lebar (dalam desibel) di sekitar ambang batas di mana kompresor bekerja sebagian (suara lebih alami).
- Penguatan (desibel) ditambahkan ke sinyal setelah kompresi (peningkatan/penurunan volume)
Distorsi yang sangat terdengar pada penggunaan kompresi pertama adalah karena ambang batasnya sangat rendah dan waktu serangan dan waktu pelepasan sangat singkat secara efektif menghasilkan perilaku ambang batas yang keras. Ini jelas diselesaikan dalam kasus kedua dengan meningkatkan waktu rilis. Ini pada dasarnya menyebabkan kompresor bekerja dengan cara yang jauh lebih halus. Di sini, saya hanya menunjukkan bagaimana mengubah 1 parameter dapat memiliki efek dramatis pada audio. Sekarang giliran Anda untuk bereksperimen dengan parameter yang berbeda.
Implementasi (matematika ajaib - opsional)
Saya menemukan bahwa menerapkan kompresi rentang dinamis secara naif menjadi tantangan. Algoritme memerlukan konversi bilangan bulat 16-bit menjadi desibel dan kemudian mengubahnya kembali menjadi bilangan bulat 16-bit setelah Anda memproses sinyal. Saya perhatikan bahwa satu baris kode membutuhkan waktu 10 mikrodetik untuk memproses data stereo. Karena sampel audio stereo pada 44,1 KHz hanya menyisakan 11,3 mikrodetik untuk DSP, ini sangat lambat… Namun, dengan menggabungkan tabel pencarian kecil (400 byte) dan prosedur interpolasi berdasarkan perbedaan terbagi Netwon, kita dapat memperoleh hampir 17 bit presisi dalam 0,2 mikrodetik. Saya telah melampirkan dokumen pdf dengan semua matematika untuk yang benar-benar tertarik. Ini rumit, Anda sudah diperingatkan!
Langkah 9: Antarmuka Wifi
Sekarang Anda memiliki penerima Bluetooth yang mampu menjalankan DSP waktu nyata. Sayangnya, jika Anda ingin mengubah salah satu parameter DSP, Anda harus memutuskan sambungan dari HiFi Anda, mengunggah sketsa baru, lalu menyambungkan kembali. Ini kikuk. Untuk memperbaikinya, saya mengembangkan server web yang dapat Anda gunakan untuk mengedit semua parameter DSP tanpa menghubungkan kembali ke komputer Anda. Sketsa untuk menggunakan server web di bawah ini.
#termasuk
#sertakan btAudio audio = btAudio("ESP_Speaker"); webDSP web; void setup() { Serial.begin(115200); audio.mulai(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck, dout, ws); // ganti dengan ID WiFi dan kata sandi Anda const char* ssid = "SSID"; const char* kata sandi = "PASSWORD"; web.begin(ssid, kata sandi, &audio); } void loop() { web._server.handleClient(); }
Kode memberikan alamat IP ke ESP32 Anda yang dapat Anda gunakan untuk mengakses halaman web. Pertama kali Anda menjalankan kode ini, Anda harus memasangnya ke komputer Anda. Dengan begitu Anda dapat melihat alamat IP yang ditetapkan untuk ESP32 Anda di monitor serial Anda. Jika Anda ingin mengakses halaman web ini, cukup masukkan alamat IP ini ke browser web apa pun (diuji pada chrome).
Sekarang kita harus terbiasa dengan metode mengaktifkan Bluetooth dan I2S. Perbedaan utama adalah penggunaan objek webDSP. Objek ini menggunakan SSID dan kata sandi Wifi Anda sebagai argumen serta penunjuk ke objek btAudio. Di loop utama, kami terus-menerus mendapatkan objek webDSP untuk mendengarkan data yang masuk dari halaman web dan kemudian memperbarui parameter DSP. Sebagai penutup, perlu dicatat bahwa Bluetooth dan Wifi menggunakan radio yang sama pada ESP32. Ini berarti Anda mungkin harus menunggu hingga 10 detik dari saat Anda memasukkan parameter di halaman web hingga saat informasi tersebut benar-benar mencapai ESP32.
Langkah 10: Rencana Masa Depan
Mudah-mudahan, Anda menikmati instruksi ini dan sekarang memiliki Audio Bluetooth dan DSP yang ditambahkan ke HiFi Anda. Namun, saya pikir ada banyak ruang untuk pertumbuhan dalam proyek ini dan saya hanya ingin menunjukkan beberapa arah masa depan yang mungkin saya ambil.
- Aktifkan streaming audio Wifi (untuk kualitas audio terbaik)
- Gunakan mikrofon I2S untuk mengaktifkan perintah suara
- kembangkan equalizer yang dikontrol WiFi
- Buatlah cantik (papan tempat memotong roti tidak meneriakkan desain produk yang hebat)
Ketika saya berhasil menerapkan ide-ide ini, saya akan membuat lebih banyak instruksi. Atau mungkin orang lain akan menerapkan fitur ini. Itulah kegembiraan membuat semuanya open source!
Direkomendasikan:
FK (Forward Kinematic) Dengan Excel, Arduino & Pemrosesan: 8 Langkah
FK (Forward Kinematic) Dengan Excel, Arduino & Processing: Forward Kinematic digunakan untuk mencari nilai End Effector (x, y, z) dalam ruang 3D
Teruskan Kinematic Dengan Excel, Arduino & Pemrosesan: 8 Langkah
Forward Kinematic With Excel, Arduino & Processing: Forward Kinematic digunakan untuk mencari nilai End Effector (x, y, z) dalam ruang 3D
Pemrosesan Gambar Dengan Raspberry Pi: Menginstal OpenCV & Pemisahan Warna Gambar: 4 Langkah
Pemrosesan Gambar Dengan Raspberry Pi: Menginstal OpenCV & Pemisahan Warna Gambar: Posting ini adalah yang pertama dari beberapa tutorial pemrosesan gambar yang akan diikuti. Kami melihat lebih dekat pada piksel yang membentuk gambar, mempelajari cara menginstal OpenCV pada Raspberry Pi dan kami juga menulis skrip pengujian untuk menangkap gambar dan juga c
Cara Merobek Kaliper Digital dan Cara Kerja Kaliper Digital: 4 Langkah
Cara Merobek Kaliper Digital dan Cara Kerja Kaliper Digital: Banyak orang tahu cara menggunakan kaliper untuk mengukur. Tutorial ini akan mengajarkan Anda cara merobohkan caliper digital dan penjelasan tentang cara kerja caliper digital
Pengantar Pemrosesan Gambar: Pixy & Alternatifnya: 6 Langkah
Pengenalan Pemrosesan Gambar: Pixy & Alternatifnya: Pada artikel ini, Kami akan menjelaskan pengertian Pemrosesan Gambar Digital (DIP) dan alasan penggunaan perangkat keras seperti Pixy dan alat lainnya untuk membuat proses pada gambar atau video. Di akhir artikel ini, Anda akan mempelajari: Bagaimana sebuah citra digital terbentuk