Mục lục:
- Bước 1: Yêu cầu
- Bước 2: Thông số kỹ thuật
- Bước 3: Bắt đầu
- Bước 4: Mạch nhỏ
- Bước 5: Lấy Sắt hàn ra
- Bước 6: Kiểm tra DAC
- Bước 7: Đọc Wav Header
- Bước 8: Ngắt, ngắt…
- Bước 9: Ngắt và đệm kép
Video: Phát tệp âm thanh âm thanh (Wav) với Arduino và DAC: 9 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:35
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
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
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
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ỏ
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
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
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á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…
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
Ở 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:
Nói Arduino - Chơi nhạc MP3 với Arduino mà không cần bất kỳ mô-đun nào - Phát tệp Mp3 từ Arduino bằng PCM: 6 bước
Nói Arduino | Chơi nhạc MP3 với Arduino mà không cần bất kỳ mô-đun nào | Phát tệp Mp3 từ Arduino bằng PCM: Trong phần hướng dẫn này, chúng ta sẽ học cách phát tệp mp3 bằng arduino mà không cần sử dụng bất kỳ mô-đun âm thanh nào, ở đây chúng tôi sẽ sử dụng thư viện PCM cho Arduino phát PCM 16 bit với tần số 8kHZ vì vậy hãy làm điều này
HAM GIÁ RẺ - CHUYỂN PHÁT THANH CỔ TAY VÀO MÁY PHÁT THANH DI ĐỘNG: 6 bước
HAM GIÁ RẺ - CHUYỂN PHÁT THANH CỔ TAY VÀO PHÁT THANH DI ĐỘNG: Đài phát thanh ham di động với ngân sách eo hẹp? Đúng, nó có thể được thực hiện với một số sáng tạo. Có rất nhiều bộ đàm cầm tay giá rẻ của Trung Quốc trên thị trường. Những chiếc bộ đàm mới giá rẻ này đã lần lượt làm giảm giá những thiết bị ham chất lượng đã qua sử dụng. Một thứ khác bổ sung
Phát minh lại những phát minh miễn phí của bạn cho robot 'Fantastic Plastics Works' để phát sáng: 5 bước
Phát minh lại những sáng tạo miễn phí của bạn cho robot 'Fantastic Plastics Works' để phát sáng: Sử dụng đèn LED có sẵn để làm cho 'robot' bằng nhựa phát sáng và làm phai màu! Cung cấp giới thiệu về hàn cơ bản, mạch điện, đèn LED và chất dẻo
Cách nén tệp tin ISO của Psp sao lưu vào tệp CSO để tiết kiệm dung lượng.: 4 bước
Cách nén tệp ISO của bản sao lưu Psp của bạn thành tệp CSO để tiết kiệm dung lượng. có thể sử dụng được với Wine Trong Ubuntu. Bạn cũng sẽ cần một psp CFW (Cusstom Firm-Ware) để mak
Cách khắc phục các tệp dữ liệu không được hỗ trợ và tải xuống tệp video yêu thích cho PSP Portable của bạn: 7 bước
Cách khắc phục tệp dữ liệu không được hỗ trợ và tải xuống tệp video yêu thích của bạn cho PSP Portable của bạn: Tôi đã sử dụng Media Go và thực hiện một số thủ thuật để tệp video không được hỗ trợ hoạt động trên PSP của tôi. Đây là tất cả các bước mà tôi đã thực hiện , khi lần đầu tiên tôi có các tệp video không được hỗ trợ hoạt động trên PSP của mình. Nó hoạt động 100% với tất cả các tệp video của tôi trên PSP Po