Mục lục:

Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC: 9 bước
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC: 9 bước

Video: Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC: 9 bước

Video: Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC: 9 bước
Video: Mạch Phát Âm Thanh MP3 JQ6500 Giao Tiếp UART | Điện tử DAT 2024, Tháng bảy
Anonim
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC
Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC

Phát tệp wav Âm thanh từ thẻ Audino SD của bạn. Có thể hướng dẫn này sẽ chỉ cho bạn cách tệp wav trên thẻ SdCard của bạn có thể được phát qua một mạch đơn giản tới loa.

Tệp wav phải là tệp đơn sắc 8 bit. Tôi không gặp vấn đề gì khi phát tệp 44 KHz.

Mặc dù không có độ trung thực cao nhưng chất lượng âm thanh rất hài lòng.

Màn hình nối tiếp được sử dụng để chọn tệp. Các tệp phải nằm trong một thư mục có tên là nhật ký quảng cáo.

Hướng dẫn này theo sau từ một dự án trước đó mà tôi đã lưu các bản ghi wav vào SdCard:

Mạch sử dụng bộ chuyển đổi tín hiệu kỹ thuật số sang tương tự (DAC) 8 bit giá rẻ và bộ khuếch đại âm thanh chip đơn.

Các phần chính để thiết lập ngắt được lấy từ bài báo xuất sắc của Amanda Ghassaei:

Bước 1: Yêu cầu

Yêu cầu
Yêu cầu
Yêu cầu
Yêu cầu

Arduino- Tôi sử dụng Mega, tuy nhiên không có lý do gì khiến Uno không hoạt động.

Trình đọc thẻ SdCard- chương trình được định cấu hình cho: Bảng đột phá MicroSD được điều chỉnh với Chuyển đổi logic V2

Xem hướng dẫn này để biết chi tiết thiết lập SdCard:

DAC0832 LCN- một bộ chuyển đổi kỹ thuật số sang tương tự 8 bit tuyệt vời- Một vài pound.

LM386 N-1 Op amp- rẻ như chip

Ổ cắm chip 20 cách

Ổ cắm chip 8 cách

Nguồn điện 9 volt - pin sẽ hoạt động.

Tham chiếu điện áp LM336 2,5 V

Tụ điện 10uF * 3 (bất kỳ điện áp nào lớn hơn 9V)

Điện trở 10 ohm

Tụ điện 50nF- (Hoặc ở đâu đó gần 47nF, 56nf, 68nf- sẽ làm được)

Tụ điện 220uF

Loa 64 ohm

Chiết áp tuyến tính 10K

Cáp để liên kết 8 đường dữ liệu giữa Arduino và mạch-

Trên Uno, 8 kết nối thẳng hàng, trên Mega, chúng theo cặp.

Trên Mega, tôi đã sử dụng cáp ribbon 10 chiều với tiêu đề IDC 10 chiều. (2 dây dự phòng)

Đầu nối ổ cắm cho đầu ra 0V, 9V và DAC

Bảng đồng dải, hàn, dây, máy cắt, v.v.

Bước 2: Thông số kỹ thuật

Các thông số kỹ thuật
Các thông số kỹ thuật

Bộ nối tiếp ở 115200 baud.

Hỗ trợ dành cho Bảng đột phá MicroSD Hobbytronics sử dụng Mega. Lựa chọn chip và các cổng khác sẽ thay đổi giữa Mega và Uno.

Các tệp Wav phải tồn tại trong một thư mục có tên là adlog- Vui lòng đặt tên khác cho nó và sắp xếp lại mã hóa cần thiết.

Tệp wav phải là tệp đơn sắc 8 bit. Tôi đã thử nghiệm lên đến 44KHz.

Màn hình nối tiếp hiển thị các tệp wav trong thư mục nhật ký quảng cáo. Tên tệp được gửi từ dòng đầu ra của màn hình.

Kích thước tệp chỉ bị giới hạn bởi kích thước thẻ SdCard.

Bước 3: Bắt đầu

Bắt đầu
Bắt đầu

Kết nối đầu đọc thẻ SD. Đây là những kết nối cho Mega.

0, 5V

CLK đến chốt 52

D0 đến chân 50

D1 đến pin 51

CS đến chốt 53

(Xem trang web của nhà cung cấp để biết kết nối cổng Uno)

Bạn sẽ muốn kiểm tra xem thẻ của mình có hoạt động ở giai đoạn này không - hãy sử dụng các tập lệnh do nhà cung cấp cung cấp.

Chúng ta cần tạo một mạch nhỏ

Chúng tôi sẽ gửi một luồng byte âm thanh từ Arduino.

Những con số này nằm trong khoảng từ 0 đến 255. Chúng đại diện cho điện áp.

Khoảng lặng là 127-128.

255 là loa hình nón cứng một chiều.

0 là hình nón loa cứng theo cách khác.

Vì vậy, âm thanh được ghi lại dưới dạng các số đã lưu, tạo ra các điện áp khác nhau, tạo ra các nón loa chuyển động.

Chúng ta có thể gửi đồng thời các số trong số 8 dòng trên Arduino bằng cách sử dụng một "cổng".

Nếu chúng ta đưa 8 đường vào bộ chuyển đổi kỹ thuật số sang tương tự, nó sẽ thực hiện những gì ghi trên hộp thiếc và tạo ra điện áp tương tự tỷ lệ với số kỹ thuật số.

Tất cả những gì chúng ta cần làm sau đó là ngắt điện áp vào một bộ khuếch đại hoạt động nhỏ và sau đó đến loa.

Bước 4: Mạch nhỏ

Mạch nhỏ
Mạch nhỏ
Mạch nhỏ
Mạch nhỏ
Mạch nhỏ
Mạch nhỏ
Mạch nhỏ
Mạch nhỏ

DAC0832 LCN

Đây là một bộ chuyển đổi kỹ thuật số sang tương tự 8 bit tuyệt vời, giá rẻ. (DAC)

Nó có thể được kiểm soát hoàn toàn với một mảng lưu trữ dữ liệu, các dòng dữ liệu mẫu.

Hoặc nó có thể được thiết lập để thực hiện tất cả tự động trong "Luồng hoạt động".

Để trích dẫn hướng dẫn sử dụng:

Đơn giản chỉ cần nối đất CS, WR1, WR2 và XFER và buộc ILE cao cho phép cả hai thanh ghi bên trong tuân theo các đầu vào kỹ thuật số được áp dụng (dòng chảy) và ảnh hưởng trực tiếp đến đầu ra tương tự DAC.

OK, đó là bốn kết nối với chip đặt ở mức thấp và một kết nối thành 9V - dễ dàng.

Chúng tôi không muốn bất kỳ điện áp âm nào bị tắt nên hướng dẫn sử dụng nói rằng chúng tôi nên sử dụng "chế độ chuyển đổi điện áp" và chúng cung cấp sơ đồ.

Tất cả những gì chúng ta cần làm là thay thế một bộ khuếch đại Âm thanh nhỏ thay vì bộ khuếch đại mà họ đề xuất.

Bộ khuếch đại âm thanh LM386-N

Sách hướng dẫn của Amp cung cấp một sơ đồ các bộ phận tối thiểu - cung cấp mức tăng 20 (Quá nhiều so với chúng tôi - nhưng nó có bộ điều khiển âm lượng).

Tất cả những gì chúng ta cần làm là thêm một tụ điện giữa DAC và amp để chúng ta chỉ khuếch đại tín hiệu AC.

Chúng tôi cũng phải thêm một vài tụ điện gần với chân cung cấp của mỗi chip của chúng tôi nếu không chúng tôi sẽ nhận được tiếng ồn từ nguồn cung cấp 9V của chúng tôi.

Bước 5: Lấy Sắt hàn ra

Lấy ra khỏi sắt hàn
Lấy ra khỏi sắt hàn
Lấy ra khỏi sắt hàn
Lấy ra khỏi sắt hàn
Lấy ra khỏi sắt hàn
Lấy ra khỏi sắt hàn

Vì mạch rất đơn giản, tôi không có ý định đưa ra một tài khoản thổi bằng đòn.

Dưới đây là một số gợi ý:

  • Chuẩn bị một miếng ván đồng có ít nhất 28 x 28 lỗ. (Vâng, tôi biết bác sĩ phẫu thuật não có thể làm cho nó nhỏ hơn)
  • Nếu bạn định gắn nó bằng vít, hãy cho phép chúng ngay từ đầu!
  • Gắn chip vào ổ cắm. Chỉ lắp các chip khi mọi thứ đã được kiểm tra.
  • Giữ các dây đầu vào cách xa đầu ra.
  • Quan sát các cực tính chính xác cho các tụ điện.
  • Tham khảo sơ đồ để xem cơ sở của tham chiếu điện áp LM336. Chân điều chỉnh không được sử dụng và có thể bị cắt.
  • Lưu ý kết nối trực tiếp với chân 8 của DAC- Nó rất hữu ích để kiểm tra.
  • Tôi đã kết nối với Audino bằng cáp ruy-băng và trình kết nối IDC 10 chiều.
  • Trên Uno, các kết nối nằm trên một đường thẳng - bạn có thể thấy rằng việc sắp xếp 8 kết nối đầu vào thành một đường thẳng duy nhất cho phép bạn liên kết với Arduino bằng một trình kết nối 8 cách đã mua sẵn,

Khi hoàn thành, hãy kiểm tra mối hàn và kiểm tra khe hở giữa các rãnh đồng.

Tôi thấy một lưỡi cưa hack cơ sở 36 tpi rất hữu ích để dọn sạch các mảnh vụn. Tôi tháo các chốt định vị của lưỡi dao và trượt đầu lưỡi dao vào rãnh- Rõ ràng là lưỡi dao không nằm trong khung.

Bước 6: Kiểm tra DAC

Kiểm tra DAC
Kiểm tra DAC

Tắt Kết nối giữa Mạch và Arduino.

Đặt điều khiển âm lượng trên mạch của bạn ở giữa chừng.

Bật Nguồn điện một chiều 9V sang mạch mới của bạn.

Kiểm tra xem mạch có ổn không- Tôi không thể chấp nhận bất kỳ trách nhiệm pháp lý nào đối với mạch của bạn!

Tắt nguồn

Kết nối mạch của bạn với Arduino.

Trên Mega sử dụng chân 22-29. (PORTA) Đừng nhầm hai chân 5V trên!

Trên Uno sử dụng chân 0-7. Đây là PORTD

Kết nối 0V của nguồn điện của bạn với 0V trên Arduino.

Tăng sức mạnh.

Mở chương trình thử nghiệm này DAC_TEST

Đối với UNO, thay thế tất cả các tham chiếu đến PORTA thành PORTD

Thay thế DDRA bằng DDRD- hướng dẫn này thiết lập tất cả 8 dòng để xuất trong một lần. Đây là thanh ghi hướng dữ liệu.

Đặt màn hình nối tiếp của bạn ở 115200.

Kết nối vôn kế giữa đầu ra DAC và OV

Chương trình sẽ đặt đầu ra là 255- tất cả các dòng trên - điện áp tối đa.

Đầu ra 128- một nửa điện áp tối đa.

Điện áp đầu ra 0- không (Hoặc có thể gần bằng không).

Sau đó, nó sẽ theo từng bước theo chiều kim bit: 1, 2, 4, 8, 16, 32, 64, 128

Điện áp nên tăng đều đặn.

Nếu điện áp giảm trở lại trong khi con số tăng lên, bạn có thể đã đảo ngược hai trong số các dây kết nối với nhau.

Bạn cũng sẽ nghe thấy tiếng lách cách của loa khi điện áp thay đổi

Bước 7: Đọc Wav Header

Đọc tiêu đề Wav
Đọc tiêu đề Wav

Các tệp Wav được lưu với tần suất và kích thước dữ liệu được chỉ định.

Thông tin này được chứa trong tiêu đề 44 byte ở đầu tệp wav.

Mặc dù một số phần mềm mở rộng tiêu đề (sau byte 35), làm cho vị trí của kích thước dữ liệu khó xác định hơn.

Để đọc tiêu đề, chúng tôi tạo một bộ đệm và sao chép phần bắt đầu của tệp.

Tần số được lưu trữ trong 4 byte bắt đầu từ 24 byte vào tệp.

// tần suất đọc được chỉ định trong tiêu đề tệp wav

byte headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

retval = (retval << 8) | cái đầu [26];

retval = (retval << 8) | cái đầu [25];

retval = (retval << 8) | cái đầu [24];

Serial.print (F ("Tần suất Tệp"));

Serial.print (đánh giá lại);

Cách tốt nhất để tìm thông tin kích thước dữ liệu là tìm kiếm từ "dữ liệu" trong tiêu đề.

Sau đó, trích xuất 4 byte theo sau nó, tạo nên giá trị dài

hồi ký dài không dấu;

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') {

// cuối cùng thì chúng ta cũng có nó

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];

OK, chúng tôi có độ dài và tần suất dữ liệu!

Dữ liệu âm thanh theo sau 4 byte tạo nên giá trị độ dài dữ liệu.

Bước 8: Ngắt, ngắt…

Ngắt, ngắt…
Ngắt, ngắt…

Chúng tôi sử dụng thông tin tần số để tạo ra một phần mềm ngắt ở hoặc gần tần số yêu cầu.

Không phải lúc nào ngắt cũng có thể được đặt chính xác, nhưng nó là đủ. Tần suất đọc từ tệp được chuyển đến chương trình con ngắt đoạn.

void setintrupt (float freq) {float bitval = 8; // 8 cho bộ định thời 8 bit 0 và 2, 1024 cho bộ định thời 1 byte

setocroa = (16000000 / (freq * bitval)) - 0,5;

// Giá trị setocroa yêu cầu phép trừ -1. Tuy nhiên, cộng 0,5 vòng thành 0,5 gần nhất

// Độ phân giải của bộ hẹn giờ bị giới hạn

// Cuối cùng được xác định bởi độ lớn của bitval

cli (); // vô hiệu hóa ngắt // thiết lập ngắt timer2

TCCR2A = 0; // đặt toàn bộ thanh ghi TCCR2A thành 0

TCCR2B = 0; // tương tự cho TCCR2B

TCNT2 = 0; // khởi tạo giá trị bộ đếm thành 0

// đặt thanh ghi đối sánh so sánh cho các bước tăng tần số (hz)

OCR2A = setocroa; // = (16 * 10 ^ 6) / (tần số * 8) - 1 (phải <256)

// bật chế độ CTC

TCCR2A | = (1 << WGM21); // Đặt bit CS21 cho 8 bộ định cấp trước

TCCR2B | = (1 << CS21); // bật ngắt so sánh hẹn giờ

// TIMSK2 | = (1 << OCIE2A); // điều này hoạt động, cũng như dòng sau

sbi (TIMSK2, OCIE2A); // bật ngắt trên bộ định thời 2

sei (); // cho phép ngắt

Độc giả sành điệu sẽ có sbi phát hiện (TIMSK2, OCIE2A)

Tôi thiết lập một số chức năng (có được từ internet) để thiết lập và xóa các bit thanh ghi:

// Định nghĩa xóa các bit thanh ghi # ifndef cbi

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

#endif

// Định nghĩa để thiết lập các bit thanh ghi

#ifndef sbi

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

#endif

Các chức năng này cung cấp một lệnh gọi dễ dàng để thiết lập hoặc xóa ngắt.

Vì vậy, ngắt đang chạy, chúng ta có thể làm cho nó làm gì?

Bước 9: Ngắt và đệm kép

Ngắt và đệm kép
Ngắt và đệm kép
Ngắt và đệm kép
Ngắt và đệm kép

Ở 22 Khz, một byte dữ liệu âm thanh được xuất ra sau mỗi 0,045 ms

512 byte (kích thước bộ đệm) được đọc trong 2,08 ms.

Vì vậy, bộ đệm không thể được đọc từ SDCard trong một chu kỳ ghi.

Tuy nhiên 512 byte được ghi vào cổng trong 23,22ms.

Vì vậy, tất cả những gì chúng ta phải làm là thiết lập một tệp mới được đọc mỗi khi bộ đệm trống và chúng ta có đủ thời gian để lấy dữ liệu trước khi khối dữ liệu mới được yêu cầu… Giả sử chúng ta sử dụng hai bộ đệm, làm trống một bộ đệm khi chúng ta lấp đầy một khối khác.

Đây là bộ đệm kép.

Việc đọc tệp sẽ bị chậm lại do ngắt lặp lại, nhưng nó sẽ được thực hiện.

Tôi đã thiết lập hai bộ đệm 512 byte được gọi là bufa và bufb.

Nếu lá cờ là true, chúng tôi đọc từ porta nếu không chúng tôi đọc từ portb

Khi vị trí bộ đệm (bufcount) đạt đến kích thước bộ đệm (BUF_SIZE 512), chúng tôi đặt một cờ gọi là readit thành true.

Quy trình vòng lặp void tìm kiếm cờ này và bắt đầu đọc khối:

if (readit) {if (! aready) {

// bắt đầu đọc khối SDCard sang bufa

tempfile.read (bufa, BUF_SIZE);

} khác {

// bắt đầu đọc khối SDCard tới bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Khi nó hoàn thành, các cờ thường xuyên readit = false.

Trong quy trình ngắt, chúng ta phải kiểm tra xem vòng lặp void đã kết thúc hay chưa bằng cách kiểm tra xem readit == false.

Đây là trường hợp chúng tôi báo hiệu rằng một lần đọc khác được yêu cầu và chuyển đổi cờ hạt để chuyển đổi bộ đệm.

Nếu thẻ SDcard vẫn đang đọc, chúng tôi phải theo dõi lại một lần đọc (bộ đếm--; bufcount--;) và thoát khỏi ngắt để thử lại sau. (Các lần nhấp vào tín hiệu đầu ra âm thanh ngụ ý rằng điều này đã xảy ra.)

Khi tất cả dữ liệu được đọc, ngắt bị hủy bỏ, cổng được đặt lại thành giá trị điện áp giữa là 128 và tệp âm thanh sẽ đóng lại.

Trước khi chạy tập lệnh dac2.ino lần đầu tiên, hãy đặt âm lượng của bạn thành 50%. Điều này sẽ quá ồn ào, nhưng tốt hơn là 100%!

Nếu bộ điều khiển âm lượng của bạn hoạt động ngược lại, hãy hoán đổi các dây dẫn ở hai đầu đối diện của chiết áp 10K.

Hãy cho tôi biết nó âm thanh như thế nào.

Đề xuất: