विषयसूची:

Arduino और DAC के साथ ऑडियो साउंड फाइल्स (WAV) बजाना: 9 कदम
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (WAV) बजाना: 9 कदम

वीडियो: Arduino और DAC के साथ ऑडियो साउंड फाइल्स (WAV) बजाना: 9 कदम

वीडियो: Arduino और DAC के साथ ऑडियो साउंड फाइल्स (WAV) बजाना: 9 कदम
वीडियो: Arduino Audio Output 2024, जुलाई
Anonim
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (Wav) बजाना
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (Wav) बजाना
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (Wav) बजाना
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (Wav) बजाना
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (Wav) बजाना
Arduino और DAC के साथ ऑडियो साउंड फाइल्स (Wav) बजाना

अपने ऑडिनो एसडी कार्ड से wav फ़ाइल ऑडियो चलाएं। यह निर्देश आपको दिखाएगा कि आपके SdCard पर एक wav फ़ाइल को एक साधारण सर्किट के माध्यम से एक स्पीकर में कैसे चलाया जा सकता है।

WAV फ़ाइल 8 बिट मोनो होनी चाहिए। मुझे ४४ किलोहर्ट्ज़ फ़ाइलें चलाने में कोई समस्या नहीं हुई है।

जबकि उच्च-निष्ठा नहीं, ध्वनि की गुणवत्ता बहुत संतोषजनक है।

सीरियल मॉनिटर का उपयोग फ़ाइल का चयन करने के लिए किया जाता है। फ़ाइलें एडलॉग नामक फ़ोल्डर में होनी चाहिए।

यह निर्देश पहले के एक प्रोजेक्ट से मिलता है जहाँ मैंने WAV रिकॉर्डिंग को SdCard में सहेजा था:

सर्किट एक सस्ते 8 बिट डिजिटल से एनालॉग कनवर्टर (डीएसी) और एक सिंगल चिप ऑडियो एम्पलीफायर का उपयोग करता है।

व्यवधान स्थापित करने के लिए मुख्य खंड अमांडा घासेई के उत्कृष्ट लेख से लिए गए थे:

चरण 1: आवश्यकताएँ

आवश्यकताएं
आवश्यकताएं
आवश्यकताएं
आवश्यकताएं

Arduino- मैं मेगा का उपयोग करता हूं, हालांकि ऐसा कोई कारण नहीं है कि ऊनो को काम नहीं करना चाहिए।

SdCard रीडर- प्रोग्राम निम्न के लिए कॉन्फ़िगर किया गया है: माइक्रोएसडी ब्रेकआउट बोर्ड लॉजिक कन्वर्जन के साथ विनियमित V2

SdCard सेटअप विवरण के लिए यह निर्देश देखें:

DAC0832 LCN- एनालॉग कनवर्टर के लिए एक उत्कृष्ट 8 बिट डिजिटल- कुछ पाउंड।

LM386 N-1 Op amp- चिप्स के रूप में सस्ता

20 रास्ता चिप सॉकेट

8 रास्ता चिप सॉकेट

9 वोल्ट बिजली की आपूर्ति- एक बैटरी करेगी।

एलएम३३६ २.५ वी वोल्टेज संदर्भ

10uF संधारित्र * 3 (9V से अधिक कोई भी वोल्टेज)

10 ओम रोकनेवाला

50nF कैपेसिटर- (या कहीं-कहीं-47nF, 56nf, 68nf- करेगा)

220uF संधारित्र

64 ओम स्पीकर

10K रैखिक पोटेंशियोमीटर

Arduino और सर्किट के बीच 8 डेटा लाइनों को जोड़ने के लिए केबल-

ऊनो पर 8 कनेक्शन लाइन में हैं, मेगा पर वे जोड़े में हैं।

मेगा पर मैंने 10 तरह के IDC हेडर के साथ 10 तरह के रिबन केबल का इस्तेमाल किया। (2 तार अतिरिक्त हैं)

0V, 9V और DAC आउट के लिए सॉकेट कनेक्टर

कॉपर स्ट्रिप बोर्ड, सोल्डर, वायर, कटर आदि

चरण 2: निर्दिष्टीकरण

निर्दिष्टीकरण
निर्दिष्टीकरण

115200 बॉड पर सीरियल सेट।

मेगा का उपयोग करके हॉबीट्रॉनिक्स माइक्रोएसडी ब्रेकआउट बोर्ड के लिए समर्थन मौजूद है। चिप चयन और अन्य पोर्ट मेगा और यूनो के बीच बदल जाएंगे।

Wav फाइलें एडलॉग नामक निर्देशिका में मौजूद होनी चाहिए- इसे कुछ और नाम देने के लिए स्वतंत्र महसूस करें और आवश्यक कोडिंग को फिर से व्यवस्थित करें।

WAV फ़ाइल 8 बिट मोनो होनी चाहिए। मैंने 44KHz तक का परीक्षण किया है।

सीरियल मॉनिटर एडलॉग फोल्डर में wav फाइल्स को प्रदर्शित करता है। फ़ाइल नाम मॉनिटर आउटपुट लाइन से भेजे जाते हैं।

फ़ाइल का आकार केवल SdCard आकार द्वारा सीमित है।

चरण 3: आरंभ करना

शुरू करना
शुरू करना

एसडी कार्ड रीडर कनेक्ट करें। ये मेगा के लिए कनेक्शन हैं।

0, 5वी

52. पिन करने के लिए CLK

D0 से पिन 50

D1 पिन करने के लिए 51

53. पिन करने के लिए सीएस

(यूनो पोर्ट कनेक्शन के लिए आपूर्तिकर्ता वेबसाइट देखें)

आप यह जांचना चाहेंगे कि आपका कार्ड इस स्तर पर काम करता है- विक्रेता द्वारा आपूर्ति की गई स्क्रिप्ट का उपयोग करें।

हमें एक छोटा सर्किट बनाने की जरूरत है।

हम Arduino से ऑडियो बाइट्स की एक स्ट्रीम भेजने जा रहे हैं।

ये संख्या 0 और 255 के बीच हैं। वे वोल्टेज का प्रतिनिधित्व करते हैं।

मौन 127-128 है।

255 स्पीकर कोन हार्ड वन वे है।

0 दूसरी तरफ स्पीकर कोन हार्ड है।

इसलिए ऑडियो को सहेजे गए नंबरों के रूप में रिकॉर्ड किया जाता है, जो अलग-अलग वोल्टेज बनाते हैं, जो मूविंग स्पीकर कोन बनाते हैं।

हम एक "पोर्ट" का उपयोग करके, एक साथ, Arduino पर 8 लाइनों में से नंबर भेज सकते हैं।

यदि हम 8 लाइनों को डिजिटल से एनालॉग कनवर्टर में फीड करते हैं, तो यह वही करता है जो वह टिन पर कहता है और एक एनालॉग वोल्टेज उत्पन्न करता है जो डिजिटल नंबर के समानुपाती होता है।

इसके बाद हमें बस इतना करना है कि वोल्टेज को एक छोटे ऑपरेशनल एम्पलीफायर और फिर एक स्पीकर में पैक कर दिया जाए।

चरण 4: छोटा सर्किट

छोटा सर्किट
छोटा सर्किट
छोटा सर्किट
छोटा सर्किट
छोटा सर्किट
छोटा सर्किट
छोटा सर्किट
छोटा सर्किट

DAC0832 LCN

यह एक शानदार, सस्ता 8 बिट डिजिटल से एनालॉग कनवर्टर है। (डीएसी)

इसे डेटा होल्ड, डेटा नमूना लाइनों की एक सरणी के साथ पूरी तरह से नियंत्रित किया जा सकता है।

या इसे "फ्लो थ्रू ऑपरेशन" में स्वचालित रूप से करने के लिए सेटअप किया जा सकता है।

मैनुअल उद्धृत करने के लिए:

केवल CS, WR1, WR2, और XFER की ग्राउंडिंग और ILE को उच्च बांधने से दोनों आंतरिक रजिस्टरों को लागू डिजिटल इनपुट (फ्लो-थ्रू) का पालन करने और सीधे DAC एनालॉग आउटपुट को प्रभावित करने की अनुमति मिलती है।

ठीक है कि चिप सेट के चार कनेक्शन कम हैं और एक सेट 9V - आसान है।

हम कोई नकारात्मक वोल्टेज नहीं चाहते हैं इसलिए मैनुअल कहता है कि हमें "वोल्टेज स्विचिंग मोड" का उपयोग करना चाहिए और वे आरेख की आपूर्ति करते हैं।

हमें केवल उनके द्वारा सुझाए गए ऑडियो के बजाय एक छोटा ऑडियो amp बदलने की आवश्यकता है।

LM386-N ऑडियो Amp

एम्प का मैनुअल न्यूनतम भागों का आरेख प्रदान करता है- 20 का लाभ प्रदान करता है (हमारे लिए बहुत अधिक-लेकिन इसका वॉल्यूम नियंत्रण है)।

हमें केवल DAC और amp के बीच एक संधारित्र जोड़ने की आवश्यकता है ताकि हम केवल AC संकेतों को बढ़ा सकें।

हमें अपने प्रत्येक चिप्स की आपूर्ति पिन के पास कुछ कैपेसिटर भी जोड़ने चाहिए अन्यथा हम अपनी 9वी आपूर्ति से गुनगुनाएंगे।

चरण 5: सोल्डरिंग आयरन से बाहर निकलें

सोल्डरिंग आयरन से बाहर निकलें
सोल्डरिंग आयरन से बाहर निकलें
सोल्डरिंग आयरन से बाहर निकलें
सोल्डरिंग आयरन से बाहर निकलें
सोल्डरिंग आयरन से बाहर निकलें
सोल्डरिंग आयरन से बाहर निकलें

जैसा कि सर्किट सरल है, मेरा इरादा ब्लो अकाउंट से झटका देने का नहीं है।

यहाँ कुछ संकेत दिए गए हैं:

  • कॉपर स्ट्रिप बोर्ड का एक टुकड़ा कम से कम 28 गुणा 28 छेद करके तैयार करें। (हां, मुझे पता है कि ब्रेन सर्जन इसे छोटा कर सकते हैं)
  • यदि आप इसे शिकंजा के साथ बढ़ाना चाहते हैं, तो शुरुआत में उन्हें अनुमति दें!
  • चिप्स को सॉकेट्स पर माउंट करें। चिप्स तभी डालें जब सब कुछ चेक हो गया हो।
  • इनपुट वायर को आउटपुट से दूर रखें।
  • कैपेसिटर के लिए सही ध्रुवता का निरीक्षण करें।
  • LM336 वोल्टेज संदर्भ के आधार दृश्य के लिए आरेख देखें। एडजस्ट लेग का उपयोग नहीं किया जाता है और इसे काटा जा सकता है।
  • DAC के 8 पिन करने के लिए सीधा कनेक्शन नोट करें- यह परीक्षण के लिए बहुत उपयोगी है।
  • मैं ऑडिनो से रिबन केबल और 10 तरह के आईडीसी कनेक्टर के साथ जुड़ा था।
  • Uno पर कनेक्शन एक सीधी रेखा में हैं - आप पा सकते हैं कि 8 इनपुट कनेक्शन को एक सीधी रेखा में व्यवस्थित करने से आप Arduino को खरीदे गए, तैयार किए गए 8 वे कनेक्टर के साथ लिंक कर सकते हैं,

जब यह हो जाए- सोल्डरिंग की जांच करें और तांबे की पटरियों के बीच अंतराल की जांच करें।

मुझे मलबे को साफ करने के लिए 36 टीपीआई जूनियर हैक ब्लेड बहुत उपयोगी लगता है। मैं ब्लेड का पता लगाने वाले पिन को हटाता हूं और ब्लेड की नोक को ट्रैक में स्लाइड करता हूं- जाहिर है कि ब्लेड एक फ्रेम में नहीं है।

चरण 6: डीएसी का परीक्षण

डीएसी का परीक्षण
डीएसी का परीक्षण

सर्किट और Arduino के बीच के कनेक्शन को छोड़ दें।

अपने सर्किट पर वॉल्यूम नियंत्रण को बीच में सेट करें।

9वी डीसी पावर को अपने नए सर्किट पर स्विच करें।

जांचें कि सर्किट ठीक है- मैं आपके सर्किट के लिए कोई दायित्व स्वीकार नहीं कर सकता!

बिजली बंद।

अपने सर्किट को Arduino से कनेक्ट करें।

मेगा पर 22-29 पिन का उपयोग करें। (पोर्टा) ऊपर के दो ५वी पिनों में गलती न करें!

ऊनो पर 0-7 पिन का उपयोग करें। यह पोर्टडी है

अपनी बिजली आपूर्ति के 0V को Arduino पर 0V से कनेक्ट करें।

शक्तिप्रापक।

यह परीक्षण कार्यक्रम खोलें DAC_TEST

UNO के लिए, PORTA के सभी संदर्भों को PORTD में बदलें

DDRA को DDRD से बदलें- यह निर्देश सभी 8 लाइनों को एक बार में आउटपुट पर सेट करता है। यह डेटा दिशा रजिस्टर है।

अपने सीरियल मॉनिटर को 115200 पर सेट करें।

DAC आउट और OV. के बीच एक वोल्टमीटर कनेक्ट करें

कार्यक्रम आउटपुट को 255- सभी लाइनों पर - अधिकतम वोल्टेज पर सेट करेगा।

आउटपुट 128- आधा अधिकतम वोल्टेज।

आउटपुट 0- शून्य वोल्टेज (या शायद लगभग शून्य)।

इसके बाद यह बिटवाइज़ कदम उठाएगा: 1, 2, 4, 8, 16, 32, 64, 128

वोल्टेज लगातार बढ़ना चाहिए।

यदि संख्या बढ़ने पर वोल्टेज वापस गिर जाता है, तो संभवतः आपके पास दो इंटरकनेक्टिंग तार उलट हो जाते हैं।

वोल्टेज बदलने पर आपको स्पीकर को चुपचाप क्लिक करते हुए भी सुनना चाहिए

चरण 7: Wav हैडर पढ़ना

वाव हैडर पढ़ना
वाव हैडर पढ़ना

Wav फ़ाइलें एक निर्दिष्ट आवृत्ति और डेटा आकार के साथ सहेजी जाती हैं।

यह जानकारी एक WAV फ़ाइल की शुरुआत में 44 बाइट शीर्षलेख में निहित है।

हालांकि कुछ सॉफ़्टवेयर हेडर (बाइट 35 के बाद) का विस्तार करते हैं, जिससे डेटा आकार के स्थान का पता लगाना अधिक कठिन हो जाता है।

हेडर पढ़ने के लिए हम एक बफर बनाते हैं और फाइल की शुरुआत को कॉपी करते हैं।

फ़्रीक्वेंसी को फ़ाइल में 24 बाइट्स से शुरू करके 4 बाइट्स में संग्रहीत किया जाता है।

// WAV फ़ाइल हेडर में निर्दिष्ट आवृत्ति पढ़ें

बाइट हेडबफ [60]

tempfile.seek (0);

tempfile.read (हेडबफ, 60);

रिटवल = हेडबफ [27];

रिटवल=(रिटवल<<8) | हेडबफ [26];

रिटवल=(रिटवल<<8) | हेडबफ [25];

रिटवल=(रिटवल<<8) | हेडबफ [24];

सीरियल.प्रिंट (एफ ("फाइल फ्रीक्वेंसी"));

सीरियल.प्रिंट (रिटवल);

डेटा आकार की जानकारी खोजने का सबसे अच्छा तरीका हैडर में "डेटा" शब्द की खोज करना है।

फिर इसके बाद 4 बाइट्स निकालें, जो लंबे मान को बनाते हैं

अहस्ताक्षरित लंबी वापसी;

इंट मायपोस = ४०;

के लिए (int i=36; i<60;i++) {

अगर (हेडबफ == 'डी') {

अगर (हेडबफ [i + 1] == 'ए') {

अगर (हेडबफ [i + 2] == 'टी') {

अगर (हेडबफ [i+3] == 'ए') {

// अंत में हमारे पास यह है

मायपोस = आई+4;

मैं = ६०;

}

}

}

}

}

tempfile.seek (mypos);

रिटवल = हेडबफ [मायपोस + 3];

रिटवल=(रिटवल<<8) | हेडबफ [मायपोस+2];

रिटवल=(रिटवल<<8) | हेडबफ [मायपोस+1];

रिटवल=(रिटवल<<8) | हेडबफ [मायपोस];

ठीक है, हमारे पास डेटा की लंबाई और आवृत्ति है!

ऑडियो डेटा डेटा लंबाई मान बनाने वाले 4 बाइट्स का अनुसरण करता है।

चरण 8: इंटरप्ट, इंटरप्ट…।

बाधित, बाधित…
बाधित, बाधित…

हम फ़्रीक्वेंसी जानकारी का उपयोग आवश्यक फ़्रीक्वेंसी पर या उसके निकट सॉफ़्टवेयर इंटरप्ट बनाने के लिए करते हैं।

रुकावट को हमेशा ठीक से सेट नहीं किया जा सकता है, लेकिन यह पर्याप्त है। फ़ाइल से पढ़ी जाने वाली आवृत्ति को सेटइंट्रप्ट सबरूटीन में भेज दिया जाता है।

शून्य सेटिंट्रुप्ट (फ्लोट फ्रीक) {फ्लोट बिटवल = 8; // 8 8 बिट टाइमर के लिए 0 और 2, 1024 टाइमर 1 बाइट के लिए

सेटोक्रोआ = (१६००००००/(फ्रीक * बिटवल)) - ०.५;

// सेटोक्रोआ मान को -1 के घटाव की आवश्यकता होती है। हालांकि 0.5 राउंड को निकटतम 0.5. में जोड़ना

// टाइमर का रिज़ॉल्यूशन सीमित है

// अंततः बिटवाल के परिमाण द्वारा निर्धारित किया जाता है

क्ली (); // इंटरप्ट को अक्षम करें // टाइमर 2 इंटरप्ट सेट करें

टीसीसीआर2ए = 0; // पूरे TCCR2A रजिस्टर को 0. पर सेट करें

टीसीसीआर२बी = ०; // TCCR2B के लिए समान

टीसीएनटी2 = 0; // काउंटर वैल्यू को 0. पर इनिशियलाइज़ करें

// आवृत्ति (एचजेड) वृद्धि के लिए मैच रजिस्टर की तुलना करें

OCR2A = सेटोक्रोआ; // = (16*10^6) / (आवृत्ति*8) - 1 (होना चाहिए <256)

// सीटीसी मोड चालू करें

TCCR2A |= (1 << WGM21); // 8 प्रीस्कूलर के लिए CS21 बिट सेट करें

टीसीसीआर२बी |= (१ << सीएस२१); // टाइमर सक्षम करें इंटरप्ट की तुलना करें

// TIMSK2 |= (1 << OCIE2A); // यह काम करता है, जैसा कि निम्न पंक्ति करता है

एसबीआई (TIMSK2, OCIE2A); // टाइमर 2 पर इंटरप्ट सक्षम करें

सेई (); // इंटरप्ट सक्षम करें

समझदार पाठकों ने देखा होगा sbi (TIMSK2, OCIE2A)

मैंने रजिस्टर बिट्स को सेट करने और साफ़ करने के लिए कुछ (इंटरनेट अधिग्रहित) फ़ंक्शन सेट किए हैं:

// रजिस्टर बिट्स को साफ़ करने के लिए परिभाषित करता है#ifndef cbi

# परिभाषित करें cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

#अगर अंत

// रजिस्टर बिट्स को सेट करने के लिए परिभाषित करें

#ifndef एसबीआई

# परिभाषित एसबीआई(एसएफआर, बिट) (_SFR_BYTE(sfr) |= _BV(बिट))

#अगर अंत

ये फ़ंक्शन इंटरप्ट को सेट या साफ़ करने के लिए एक आसान कॉल प्रदान करते हैं।

तो रुकावट चल रही है, हम इसे क्या कर सकते हैं?

चरण 9: व्यवधान और डबल बफरिंग

व्यवधान और डबल बफरिंग
व्यवधान और डबल बफरिंग
व्यवधान और डबल बफरिंग
व्यवधान और डबल बफरिंग

22 Khz पर हर 0.045 ms. पर एक बाइट ऑडियो डेटा आउटपुट होता है

512 बाइट्स (बफर आकार) 2.08 एमएस में पढ़ा जाता है।

तो बफर को एसडीकार्ड से एक लेखन चक्र में नहीं पढ़ा जा सकता है।

हालाँकि 512 बाइट्स पोर्ट को 23.22ms में लिखे जाते हैं।

तो हमें बस इतना करना है कि हर बार बफर खाली होने पर एक नई फाइल को पढ़ना है और नए डेटा ब्लॉक की आवश्यकता होने से पहले डेटा प्राप्त करने के लिए हमारे पास पर्याप्त समय है … मान लीजिए कि हम दो बफर का उपयोग करते हैं, एक को खाली करते समय हम दूसरे को भरते हैं।

यह डबल बफरिंग है।

फ़ाइल को बार-बार बाधित करने से फ़ाइल धीमी हो जाएगी, लेकिन यह हो जाएगा।

मैंने बुफ़ा और बफ़ब नामक दो 512 बाइट बफ़र्स सेटअप किए हैं।

यदि ध्वज क्षेत्र सत्य है तो हम पोर्टा से पढ़ते हैं अन्यथा हम पोर्टब से पढ़ते हैं

जब बफ़र स्थिति (बफ़काउंट) बफ़र आकार (BUF_SIZE 512) तक पहुँच जाती है, तो हम एक फ़्लैग सेट करते हैं जिसे रीडिट कहा जाता है।

शून्य लूप रूटीन इस ध्वज को ढूंढता है और एक ब्लॉक पढ़ना शुरू करता है:

अगर (पढ़ें) {अगर (! क्षेत्र में) {

// एसडीकार्ड ब्लॉक को बुफा को पढ़ने के लिए आरंभ करें

tempfile.read (बुफा, BUF_SIZE);

} अन्यथा {

// एसडीकार्ड ब्लॉक को bufb में पढ़ें

tempfile.read (bufb, BUF_SIZE);

}

रीडिट = झूठा;

}

जब यह नियमित झंडे को समाप्त कर देता है तो readit=false ।

इंटरप्ट रूटीन के भीतर हमें यह जांचना होगा कि रीडिट == गलत है या नहीं, यह जांच कर शून्य लूप समाप्त हो गया है।

ऐसा होने पर हम संकेत देते हैं कि एक और रीड की आवश्यकता है और बफ़र्स को स्विच करने के लिए एरिया फ़्लैग को टॉगल करें।

अगर एसडीकार्ड अभी भी पढ़ रहा है तो हमें एक रीडिंग (काउंटर--; बफकाउंट--;) को ट्रैक करना होगा और बाद में फिर से प्रयास करने के लिए इंटरप्ट से बाहर निकलना होगा। (ऑडियो आउटपुट सिग्नल में क्लिक का मतलब है कि ऐसा हुआ है।)

जब सभी डेटा पढ़ा जाता है तो रुकावट रद्द हो जाती है, पोर्ट 128 के मध्य वोल्टेज मान पर फिर से सेट हो जाता है और ऑडियो फ़ाइल बंद हो जाती है।

पहली बार dac2.ino स्क्रिप्ट चलाने से पहले, अपना वॉल्यूम 50% पर सेट करें। यह बहुत ज़ोरदार होगा, लेकिन यह १००% से बेहतर है!

यदि आपका वॉल्यूम नियंत्रण 10K पोटेंशियोमीटर के विपरीत छोर पर लीड को रिवर्स स्वैप में काम करता है।

मुझे बताएं कि यह कैसा लगता है।

सिफारिश की: