İçindekiler:
- Gereçler
- Adım 1: İnşaat - Breadboard
- 2. Adım: İnşaat - İtme Başlıkları/lehimleme
- Adım 3: İnşaat - Güç Pimlerini Kablolayın
- Adım 4: İnşaat - I2S Kablolama
- Adım 5: BtAudio Kitaplığını Yükleme
- 6. Adım: BtAudio Kitaplığını Kullanma
- 7. Adım: DSP - Filtreleme
- Adım 8: DSP - Dinamik Aralık Sıkıştırma
- 9. Adım: Wifi Arayüzü
- Adım 10: Gelecek Planları
Video: Bluetooth Ses ve Dijital Sinyal İşleme: Arduino Çerçevesi: 10 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
Özet
Bluetooth'u düşündüğümde aklıma müzik geliyor ama ne yazık ki çoğu mikrodenetleyici Bluetooth üzerinden müzik çalamıyor. Raspberry Pi yapabilir ama bu bir bilgisayar. Mikrodenetleyicilerin Bluetooth üzerinden ses çalması için Arduino tabanlı bir çerçeve geliştirmek istiyorum. Mikrodenetleyicimin kaslarını tamamen esnetmek için sese gerçek zamanlı Dijital Sinyal İşleme (DSP) ekleyeceğim (yüksek geçişli filtreleme, düşük geçişli filtreleme ve dinamik aralık sıkıştırma). Üstteki kiraz için, DSP'yi kablosuz olarak yapılandırmak için kullanılabilecek bir web sunucusu ekleyeceğim. Gömülü video, Bluetooth sesinin temellerini çalışırken gösterir. Ayrıca bazı yüksek geçişli filtreleme, düşük geçişli filtreleme ve dinamik aralık sıkıştırması gerçekleştirmek için web sunucusunu kullandığımı da gösteriyor. Dinamik aralık sıkıştırmasının ilk kullanımı, kötü parametre seçimlerinin bir örneği olarak kasıtlı olarak bozulmaya neden olur. İkinci örnek bu çarpıklığı ortadan kaldırır.
Bu proje için ESP32 tercih edilen mikro denetleyicidir. 10 £ 'dan daha ucuza mal oluyor ve ADC'ler, DAC'ler, Wifi, Bluetooth Düşük Enerji, Bluetooth Classic ve 240MHz çift çekirdekli işlemci ile dolu. Yerleşik DAC teknik olarak ses çalabilir, ancak kulağa harika gelmez. Bunun yerine, bir hat çıkışı sinyali üretmek için Adafruit I2S stereo kod çözücüyü kullanacağım. Bu sinyal, mevcut HiFi sisteminize anında kablosuz ses eklemek için herhangi bir HiFi sistemine kolayca gönderilebilir.
Gereçler
Umarım çoğu üreticide breadboard, jumper, USB kabloları, güç kaynağı havyaları olacak ve ESP32 ve stereo kod çözücü için sadece 15 £ harcamak zorunda kalacaklar. Değilse, gerekli tüm parçalar aşağıda listelenmiştir.
- Bir ESP32 - ESP32-PICO-KIT ve TinyPico üzerinde test edildi - 9,50 £/ 24 £
- Adafruit I2S Stereo Dekoder - £ 5,51
- Breadboard - her biri 3-£5 £
- Atlama telleri - 3 £
- Kablolu kulaklıklar/Hi-Fi sistemi - £££
- İtmeli Başlıklar veya Havya - £ 2,10 / £30
- Mikro USB kablosu - 2,10 £/3 £
- 3,5 mm - RCA konektörü/ 3,5 mm jak - jak (veya hoparlörünüzün neye ihtiyacı varsa) - 2,40 £/ 1,50 £
- USB Güç Kaynağı - £5
Adım 1: İnşaat - Breadboard
ESP32-PICO-KIT'i satın aldıysanız, önceden lehimlenmiş olarak geldiği için herhangi bir pimi lehimlemeniz gerekmeyecektir. Basitçe breadboard'a yerleştirin.
2. Adım: İnşaat - İtme Başlıkları/lehimleme
Havyanız varsa, Adafruit web sitesindeki talimatlara göre pimleri stereo kod çözücüye lehimleyin. Yazma sırasında havyam kilitli olan işteydi. Geçici bir havya için para ödemek istemedim, bu yüzden pimoroni'den bazı itme başlıklarını kestim. Stereo kod çözücüye uymaları için onları kestim. Bu en iyi çözüm değildir (ve başlıkların nasıl kullanılması amaçlanmamıştır), ancak bir havyaya en ucuz alternatiftir. Kesilmiş başlığı devre tahtasına yerleştirin. Kod çözücü için sadece 1 satır 6 pin gerekir. Kararlılık için diğer tarafa altı tane daha ekleyebilirsiniz, ancak bu prototip sistemi için bu gerekli değildir. Başlıkları yerleştirmek için kullanılan pinler vin, 3vo, gnd, wsel, din ve bclk'dir.
Adım 3: İnşaat - Güç Pimlerini Kablolayın
Stereo kod çözücüyü itme başlıklarına (vin, 3vo, gnd, wsel, din ve bclk pinleri) yerleştirin ve bunları sıkıca birbirine bastırın. Yine, bu ideal olarak bir havya ile yapılmalı ama doğaçlama yapmak zorunda kaldım. Bu talimattaki tüm tellerin mavi olduğunu fark edeceksiniz. Bunun nedeni jumper kablolarım olmadığı için 1 uzun kabloyu daha küçük parçalara ayırdım. Ayrıca ben renk körüyüm ve kablonun rengi umurumda değil. Güç pimleri aşağıdaki gibi takılır:
3v3 (ESP32) -> stereo kod çözücüde vin'e
gnd (ESP32) -> stereo kod çözücüde gnd'ye
Adım 4: İnşaat - I2S Kablolama
Bluetooth sesini ESP32'den stereo kod çözücüye göndermek için I2S adı verilen bir dijital iletişim yöntemi kullanacağız. Stereo kod çözücü bu dijital sinyali alacak ve onu bir hoparlöre veya HiFi'ye takılabilen analog bir sinyale dönüştürecektir. I2S sadece 3 kablo gerektirir ve anlaşılması oldukça basittir. Bit saati (bclk) satırı, yeni bir bitin iletildiğini belirtmek için yüksek ve alçak döner. Veri çıkış satırı (dout), bu bitin 0 veya 1 değerine sahip olup olmadığını belirtmek için yüksek veya düşük olur ve kelime seçme satırı (wsel) sol veya sağ kanalın iletildiğini belirtmek için yüksek veya düşük olur. Her mikrodenetleyici I2S'yi desteklemez ancak ESP32'nin 2 I2S hattı vardır. Bu, onu bu proje için bariz bir seçim haline getiriyor.
Kablolama aşağıdaki gibidir:
27 (ESP32) -> wsel (Stereo kod çözücü)
25 (ESP32) -> din (Stereo kod çözücü)
26 (ESP32) -> bclk (Stereo kod çözücü)
Adım 5: BtAudio Kitaplığını Yükleme
Henüz kurmadıysanız, Arduino IDE'yi ve ESP32 için Arduino çekirdeğini kurun. Bunları kurduktan sonra Github sayfamı ziyaret edin ve depoyu indirin. Arduino IDE içinde Sketch>>Include Library>> altında ". ZIP kitaplığı ekle"yi seçin. Ardından indirilen zip dosyasını seçin. Bu, btAudio kitaplığımı Arduino kitaplıklarınıza eklemelidir. Kütüphaneyi kullanmak için ilgili başlığı Arduino taslağına dahil etmeniz gerekir. Bunu bir sonraki adımda göreceksiniz.
6. Adım: BtAudio Kitaplığını Kullanma
Kurulduktan sonra, ESP32'nizi mikro USB aracılığıyla bilgisayarınıza bağlayın ve ardından stereo kod çözücünüzü 3,5 mm kablonuzla hoparlörünüze bağlayın. Krokiyi yüklemeden önce Arduino editöründe bazı şeyleri değiştirmeniz gerekecek. Panonuzu seçtikten sonra, Araçlar >> Bölme Şeması altında bölüm şemasını düzenlemeniz ve "OTA Yok (Büyük Uygulama)" veya "Minimal SPIFFS (OTA'lı Büyük Uygulamalar)" seçeneğini seçmeniz gerekecektir. Bu gereklidir, çünkü bu proje, her ikisi de çok bellek ağır kitaplıklar olan hem WiFi hem de Bluetooth kullanır. Bunu yaptıktan sonra aşağıdaki çizimi ESP32'ye yükleyin.
#Dahil etmek
// Ses cihazının adını ayarlar btAudio audio = btAudio("ESP_Speaker"); void setup() { // ses verilerini ESP32'ye aktarır audio.begin(); // alınan verileri bir I2S DAC'ye gönderir int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck,dout,ws); } boşluk döngüsü() { }
Eskiz genel olarak 3 adıma ayrılabilir:
- ESP32'nizin "Bluetooth adını" ayarlayan global bir btAudio nesnesi oluşturun
- ESP32'yi btAudio::begin yöntemiyle ses alacak şekilde yapılandırın
- I2S pinlerini btAudio::I2S yöntemiyle ayarlayın.
Yazılım tarafında bu kadar! Şimdi tek yapmanız gereken ESP32'nize Bluetooth bağlantısını başlatmak. Telefonunuzda/dizüstü bilgisayarınızda/MP3 çalarınızda yeni cihazlar için tarama yapın ve "ESP_Speaker" görünecektir. Her şeyin çalıştığından memnun olduğunuzda (müzik çalar), ESP32'yi bilgisayarınızdan ayırabilirsiniz. USB güç kaynağı ile güç verin ve ona yüklediğiniz son kodu hatırlayacaktır. Bu şekilde, ESP32'nizi HiFi sisteminizin arkasında sonsuza kadar gizli bırakabilirsiniz.
7. Adım: DSP - Filtreleme
Alıcıyı Dijital Sinyal İşleme ile Genişletme
Tüm adımları izlediyseniz (ve hiçbir şeyi atlamadım), artık HiFi sisteminiz için tam olarak çalışan bir Bluetooth alıcınız var. Bu harika olsa da, mikrodenetleyiciyi gerçekten sınırlarına zorlamaz. ESP32, 240MHz'de çalışan iki çekirdeğe sahiptir. Bu, bu projenin bir alıcıdan çok daha fazlası olduğu anlamına gelir. Dijital Sinyal İşlemcili (DSP) Bluetooth alıcısı olma özelliğine sahiptir. DSP'ler esasen sinyal üzerinde gerçek zamanlı olarak matematiksel işlemler gerçekleştirir. Kullanışlı bir işlem Dijital Filtreleme olarak adlandırılır. Bu işlem, yüksek geçiren veya alçak geçiren filtre kullanmanıza bağlı olarak, belirli bir kesme frekansının altında veya üstünde bir sinyaldeki frekansları azaltır.
Yüksek geçiren filtreler
Yüksek Geçişli filtreler, belirli bir bandın altındaki frekansları zayıflatır. Earlevel.com'dan gelen koda dayalı olarak Arduino sistemleri için bir filtre kitaplığı oluşturdum. Temel fark, sınıf yapısını daha yüksek dereceli filtrelerin daha kolay oluşturulmasına izin verecek şekilde değiştirmiş olmamdır. Daha yüksek dereceli filtreler, sınırınızın ötesindeki frekansları daha etkili bir şekilde bastırır, ancak çok daha fazla hesaplama gerektirirler. Ancak, mevcut uygulama ile gerçek zamanlı ses için 6. sıra filtreleri bile kullanabilirsiniz!
Çizim, ana döngüyü değiştirmemiz dışında önceki adımda bulunanla aynıdır. Filtreleri etkinleştirmek için btAudio::createFilter yöntemini kullanıyoruz. Bu yöntem 3 bağımsız değişkeni kabul eder. Birincisi, filtre kaskadlarının sayısıdır. Filtre basamaklarının sayısı, filtre sırasının yarısı kadardır. 6. dereceden bir filtre için ilk argüman 3 olmalıdır. 8. dereceden bir filtre için 4 olacaktır. İkinci argüman filtre kesmesidir. Veriler üzerinde gerçekten dramatik bir etki yaratmak için bunu 1000Hz'e ayarladım. Son olarak, üçüncü argümanla dosyalayıcının türünü belirtiriz. Bu, yüksek geçiren bir filtre için yüksek geçiren ve alçak geçiren bir filtre için alçak geçiren olmalıdır. Aşağıdaki komut dosyası bu frekansın kesimini 1000Hz ile 2Hz arasında değiştirir. Veriler üzerinde dramatik bir etki duymalısınız.
#Dahil etmek
btAudio ses = btAudio("ESP_Speaker"); geçersiz kurulum() { audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck,dout,ws); } geçersiz döngü() { gecikme(5000); audio.createFilter(3, 1000, yüksek geçiş); gecikme (5000); audio.createFilter(3, 2, yüksek geçiş); }
Alçak geçiren filtreler
Alçak geçiren filtreler, yüksek geçiren filtrelerin tersini yapar ve belirli bir frekansın üzerindeki frekansları bastırır. Üçüncü argümanın düşük geçişli olarak değiştirilmesini gerektirmeleri dışında, yüksek geçişli filtrelerle aynı şekilde uygulanabilirler. Aşağıdaki çizim için 2000Hz ve 20000Hz arasında alçak geçiş kesmesini değiştiriyorum. İnşallah farkı duyarsınız. Alçak geçiren filtre 2000Hz'deyken oldukça boğuk ses çıkarmalıdır.
#Dahil etmek
btAudio ses = btAudio("ESP_Speaker"); geçersiz kurulum() { audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck,dout,ws); } geçersiz döngü() { gecikme(5000); audio.createFilter(3, 2000, düşük geçiş); gecikme (5000); audio.createFilter(3, 20000, alçak geçiş); }
Adım 8: DSP - Dinamik Aralık Sıkıştırma
Arka plan
Dinamik aralık sıkıştırma, sesin yüksekliğini eşitlemeye çalışan bir sinyal işleme yöntemidir. Belli bir eşiğin üzerine çıkan yüksek sesleri, sessiz ses düzeyine sıkıştırır ve isteğe bağlı olarak her ikisini de yükseltir. Sonuç, çok daha eşit bir dinleme deneyimidir. Bu, çok yüksek fon müziği ve çok sessiz vokallerin olduğu bir program izlerken gerçekten işe yaradı. Bu durumda, yalnızca sesi artırmak yardımcı olmadı çünkü bu yalnızca arka plan müziğini güçlendirdi. Dinamik aralık sıkıştırma ile yüksek sesli fon müziğini vokal seviyesine indirebilir ve her şeyi tekrar düzgün duyabilirim.
kod
Dinamik aralık sıkıştırması sadece ses seviyesini düşürmeyi veya sinyali eşiklemeyi içermez. Bundan biraz daha zekice. Sesi düşürürseniz, yüksek sesler kadar sessiz sesler de azalır. Bunu aşmanın bir yolu, sinyali eşiklemektir, ancak bu, ciddi bozulmaya neden olur. Dinamik aralık sıkıştırma, sinyali eşiklemeniz/kırpmanız durumunda oluşacak bozulmayı en aza indirmek için yumuşak eşikleme ve filtrelemenin bir kombinasyonunu içerir. Sonuç, yüksek seslerin bozulma olmadan "kırpıldığı" ve sessiz olanların olduğu gibi bırakıldığı bir sinyaldir. Aşağıdaki kod, üç farklı sıkıştırma düzeyi arasında geçiş yapar.
- Distorsiyonlu sıkıştırma
- Bozulma olmadan sıkıştırma
- Sıkıştırma Yok
#Dahil etmek
btAudio ses = btAudio("ESP_Speaker"); geçersiz kurulum() { audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck,dout,ws); } geçersiz döngü() { gecikme(5000); audio.compress(30, 0.0001, 0.0001, 10, 10, 0); gecikme (5000); audio.compress(30, 0.0001, 0.1, 10, 10, 0); gecikme (5000); audio.decompress(); }
Dinamik aralık sıkıştırması karmaşıktır ve btAudio::compress yöntemlerinin birçok parametresi vardır. Bunları (sırasıyla) burada açıklamaya çalışacağım:
- Eşik - Sesin azaldığı seviye (desibel olarak ölçülür)
- Saldırı süresi - Eşiğin aşılmasından sonra kompresörün çalışmaya başlaması için geçen süre
- Serbest bırakma süresi - Kompresörün çalışmayı durdurması için geçen süre.
- Azaltma Oranı - sesin sıkıştırıldığı faktör.
- Diz Genişliği - Kompresörün kısmen çalıştığı (daha doğal ses) eşiğin etrafındaki genişlik (desibel olarak).
- Sıkıştırmadan sonra sinyale eklenen kazanç (desibel) (ses seviyesini artırma/azaltma)
Sıkıştırmanın ilk kullanımındaki çok duyulabilir bozulma, eşiğin çok düşük olması ve hem saldırı süresinin hem de bırakma süresinin çok kısa olması nedeniyle etkili bir şekilde sert bir eşikleme davranışına neden olur. Bu, ikinci durumda, serbest bırakma süresini artırarak açıkça çözülür. Bu, esasen kompresörün çok daha yumuşak bir şekilde hareket etmesine neden olur. Burada sadece 1 parametreyi değiştirmenin ses üzerinde nasıl dramatik bir etkisi olabileceğini gösterdim. Şimdi farklı parametrelerle deneme yapma sırası sizde.
Uygulama (sihirli matematik - isteğe bağlı)
Dinamik aralık sıkıştırmasını safça uygulamanın zor olduğunu gördüm. Algoritma, 16 bitlik bir tamsayıyı desibele dönüştürmeyi ve ardından sinyali işledikten sonra onu tekrar 16 bit tam sayıya dönüştürmeyi gerektirir. Bir kod satırının stereo verileri işlemesinin 10 mikrosaniye sürdüğünü fark ettim. 44,1 KHz'de örneklenen stereo ses DSP için yalnızca 11,3 mikrosaniye bıraktığından, bu kabul edilemez derecede yavaştır… Ancak, küçük bir arama tablosunu (400 bayt) ve Netwon'un bölünmüş farklılıklarına dayalı bir enterpolasyon prosedürünü birleştirerek 0,2 mikrosaniyede yaklaşık 17 bit kesinlik elde edebiliriz.. Gerçekten ilgilenenler için tüm matematik içeren bir pdf belgesi ekledim. Karmaşık, uyarıldınız!
9. Adım: Wifi Arayüzü
Artık gerçek zamanlı DSP çalıştırabilen bir Bluetooth alıcınız var. Ne yazık ki, DSP parametrelerinden herhangi birini değiştirmek istiyorsanız, HiFi'nizden bağlantınızı kesmeniz, yeni bir çizim yüklemeniz ve ardından yeniden bağlanmanız gerekecek. Bu tıknaz. Bunu düzeltmek için, bilgisayarınıza yeniden bağlanmadan tüm DSP parametrelerini düzenlemek için kullanabileceğiniz bir web sunucusu geliştirdim. Web sunucusunu kullanmak için taslak aşağıdadır.
#Dahil etmek
#include btAudio audio = btAudio("ESP_Speaker"); webDSP web; geçersiz kurulum() { Serial.begin(115200); audio.begin(); int bck = 26; int ws = 27; int dout = 25; audio. I2S(bck,dout,ws); // WiFi ID ve şifrenizle değiştirin const char* ssid = "SSID"; const char* şifre = "ŞİFRE"; web.begin(ssid, şifre, &ses); } geçersiz döngü() { web._server.handleClient(); }
Kod, ESP32'nize web sayfasına erişmek için kullanabileceğiniz bir IP adresi atar. Bu kodu ilk çalıştırdığınızda, bilgisayarınıza iliştirmiş olmalısınız. Bu şekilde seri monitörünüzde ESP32'nize atanan IP adresini görebilirsiniz. Bu web sayfasına erişmek istiyorsanız, bu IP adresini herhangi bir web tarayıcısına girmeniz yeterlidir (chrome'da test edilmiştir).
Şimdiye kadar Bluetooth ve I2S'yi etkinleştirme yöntemine aşina olmalıyız. Temel fark, bir webDSP nesnesinin kullanılmasıdır. Bu nesne, Wifi SSID'nizi ve parolanızı argüman olarak ve btAudio nesnesine bir işaretçi olarak alır. Ana döngüde, sürekli olarak webDSP nesnesinin web sayfasından gelen verileri dinlemesini ve ardından DSP parametrelerini güncellemesini sağlarız. Bir kapanış noktası olarak, ESP32'de hem Bluetooth hem de Wifi'nin aynı radyoyu kullandığına dikkat edilmelidir. Bu, web sayfasına parametreleri girdiğiniz andan bilgilerin gerçekten ESP32'ye ulaştığı ana kadar 10 saniyeye kadar beklemeniz gerekebileceği anlamına gelir.
Adım 10: Gelecek Planları
Umarım, bu talimattan keyif almışsınızdır ve şimdi HiFi'nize Bluetooth Ses ve DSP eklenmiştir. Bununla birlikte, bu projede büyüme için çok yer olduğunu düşünüyorum ve sadece ileride alabileceğim bazı yönlere dikkat çekmek istedim.
- Wifi ses akışını etkinleştirin (en iyi ses kalitesi için)
- Ses komutlarını etkinleştirmek için bir I2S mikrofonu kullanın
- WiFi kontrollü bir ekolayzır geliştirin
- Güzelleştirin (breadboard harika ürün tasarımı çığlık atmaz)
Bu fikirleri uygulamaya başladığımda daha fazla talimat vereceğim. Ya da belki bir başkası bu özellikleri uygular. Her şeyi açık kaynak yapmanın sevinci bu!
Önerilen:
YADPF (Yine Başka Bir Dijital Resim Çerçevesi): 7 Adım (Resimlerle)
YADPF (YET Başka Dijital Resim Çerçevesi): Biliyorum bu yeni bir şey değil, biliyorum, burada bu projelerden bazılarını gördüm ama hep kendi dijital resim çerçevemi yapmak istemişimdir. Gördüğüm tüm Resim çerçeveleri güzel, ama başka bir şey arıyordum, gerçekten güzel bir çerçeve arıyorum
Gen4 ULCD-43DCT-CLB Kullanan Dijital Resim Çerçevesi: 3 Adım
Gen4 ULCD-43DCT-CLB Kullanan Dijital Resim Çerçevesi: Dijital Resim Çerçevesi, bir mikro SD karta erişimi olan görüntüleri gösterebilir. Bu proje, ekran modülü için 4D Systems, Gen4 uLCD-43DCT-CLB kullanıyor. Dijital Resim Çerçevesi, ev veya ofisler için ekran olarak kullanılabilecek basit bir projedir. Kullanıcılar pe
Dijital Resim Çerçevesi Numero Dos!: 4 Adım (Resimlerle)
Dijital Resim Çerçevesi Numero Dos!: Bu yaptığım ikinci dijital resim çerçevesi (bkz. Ucuz 'n Easy Dijital Resim Çerçevesi). Bunu çok yakın bir arkadaşıma düğün hediyesi olarak yaptım ve bence çok iyi oldu. Verilen dijital resim çerçevelerinin maliyeti
Raspberry Pi Dijital Resim Çerçevesi: 5 Adım
Raspberry Pi Dijital Resim Çerçevesi: 10 yıl sonra mağazadan aldığım dijital resim çerçevem arızalandı. Çevrimiçi olarak bir yedek parça aradım ve karşılaştırılabilir bir değiştirmenin aslında 10 yaşındaki çerçevemden daha pahalıya mal olduğunu gördüm. Şimdiye kadar pratikte özgür olacaklarını düşündüm. Açıkçası yapabilirim
Dijital Fotoğraf Resim Çerçevesi, WiFi Bağlantılı – Raspberry Pi: 4 Adım (Resimli)
Dijital Fotoğraf Resim Çerçevesi, WiFi Bağlantılı – Raspberry Pi: Bu, bir (ücretsiz) dosya aktarım programı kullanarak 'tıkla ve sürükle' yoluyla WiFi üzerinden fotoğraf ekleme/kaldırma avantajıyla, bir dijital fotoğraf çerçevesine giden çok kolay ve düşük maliyetli bir yoldur. . Küçük £4,50 Pi Zero ile güçlendirilebilir. Ayrıca aktarabilirsiniz