Πίνακας περιεχομένων:

Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC: 9 βήματα
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC: 9 βήματα

Βίντεο: Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC: 9 βήματα

Βίντεο: Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC: 9 βήματα
Βίντεο: MIDI CONTROLLER SYNQ - DMC-2000 | DJShop 2024, Νοέμβριος
Anonim
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC
Αναπαραγωγή αρχείων ήχου ήχου (Wav) με Arduino και DAC

Αναπαραγωγή αρχείου wav Audio από την κάρτα SD Audino. Αυτό το Instructable θα σας δείξει πώς μπορεί να αναπαραχθεί ένα αρχείο wav στο SdCard μέσω ενός απλού κυκλώματος σε ένα ηχείο.

Το αρχείο wav πρέπει να είναι μονοφωνικό 8 bit. Δεν είχα πρόβλημα να παίξω αρχεία 44 KHz.

Αν και δεν είναι υψηλής πιστότητας, η ποιότητα του ήχου είναι πολύ ικανοποιητική.

Η σειριακή οθόνη χρησιμοποιείται για την επιλογή του αρχείου. Τα αρχεία πρέπει να βρίσκονται σε ένα φάκελο που ονομάζεται adlog.

Αυτό το διδακτικό προέρχεται από ένα προηγούμενο έργο όπου αποθηκεύω εγγραφές wav στο SdCard:

Το κύκλωμα χρησιμοποιεί έναν φθηνό μετατροπέα ψηφιακού σε αναλογικό 8 bit (DAC) και έναν ενισχυτή ήχου ενός τσιπ.

Οι βασικές ενότητες για τη δημιουργία διακοπών λήφθηκαν από το εξαιρετικό άρθρο της Αμάντα Γκασάεϊ:

Βήμα 1: Απαιτήσεις

Απαιτήσεις
Απαιτήσεις
Απαιτήσεις
Απαιτήσεις

Arduino- Χρησιμοποιώ το Mega, ωστόσο δεν υπάρχει λόγος να μην λειτουργεί το Uno.

SdCard reader- το πρόγραμμα έχει διαμορφωθεί για: MicroSD Breakout Board Regulated with Logic Conversion V2

Δείτε αυτό το διδακτικό για λεπτομέρειες εγκατάστασης SdCard:

DAC0832 LCN- ένας εξαιρετικός μετατροπέας ψηφιακού σε αναλογικό 8 bit- Μερικά κιλά.

LM386 N-1 Op ενισχυτής- φθηνό ως τσιπ

Υποδοχή τσιπ 20 δρόμων

Υποδοχή τσιπ 8 τρόπων

Τροφοδοσία 9 βολτ- μια μπαταρία θα κάνει.

LM336 Αναφορά τάσης 2,5 V

Πυκνωτής 10uF * 3 (οποιαδήποτε τάση μεγαλύτερη από 9V)

Αντίσταση 10 ohm

Πυκνωτής 50nF- (somewhere κάπου κοντά-47nF, 56nf, 68nf- θα κάνει)

Πυκνωτής 220uF

Ηχείο 64 ohm

Γραμμικό ποτενσιόμετρο 10Κ

Καλώδιο για τη σύνδεση των 8 γραμμών δεδομένων μεταξύ του Arduino και του κυκλώματος

Στο Uno οι 8 συνδέσεις είναι στη σειρά, στο Mega είναι σε ζεύγη.

Στο Mega χρησιμοποίησα καλώδιο κορδέλας 10 κατευθύνσεων με κεφαλίδα IDC 10 κατευθύνσεων. (2 καλώδια είναι εφεδρικά)

Υποδοχές υποδοχής για έξοδο 0V, 9V και DAC

Πίνακας λωρίδων χαλκού, συγκόλληση, σύρμα, κόπτες κλπ

Βήμα 2: Οι προδιαγραφές

Οι Προδιαγραφές
Οι Προδιαγραφές

Σειριακό σετ 115200 baud.

Υπάρχει υποστήριξη για το Hobbytronics MicroSD Breakout Board χρησιμοποιώντας ένα Mega. Η επιλογή τσιπ και άλλες θύρες θα αλλάξουν μεταξύ Mega και Uno.

Τα αρχεία Wav πρέπει να υπάρχουν σε έναν κατάλογο που ονομάζεται adlog- Μη διστάσετε να το ονομάσετε κάτι άλλο και να τακτοποιήσετε εκ νέου την απαραίτητη κωδικοποίηση.

Το αρχείο wav πρέπει να είναι μονοφωνικό 8 bit. Έχω δοκιμάσει έως και 44KHz.

Η σειριακή οθόνη εμφανίζει τα αρχεία wav στο φάκελο adlog. Τα ονόματα αρχείων αποστέλλονται από τη γραμμή εξόδου της οθόνης.

Το μέγεθος αρχείου περιορίζεται μόνο από το μέγεθος της κάρτας SdCard.

Βήμα 3: Ξεκινώντας

Ξεκινώντας
Ξεκινώντας

Συνδέστε το πρόγραμμα ανάγνωσης καρτών SD. Αυτές είναι οι συνδέσεις για το Mega.

0, 5V

CLK στο pin 52

D0 έως τον πείρο 50

D1 έως τον πείρο 51

CS στην καρφίτσα 53

(Ανατρέξτε στον ιστότοπο των προμηθευτών για σύνδεση θύρας Uno)

Θα θέλετε να ελέγξετε ότι η κάρτα σας λειτουργεί σε αυτό το στάδιο- χρησιμοποιήστε τα σενάρια που παρέχονται από τον προμηθευτή.

Πρέπει να κάνουμε ένα μικρό κύκλωμα

Θα στείλουμε μια ροή ηχητικών byte από το Arduino.

Αυτοί οι αριθμοί είναι μεταξύ 0 και 255. Αντιπροσωπεύουν την τάση.

Η σιωπή είναι 127-128.

Το 255 είναι κώνος ηχείου μονόδρομος.

0 είναι κώνος ηχείου σκληρά από την άλλη πλευρά.

Έτσι ο ήχος καταγράφεται ως αποθηκευμένοι αριθμοί, οι οποίοι δημιουργούν διαφορετικές τάσεις, οι οποίες δημιουργούν κινούμενους κώνους ηχείων.

Μπορούμε να στείλουμε τους αριθμούς από τις 8 γραμμές στο Arduino, ταυτόχρονα, χρησιμοποιώντας μια "θύρα".

Εάν τροφοδοτήσουμε τις 8 γραμμές σε έναν ψηφιακό σε αναλογικό μετατροπέα, κάνει αυτό που λέει στο κασσίτερο και παράγει μια αναλογική τάση που είναι ανάλογη με τον ψηφιακό αριθμό.

Το μόνο που χρειάζεται να κάνουμε είναι να βάλουμε την τάση σε έναν μικρό λειτουργικό ενισχυτή και στη συνέχεια σε ένα ηχείο.

Βήμα 4: Το μικρό κύκλωμα

Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα
Το Μικρό Κύκλωμα

Το DAC0832 LCN

Αυτός είναι ένας υπέροχος, φθηνός μετατροπέας ψηφιακού σε αναλογικό 8 bit. (DAC)

Μπορεί να ελεγχθεί πλήρως με μια σειρά δεδομένων, γραμμών δειγμάτων δεδομένων.

Or μπορεί να ρυθμιστεί για να τα κάνει όλα αυτόματα στο "Ροή μέσω λειτουργίας".

Για να αναφέρετε το εγχειρίδιο:

Η απλή γείωση των CS, WR1, WR2 και XFER και η σύνδεση υψηλού ILE επιτρέπει στους δύο εσωτερικούς καταχωρητές να ακολουθούν τις εφαρμοζόμενες ψηφιακές εισόδους (ροή) και να επηρεάζουν άμεσα την αναλογική έξοδο DAC.

Εντάξει, είναι τέσσερις συνδέσεις με το τσιπ χαμηλά και μία με 9V - εύκολο.

Δεν θέλουμε καμία αρνητική τάση να σβήσει, οπότε το εγχειρίδιο λέει ότι πρέπει να χρησιμοποιήσουμε τη "λειτουργία μεταγωγής τάσης" και παρέχουν το διάγραμμα.

Το μόνο που χρειάζεται να κάνουμε είναι να αντικαταστήσουμε έναν μικρό ενισχυτή ήχου αντί αυτού που προτείνουν.

Ο ενισχυτής ήχου LM386-N

Το εγχειρίδιο του ενισχυτή παρέχει ένα ελάχιστο διάγραμμα εξαρτημάτων- παρέχοντας κέρδος 20 (πάρα πολύ για εμάς- αλλά έχει έλεγχο έντασης).

Το μόνο που χρειάζεται να κάνουμε είναι να προσθέσουμε έναν πυκνωτή μεταξύ του DAC και του ενισχυτή έτσι ώστε να ενισχύουμε μόνο τα σήματα AC.

Πρέπει επίσης να προσθέσουμε δύο πυκνωτές κοντά στον πείρο τροφοδοσίας κάθε μάρκας μας, διαφορετικά θα πάρουμε βουητό από την τροφοδοσία 9V.

Βήμα 5: Βγείτε από το συγκολλητικό σίδερο

Βγείτε από το συγκολλητικό σίδερο
Βγείτε από το συγκολλητικό σίδερο
Βγείτε από το συγκολλητικό σίδερο
Βγείτε από το συγκολλητικό σίδερο
Βγείτε από το συγκολλητικό σίδερο
Βγείτε από το συγκολλητικό σίδερο

Καθώς το κύκλωμα είναι απλό, δεν σκοπεύω να δώσω ένα πλήγμα.

Εδώ είναι μερικές υποδείξεις:

  • Προετοιμάστε ένα κομμάτι χαρτόνι από χαρτόνι τουλάχιστον 28 επί 28 οπές. (Ναι, ξέρω ότι οι χειρουργοί εγκεφάλου μπορούν να το κάνουν μικρότερο)
  • Εάν σκοπεύετε να το τοποθετήσετε με βίδες, επιτρέψτε τους στην αρχή!
  • Τοποθετήστε τα τσιπ στις πρίζες. Εισάγετε τις μάρκες μόνο όταν έχουν ελεγχθεί τα πάντα.
  • Κρατήστε τα καλώδια εισόδου μακριά από την έξοδο.
  • Παρατηρήστε τη σωστή πολικότητα για τους πυκνωτές.
  • Ανατρέξτε στο διάγραμμα για τη βασική προβολή της αναφοράς τάσης LM336. Το πόδι προσαρμογής δεν χρησιμοποιείται και μπορεί να κοπεί.
  • Σημειώστε την απευθείας σύνδεση με τον ακροδέκτη 8 του DAC- Είναι πολύ χρήσιμο για έλεγχο.
  • Συνδέθηκα στο Audino με καλώδιο κορδέλας και συνδετήρα IDC 10 δρόμων.
  • Στο Uno οι συνδέσεις είναι σε ευθεία γραμμή - μπορεί να διαπιστώσετε ότι η τακτοποίηση των 8 συνδέσεων εισόδου σε μία μόνο ευθεία γραμμή σας επιτρέπει να συνδεθείτε στο Arduino με έναν αγορασμένο, έτοιμο συνδετήρα 8 κατευθύνσεων,

Όταν τελειώσει- ελέγξτε τη συγκόλληση και ελέγξτε τα κενά μεταξύ των χάλκινων κομματιών.

Θεωρώ ότι μια λεπίδα κοπής 36 tpi junior είναι πολύ χρήσιμη για τον καθαρισμό των συντριμμιών. Αφαιρώ τους πείρους εντοπισμού της λεπίδας και ολισθαίνω την άκρη της λεπίδας μέσα στην πίστα- Προφανώς η λεπίδα δεν είναι σε πλαίσιο.

Βήμα 6: Δοκιμή του DAC

Δοκιμή του DAC
Δοκιμή του DAC

Αφήστε τη σύνδεση μεταξύ του κυκλώματος και του Arduino απενεργοποιημένη.

Ρυθμίστε το ρυθμιστικό έντασης στο κύκλωμά σας στη μέση.

Ενεργοποιήστε το 9V DC Power στο νέο σας κύκλωμα.

Βεβαιωθείτε ότι το κύκλωμα είναι εντάξει- δεν μπορώ να αναλάβω καμία ευθύνη για το κύκλωμά σας!

Απενεργοποιώ

Συνδέστε το κύκλωμά σας στο Arduino.

Στο Mega χρησιμοποιήστε τις καρφίτσες 22-29. (PORTA) Μην κάνετε λάθος τις δύο παραπάνω καρφίτσες 5V!

Στο Uno χρησιμοποιήστε τις καρφίτσες 0-7. Αυτό είναι το PORTD

Συνδέστε το 0V του τροφοδοτικού σας με το 0V στο Arduino.

Παροχή τροφοδοσίας.

Ανοίξτε αυτό το δοκιμαστικό πρόγραμμα DAC_TEST

Για το UNO, αντικαταστήστε όλες τις αναφορές στο PORTA στο PORTD

Αντικαταστήστε το DDRA με DDRD- αυτή η οδηγία ορίζει και τις 8 γραμμές να εξάγονται με μία κίνηση. Αυτός είναι ο καταχωρητής κατεύθυνσης δεδομένων.

Ρυθμίστε τη σειριακή οθόνη σας στο 115200.

Συνδέστε ένα βολτόμετρο μεταξύ της εξόδου DAC και του OV

Το πρόγραμμα θα ρυθμίσει την έξοδο σε 255 - όλες οι γραμμές ενεργοποιημένες - μέγιστη τάση.

Έξοδος 128- μισή μέγιστη τάση.

Έξοδος 0- μηδενική τάση (probably μάλλον σχεδόν μηδέν).

Στη συνέχεια θα κάνει βήμα προς βήμα: 1, 2, 4, 8, 16, 32, 64, 128

Η τάση πρέπει να αυξάνεται σταθερά.

Εάν η τάση πέσει πίσω ενώ ο αριθμός αυξάνεται, πιθανότατα έχετε δύο από τα καλώδια διασύνδεσης να αντιστραφούν.

Θα πρέπει επίσης να ακούτε το ηχείο να κάνει ήσυχο κλικ καθώς αλλάζει η τάση

Βήμα 7: Ανάγνωση της κεφαλίδας Wav

Ανάγνωση της κεφαλίδας Wav
Ανάγνωση της κεφαλίδας Wav

Τα αρχεία Wav αποθηκεύονται με καθορισμένη συχνότητα και μέγεθος δεδομένων.

Αυτές οι πληροφορίες περιέχονται σε μια κεφαλίδα 44 byte στην αρχή ενός αρχείου wav.

Παρόλο που κάποιο λογισμικό επεκτείνει την κεφαλίδα (μετά από byte 35), καθιστώντας πιο δύσκολο τον εντοπισμό της θέσης του μεγέθους δεδομένων.

Για να διαβάσουμε την κεφαλίδα δημιουργούμε ένα buffer και αντιγράφουμε την αρχή του αρχείου.

Η συχνότητα αποθηκεύεται σε 4 byte ξεκινώντας 24 byte στο αρχείο.

// συχνότητα ανάγνωσης που καθορίζεται στην κεφαλίδα του αρχείου wav

byte 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 byte που ακολουθούν, που αποτελούν τη μεγάλη τιμή

ανυπόγραφη μακρά επανάληψη.

int mypos = 40;

για (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 byte που αποτελούν την τιμή του μήκους δεδομένων.

Βήμα 8: Διακοπή, διακοπή…

Διακοπή, διακοπή…
Διακοπή, διακοπή…

Χρησιμοποιούμε τις πληροφορίες συχνότητας για να δημιουργήσουμε μια διακοπή λογισμικού στην ή κοντά στην απαιτούμενη συχνότητα.

Η διακοπή δεν μπορεί πάντα να οριστεί με ακρίβεια, αλλά είναι αρκετή. Η συχνότητα ανάγνωσης από το αρχείο μεταφέρεται στην υπορουτίνα διακοπής λειτουργίας.

void setintrupt (float freq) {float bitval = 8; // 8 για χρονοδιακόπτες 8 bit 0 και 2, 1024 για χρονοδιακόπτη 1 byte

setocroa = (16000000/(συχνότητα*bitval)) - 0,5;

// Η τιμή setocroa απαιτεί αφαίρεση -1. Ωστόσο, προσθέτοντας 0,5 γύρους στο πλησιέστερο 0,5

// Η ανάλυση του χρονοδιακόπτη είναι περιορισμένη

// Τελικά καθορίζεται από το μέγεθος του bitval

cli (); // απενεργοποίηση διακοπών // ρύθμιση διακοπής χρονοδιακόπτη2

TCCR2A = 0; // ορίστε ολόκληρο τον καταχωρητή TCCR2A στο 0

TCCR2B = 0; // το ίδιο για το TCCR2B

TCNT2 = 0; // αρχικοποιήστε την αντίθετη τιμή στο 0

// ορίστε τη σύγκριση καταχωρητή αντιστοίχισης για προσαυξήσεις συχνότητας (hz)

OCR2A = setocroa; // = (16*10^6) / (συχνότητα*8) - 1 (πρέπει να είναι <256)

// ενεργοποιήστε τη λειτουργία CTC

TCCR2A | = (1 << WGM21); // Ρυθμίστε το bit CS21 για 8 προκαθοριστές

TCCR2B | = (1 << CS21); // ενεργοποίηση διακοπής σύγκρισης χρονοδιακόπτη

// TIMSK2 | = (1 << OCIE2A); // αυτό λειτουργεί, όπως και η ακόλουθη γραμμή

sbi (TIMSK2, OCIE2A); // ενεργοποίηση διακοπής στο χρονόμετρο 2

sei (); // ενεργοποίηση διακοπών

Οι απαιτητικοί αναγνώστες θα έχουν εντοπίσει sbi (TIMSK2, OCIE2A)

Ρυθμίζω μερικές συναρτήσεις (που αποκτήθηκαν από το Διαδίκτυο) για τη ρύθμιση και την εκκαθάριση των bit καταχωρητών:

// Ορίζει για εκκαθάριση δυαδικών ψηφίων#ifndef cbi

#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#τέλος εαν

// Ορίζει για τη ρύθμιση των bit καταχωρητή

#ifndef sbi

#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#τέλος εαν

Αυτές οι λειτουργίες παρέχουν μια εύκολη κλήση για να ορίσετε ή να καθαρίσετε τη διακοπή.

Λοιπόν, η διακοπή εκτελείται, τι μπορούμε να την κάνουμε να κάνει;

Βήμα 9: Διακοπές και διπλή προσωρινή αποθήκευση

Διακοπές και διπλό buffering
Διακοπές και διπλό buffering
Διακοπές και διπλή αποθήκευση
Διακοπές και διπλή αποθήκευση

Στα 22 Khz εξάγεται ένα byte δεδομένων ήχου κάθε 0,045 ms

512 byte (το μέγεθος του buffer) διαβάζεται σε 2,08 ms.

Έτσι, το buffer δεν μπορεί να διαβαστεί από την κάρτα SDC σε έναν κύκλο εγγραφής.

Ωστόσο, 512 byte γράφονται στη θύρα σε 23,22ms.

Επομένως, το μόνο που έχουμε να κάνουμε είναι να ρυθμίσουμε ένα νέο αρχείο που διαβάζεται κάθε φορά που αδειάζει το buffer και έχουμε αρκετό χρόνο για να λάβουμε τα δεδομένα πριν απαιτηθεί ένα νέο μπλοκ δεδομένων … Υποθέτοντας ότι χρησιμοποιούμε δύο buffer, αδειάζοντας το ένα καθώς γεμίζουμε ένα άλλο.

Αυτό είναι διπλό buffering.

Το αρχείο ανάγνωσης θα επιβραδυνθεί από την επαναλαμβανόμενη διακοπή, αλλά θα ολοκληρωθεί.

Έχω ρυθμίσει δύο buffer 512 byte που ονομάζονται bufa και bufb.

Αν το flag aready είναι αληθινό διαβάζουμε από το porta αλλιώς διαβάζουμε από το portb

Όταν η θέση buffer (bufcount) φτάσει στο μέγεθος buffer (BUF_SIZE 512) ορίζουμε μια σημαία που ονομάζεται readit σε true.

Η ρουτίνα κενού βρόχου αναζητά αυτήν τη σημαία και ξεκινά μια ανάγνωση μπλοκ:

if (readit) {if (! aready) {

// εκκίνηση ανάγνωσης αποκλεισμού SDCard σε bufa

tempfile.read (bufa, BUF_SIZE);

} αλλο {

// εκκίνηση ανάγνωσης αποκλεισμού SDCard στο bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false?

}

Όταν τελειώσει, οι σημαίες ρουτίνας readit = false.

Μέσα στη ρουτίνα διακοπής πρέπει να ελέγξουμε ότι ο βρόχος κενό έχει τελειώσει ελέγχοντας αν readit == false.

Στην περίπτωση αυτή, σηματοδοτούμε ότι απαιτείται άλλη ανάγνωση και αλλάζουμε τη σημαία aready για εναλλαγή buffer.

Εάν η κάρτα SD εξακολουθεί να διαβάζει, πρέπει να παρακολουθήσουμε μία ανάγνωση (μετρητής-; bufcount--;) και να βγούμε από τη διακοπή για να προσπαθήσουμε ξανά αργότερα. (Τα κλικ στο σήμα εξόδου ήχου υποδηλώνουν ότι αυτό συνέβη.)

Όταν διαβαστούν όλα τα δεδομένα, η διακοπή ακυρώνεται, η θύρα επαναρυθμίζεται στην τιμή μέσης τάσης 128 και το αρχείο ήχου κλείνει.

Πριν εκτελέσετε το σενάριο dac2.ino για πρώτη φορά, ρυθμίστε την ένταση του ήχου σας στο 50%. Αυτό θα είναι πολύ δυνατό, αλλά είναι καλύτερο από 100%!

Εάν ο έλεγχος έντασης λειτουργεί αντίστροφα, τα καλώδια στα αντίθετα άκρα του ποτενσιόμετρου 10Κ.

Πείτε μου πώς ακούγεται.

Συνιστάται: