Სარჩევი:

აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით: 9 ნაბიჯი
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით: 9 ნაბიჯი

ვიდეო: აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით: 9 ნაბიჯი

ვიდეო: აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით: 9 ნაბიჯი
ვიდეო: MP3-ის გადაქცევა MIDI/WAV-ში - MP3-ის გადაქცევა MIDI/WAV-ად 2024, ივლისი
Anonim
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით
აუდიო ხმის ფაილების დაკვრა (Wav) არდუინოთი და DAC– ით

დაუკარით wav ფაილი აუდიო თქვენი Audino SD ბარათიდან. ეს ინსტრუქცია გაჩვენებთ, თუ როგორ შეიძლება wav ფაილის თქვენს SdCard– ზე დაკვრა სპიკერის მარტივი წრიულის საშუალებით.

Wav ფაილი უნდა იყოს 8 ბიტიანი მონო. 44 KHz ფაილების დაკვრის პრობლემა არ მქონია.

მიუხედავად იმისა, რომ არ არის მაღალი ერთგულება, ხმის ხარისხი ძალიან დამაკმაყოფილებელია.

სერიული მონიტორი გამოიყენება ფაილის შესარჩევად. ფაილები უნდა იყოს საქაღალდეში სახელწოდებით adlog.

ეს ინსტრუქცია გამომდინარეობს წინა პროექტიდან, სადაც შევინახე wav ჩანაწერები SdCard– ში:

მიკროსქემში გამოიყენება იაფი 8 ბიტიანი ციფრული ანალოგური გადამყვანი (DAC) და ერთი ჩიპის აუდიო გამაძლიერებელი.

შეფერხებების შესაქმნელად ძირითადი განყოფილებები ამოღებულია ამანდა გასასის შესანიშნავი სტატიიდან:

ნაბიჯი 1: მოთხოვნები

მოთხოვნები
მოთხოვნები
მოთხოვნები
მოთხოვნები

არდუინო- მე მეგას ვიყენებ, თუმცა არ არსებობს მიზეზი, რის გამოც Uno არ უნდა მუშაობდეს.

SdCard მკითხველი-პროგრამა კონფიგურებულია შემდეგით: MicroSD Breakout Board რეგულირდება Logic Conversion V2

იხილეთ ეს ინსტრუქცია SdCard– ის დაყენების დეტალებისთვის:

DAC0832 LCN- შესანიშნავი 8 ბიტიანი ციფრული ანალოგური გადამყვანი- რამდენიმე ფუნტი.

LM386 N-1 Op amp- იაფი ჩიპების სახით

20 გზის ჩიპის სოკეტი

8 გზის ჩიპის სოკეტი

9 ვოლტიანი ელექტროენერგიის მიწოდება- ბატარეა იმუშავებს.

LM336 2.5 V ძაბვის მითითება

10uF კონდენსატორი * 3 (ნებისმიერი ძაბვა 9 ვ -ზე მეტი)

10 ohm რეზისტორი

50nF კონდენსატორი- (ან სადღაც -47nF, 56nf, 68nf- გააკეთებს)

220uF კონდენსატორი

64 ohm სპიკერი

10K ხაზოვანი პოტენომეტრი

კაბელი აკავშირებს 8 მონაცემთა ხაზს არდუინოსა და წრეს შორის-

Uno– ზე 8 კავშირი რიგშია, მეგაზე ისინი წყვილებშია.

მეგაზე მე გამოვიყენე 10 გზის ლენტიანი კაბელი 10 გზის IDC სათაურით. (2 მავთული არის სათადარიგო)

Socket კონექტორები 0V, 9V და DAC გარეთ

სპილენძის ზოლის დაფა, შედუღება, მავთული, საჭრელი და ა

ნაბიჯი 2: სპეციფიკაციები

სპეციფიკაციები
სპეციფიკაციები

სერიალი 115200 ბაუდი.

არსებობს მხარდაჭერა Hobbytronics MicroSD Breakout Board– ს მეგას გამოყენებით. ჩიპის არჩევა და სხვა პორტები შეიცვლება მეგასა და უნოს შორის.

Wav ფაილები უნდა არსებობდეს დირექტორიაში, სახელწოდებით adlog- მოგერიდებათ დაასახელოთ სხვა რამ და ხელახლა მოაწყოთ საჭირო კოდირება.

Wav ფაილი უნდა იყოს 8 ბიტიანი მონო. მე გამოვცადე 44KHz– მდე.

სერიული მონიტორი აჩვენებს wav ფაილებს adlog საქაღალდეში. ფაილის სახელები იგზავნება მონიტორის გამომავალი ხაზიდან.

ფაილის ზომა შემოიფარგლება მხოლოდ SdCard ზომით.

ნაბიჯი 3: დაწყება

Ვიწყებთ
Ვიწყებთ

შეაერთეთ SD ბარათის მკითხველი. ეს არის კავშირები მეგასთვის.

0, 5V

CLK პინზე 52

D0 50 – მდე

D1 to pin 51

CS პინზე 53

(იხილეთ მომწოდებლების ვებ გვერდი Uno პორტის კავშირისთვის)

თქვენ გსურთ შეამოწმოთ, რომ თქვენი ბარათი მუშაობს ამ ეტაპზე- გამოიყენეთ გამყიდველის მიერ მოწოდებული სკრიპტები.

ჩვენ უნდა გავაკეთოთ პატარა წრე

ჩვენ ვაპირებთ არდუინოს აუდიო ბაიტების ნაკადის გაგზავნას.

ეს რიცხვები 0 -დან 255 -მდეა. ისინი წარმოადგენენ ძაბვას.

სიჩუმეა 127-128 წწ.

255 დინამიკის კონუსი რთულია ერთი მიმართულებით.

0 არის დინამიკის კონუსი ძნელად სხვა მხრივ.

ასე რომ, აუდიო ჩაწერილია როგორც შენახული რიცხვები, რომლებიც ქმნიან სხვადასხვა ძაბვას, რაც ქმნის მოძრავი დინამიკების კონუსებს.

ჩვენ შეგვიძლია გავგზავნოთ რიცხვები 8 სტრიქონიდან არდუინოზე, ერთდროულად, "პორტის" გამოყენებით.

თუ ჩვენ 8 სტრიქონს ვიკვებებთ ციფრულ ანალოგურ გადამყვანად, ის აკეთებს იმას, რასაც ამბობს კალის შესახებ და აწარმოებს ანალოგიურ ძაბვას, რომელიც პროპორციულია ციფრული რიცხვისა.

ჩვენ მხოლოდ ის უნდა გავაკეთოთ, რომ დავამუხტოთ ძაბვა მცირე საოპერაციო გამაძლიერებელზე და შემდეგ დინამიკზე.

ნაბიჯი 4: მცირე წრე

მცირე წრე
მცირე წრე
მცირე წრე
მცირე წრე
მცირე წრე
მცირე წრე
მცირე წრე
მცირე წრე

DAC0832 LCN

ეს არის შესანიშნავი, იაფი 8 ბიტიანი ციფრული ანალოგური გადამყვანი. (DAC)

მისი სრულად კონტროლი შესაძლებელია მონაცემთა შენახვის მასივის, მონაცემთა ნიმუშის ხაზების გამოყენებით.

ან შეიძლება იყოს დაყენებული, რომ ეს ყველაფერი ავტომატურად გაკეთდეს "ოპერაციის გავლით".

სახელმძღვანელოს ციტირებისთვის:

CS, WR1, WR2 და XFER უბრალოდ დასაბუთება და ILE მაღალი მიბმა საშუალებას აძლევს ორივე შიდა რეესტრს დაიცვან გამოყენებული ციფრული საშუალებები (გადინება) და პირდაპირ იმოქმედონ DAC ანალოგურ გამომავალზე.

კარგი, ეს არის ოთხი კავშირი ჩიპთან დაბალი და ერთი კომპლექტი 9V - ადვილი.

ჩვენ არ გვინდა რაიმე უარყოფითი ძაბვის გამოსვლა, ამიტომ სახელმძღვანელოში ნათქვამია, რომ ჩვენ უნდა გამოვიყენოთ "ძაბვის გადართვის რეჟიმი" და ისინი გვაწვდიან დიაგრამას.

ყველაფერი რაც ჩვენ გვჭირდება არის შეცვალოთ პატარა აუდიო გამაძლიერებელი ნაცვლად იმისა, რასაც ისინი გვთავაზობენ.

LM386-N აუდიო გამაძლიერებელი

Amp– ის სახელმძღვანელო შეიცავს ნაწილების მინიმალურ დიაგრამას- უზრუნველყოფს მოგებას 20 – ით (ჩვენთვის ძალიან ბევრია, მაგრამ მას აქვს მოცულობის კონტროლი).

ყველაფერი რაც ჩვენ გვჭირდება არის დავამატოთ კონდენსატორი DAC- სა და გამაძლიერებელს შორის ისე, რომ ჩვენ მხოლოდ გავაძლიეროთ AC სიგნალები.

ჩვენ ასევე უნდა დავამატოთ რამდენიმე კონდენსატორი თითოეული ჩვენი ჩიპის მიწოდების პინთან ახლოს, წინააღმდეგ შემთხვევაში ჩვენ ვიღებთ ზუმბს ჩვენი 9 ვ მარაგიდან.

ნაბიჯი 5: გამოდით გამდნარი რკინიდან

გამოდით გამდნარი რკინიდან
გამოდით გამდნარი რკინიდან
გამოდით გამდნარი რკინიდან
გამოდით გამდნარი რკინიდან
გამოდით გამდნარი რკინიდან
გამოდით გამდნარი რკინიდან

რადგან წრე მარტივია, არ ვაპირებ დარტყმის მიყენებას.

აქ მოცემულია რამდენიმე მითითება:

  • მოამზადეთ სპილენძის ფირფიტის ნაჭერი მინიმუმ 28 x 28 ხვრელით. (დიახ, მე ვიცი, რომ ტვინის ქირურგებს შეუძლიათ მისი შემცირება)
  • თუ თქვენ აპირებთ მისი ხრახნებით დამონტაჟებას, დაუშვით ისინი თავიდან!
  • დაამონტაჟეთ ჩიპი სოკეტებზე. ჩიპები ჩადეთ მხოლოდ მაშინ, როდესაც ყველაფერი შემოწმებულია.
  • შეინახეთ შეყვანის მავთულები გამომავალიდან.
  • დააკვირდით კონდენსატორების სწორ პოლარობას.
  • იხილეთ დიაგრამა LM336 ძაბვის მითითების ძირითადი ხედისათვის. მორგებული ფეხი არ გამოიყენება და მისი მოჭრა შესაძლებელია.
  • ყურადღება მიაქციეთ DAC– ის პინ 8 – ის პირდაპირ კავშირს- ეს ძალზე სასარგებლოა ტესტირებისთვის.
  • აუდინოს დავუკავშირდი ლენტი კაბელით და 10 გზის IDC კონექტორით.
  • Uno– ზე კავშირები არის სწორი ხაზით - თქვენ შეიძლება აღმოაჩინოთ, რომ 8 შეყვანის კავშირის ერთ პირდაპირ ხაზში მოწყობა საშუალებას გაძლევთ დაუკავშიროთ Arduino– ს შეძენილი, მზა 8 გზაანი კონექტორით,

დასრულების შემდეგ- შეამოწმეთ შედუღება და შეამოწმეთ ხარვეზები სპილენძის ბილიკებს შორის.

მე ვფიქრობ, რომ 36 tpi უმცროსი ხერხის დანა ძალიან სასარგებლოა ნამსხვრევების გასაწმენდად. მე ამოვიღებ დანის ადგილსამყოფელ ქინძისთავებს და დავასრიალებ დანის წვერს ტრასაზე- ცხადია, დანა არ არის ჩარჩოში.

ნაბიჯი 6: ტესტირება DAC

ტესტირება DAC
ტესტირება DAC

გამორთეთ კავშირი წრესა და არდუინოს შორის.

დააყენეთ ხმის კონტროლი თქვენს წრეზე შუა გზაზე.

ჩართეთ 9V DC დენი თქვენს ახალ წრეზე.

შეამოწმეთ, რომ წრე ნორმალურია- მე ვერ ვიღებ პასუხისმგებლობას თქვენს წრეზე!

Გამორთვა

შეაერთეთ თქვენი წრე არდუინოსთან.

მეგაზე გამოიყენეთ ქინძისთავები 22-29. (PORTA) ნუ შეცდებით ორ 5V პინზე ზემოთ!

Uno– ზე გამოიყენეთ ქინძისთავები 0-7. ეს არის PORTD

შეაერთეთ თქვენი დენის წყაროს 0V არდუინოს 0V- თან.

გააქტიურდით.

გახსენით ეს სატესტო პროგრამა DAC_TEST

გაეროსთვის, შეცვალეთ ყველა მითითება PORTA– ს PORTD– ზე

შეცვალეთ DDRA DDRD– ით- ეს ინსტრუქცია ადგენს ყველა 8 ხაზს, რომ გამოვიდეს ერთი ნაბიჯით. ეს არის მონაცემთა მიმართულების რეგისტრატორი.

დააყენეთ თქვენი სერიული მონიტორი 115200 -ზე.

შეაერთეთ ვოლტმეტრი DAC გამოსავალსა და OV- ს შორის

პროგრამა დააყენებს გამომავალს 255 - ყველა ხაზი ჩართულია - მაქსიმალური ძაბვა.

გამომავალი 128- ნახევარი მაქსიმალური ძაბვა.

გამომავალი 0- ნულოვანი ძაბვა (ან ალბათ თითქმის ნული).

შემდეგ ის ნაბიჯ -ნაბიჯ დადგება: 1, 2, 4, 8, 16, 32, 64, 128

ძაბვა სტაბილურად უნდა გაიზარდოს.

თუ ძაბვა მცირდება და რიცხვი იზრდება, თქვენ ალბათ გაქვთ ორი ერთმანეთთან მავთული გადაბრუნებული.

თქვენ ასევე უნდა მოუსმინოთ სპიკერს ჩუმად დაჭერით, როდესაც ძაბვა იცვლება

ნაბიჯი 7: Wav სათაურის კითხვა

ტალღის სათაურის კითხვა
ტალღის სათაურის კითხვა

Wav ფაილები ინახება განსაზღვრული სიხშირით და მონაცემების ზომით.

ეს ინფორმაცია შეიცავს 44 ბაიტიან სათაურს wav ფაილის დასაწყისში.

მიუხედავად იმისა, რომ ზოგიერთი პროგრამული უზრუნველყოფა ავრცელებს სათაურს (35 ბაიტის შემდეგ), რაც ართულებს მონაცემთა ზომის ადგილმდებარეობის პოვნას.

სათაურის წასაკითხად ჩვენ ვქმნით ბუფერს და ვაკოპირებთ ფაილის დაწყებას.

სიხშირე ინახება 4 ბაიტად, ფაილიდან იწყება 24 ბაიტი.

// წაკითხვის სიხშირე მითითებული wav ფაილის სათაურში

ბაიტი headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

retval = (retval << 8) | headbuf [26];

retval = (retval << 8) | headbuf [25];

retval = (retval << 8) | headbuf [24];

Serial.print (F ("ფაილის სიხშირე"));

Serial.print (retval);

მონაცემთა ზომების საპოვნელად საუკეთესო საშუალებაა სათაურში მოძებნოთ სიტყვა "მონაცემები".

შემდეგ ამოიღეთ 4 ბაიტი მის შემდგომ, რომლებიც ქმნიან ხანგრძლივ მნიშვნელობას

ხელმოუწერელი გრძელი რევიზია;

int mypos = 40;

for (int i = 36; i <60; i ++) {

if (headbuf == 'd') {

if (headbuf [i+1] == 'a') {

if (headbuf [i+2] == 't') {

if (headbuf [i+3] == 'a') {

// ბოლოსდაბოლოს გვაქვს

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | headbuf [mypos+2];

retval = (retval << 8) | headbuf [mypos+1];

retval = (retval << 8) | headbuf [mypos];

კარგი, ჩვენ გვაქვს მონაცემების სიგრძე და სიხშირე!

აუდიო მონაცემები მიჰყვება 4 ბაიტს, რაც ქმნის მონაცემთა სიგრძის მნიშვნელობას.

ნაბიჯი 8: შეწყვეტა, შეწყვეტა…

შეწყვეტა, შეწყვეტა …
შეწყვეტა, შეწყვეტა …

ჩვენ ვიყენებთ სიხშირის ინფორმაციას პროგრამული უზრუნველყოფის შეწყვეტის შესაქმნელად საჭირო სიხშირეზე ან მის მახლობლად.

შეწყვეტა ყოველთვის არ შეიძლება ზუსტად დადგინდეს, მაგრამ ის საკმარისია. ფაილიდან წაკითხვის სიხშირე გადაეცემა ჩამორჩენილ ქვეგანყოფილებას.

void setintrupt (float freq) {float bitval = 8; // 8 8 ბიტიანი ქრონომეტრი 0 და 2, 1024 ტაიმერი 1 ბაიტი

setocroa = (16000000/(სიხშირე*ბიტვალი)) - 0.5;

// setocroa მნიშვნელობა მოითხოვს გამოკლებას -1. თუმცა 0.5 რაუნდის დამატებით უახლოეს 0.5 -ს

// ტაიმერის რეზოლუცია შეზღუდულია

// საბოლოოდ განისაზღვრება ბიტვალის სიდიდით

cli (); // გათიშვა შეფერხებები // დააყენეთ ტაიმერი 2 შეწყვეტა

TCCR2A = 0; // დააყენეთ მთელი TCCR2A რეგისტრი 0 -ზე

TCCR2B = 0; // იგივეა TCCR2B

TCNT2 = 0; // ინიციალიზაცია counter მნიშვნელობის 0

// დააყენეთ შედარების მატჩის რეგისტრატორი სიხშირის (ჰც) ზრდისთვის

OCR2A = სტეტოკროა; // = (16*10^6) / (სიხშირე*8) - 1 (უნდა იყოს <256)

// ჩართეთ CTC რეჟიმი

TCCR2A | = (1 << WGM21); // დააყენეთ CS21 ბიტი 8 წინასწარი გამყიდველისთვის

TCCR2B | = (1 << CS21); // ტაიმერის შედარების შეწყვეტის ჩართვა

// TIMSK2 | = (1 << OCIE2A); // ეს მუშაობს, ისევე როგორც შემდეგი ხაზი

sbi (TIMSK2, OCIE2A); // ტაიმერზე შეწყვეტის ჩართვა 2

სეი (); // შეწყვეტის ჩართვა

გამჭვირვალე მკითხველს ექნება მყივანი sbi (TIMSK2, OCIE2A)

მე დავაყენე რამოდენიმე (ინტერნეტით შეძენილი) ფუნქცია რეგისტრაციის ბიტების დასაყენებლად და გასასუფთავებლად:

// განსაზღვრავს რეგისტრაციის ბიტების გასუფთავებას#ifndef cbi

#განსაზღვრეთ cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#დაასრულე თუ

// განსაზღვრავს რეგისტრაციის ბიტების დაყენებას

#ifndef sbi

#განსაზღვრეთ sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#დაასრულე თუ

ეს ფუნქციები უზრუნველყოფს მარტივ ზარს შეწყვეტის დასაყენებლად ან გასასუფთავებლად.

ასე რომ, შეფერხება გადის, რისი გაკეთება შეგვიძლია ამის გაკეთება?

ნაბიჯი 9: წყვეტები და ორმაგი ბუფერი

შეწყვეტა და ორმაგი ბუფერირება
შეწყვეტა და ორმაგი ბუფერირება
შეწყვეტა და ორმაგი ბუფერირება
შეწყვეტა და ორმაგი ბუფერირება

22 კჰც სიხშირეზე გამოდის აუდიო მონაცემების ბაიტი ყოველ 0.045 ms

512 ბაიტი (ბუფერის ზომა) იკითხება 2.08 ms.

ამრიგად, ბუფერის წაკითხვა შეუძლებელია SDCard– დან ერთი ჩაწერის ციკლში.

თუმცა 512 ბაიტი იწერება პორტში 23.22 წმ.

ასე რომ, ყველაფერი რაც ჩვენ უნდა გავაკეთოთ არის დააყენოთ ახალი ფაილი, რომელიც იკითხება ყოველ ჯერზე, როდესაც ბუფერი დაცარიელდება და ჩვენ გვაქვს საკმარისი დრო მონაცემების მისაღებად, სანამ ახალი მონაცემთა ბლოკი იქნება საჭირო … დავუშვათ, ჩვენ ვიყენებთ ორ ბუფერს, ერთს ვაცლით, როდესაც ვავსებთ მეორეს.

ეს არის ორმაგი ბუფერირება.

წაკითხული ფაილი შენელდება განმეორებითი შეფერხებით, მაგრამ ის დასრულდება.

მე დავაყენე ორი 512 ბაიტიანი ბუფერი სახელწოდებით bufa და bufb.

თუ დროშა ნამდვილად მართალია, ჩვენ ვკითხულობთ პორტადან, წინააღმდეგ შემთხვევაში ვკითხულობთ პორტბიდან

როდესაც ბუფერული პოზიცია (bufcount) მიაღწევს ბუფერის ზომას (BUF_SIZE 512) ჩვენ ვაყენებთ დროშას, რომელსაც ეწოდება readit true.

ბათილი მარყუჟის რუტინა ეძებს ამ დროშას და იწყებს ბლოკის კითხვას:

if (წაკითხვა) {if (! aready) {

// დაიწყოს SDCard ბლოკის წაკითხვა bufa

tempfile.read (bufa, BUF_SIZE);

} სხვა {

// დაიწყოს SDCard ბლოკის წაკითხვა bufb– ზე

tempfile.read (bufb, BUF_SIZE);

}

წაკითხვა = ყალბი;

}

როდესაც ის დასრულდება რუტინული დროშები readit = false.

შეფერხების რუტინის ფარგლებში ჩვენ უნდა შევამოწმოთ, რომ ბათილი მარყუჟი დასრულებულია, თუ ვკითხულობთ == ცრუ.

ეს არის შემთხვევა, როდესაც ჩვენ სიგნალს ვაძლევთ, რომ საჭიროა კიდევ ერთი წაკითხვა და გადართვა aready დროშა ბუფერების გადასატანად.

თუ SDcard კვლავ კითხულობს, ჩვენ უნდა დავუბრუნდეთ ერთ კითხვას (counter--; bufcount--;) და გავთიშოთ შეწყვეტიდან, რათა მოგვიანებით ვცადოთ. (ხმოვანი სიგნალის დაწკაპუნება ნიშნავს, რომ ეს მოხდა.)

როდესაც ყველა მონაცემი იკითხება, შეწყვეტა გაუქმდება, პორტი ხელახლა დაყენებულია საშუალო ძაბვის მნიშვნელობით 128 და აუდიო ფაილი იხურება.

სანამ dac2.ino სკრიპტს პირველად გაუშვებთ, დააყენეთ თქვენი მოცულობა 50%. ეს იქნება ძალიან ხმამაღალი, მაგრამ ის სჯობს 100%-ს!

თუ თქვენი ხმის კონტროლი მუშაობს საპირისპიროდ, შეცვალეთ 10K პოტენომეტრის მოპირდაპირე ბოლოებში.

გამაგებინე როგორ ჟღერს.

გირჩევთ: