Mục lục:

Thư viện Arduino để giải mã MP3: 4 bước
Thư viện Arduino để giải mã MP3: 4 bước

Video: Thư viện Arduino để giải mã MP3: 4 bước

Video: Thư viện Arduino để giải mã MP3: 4 bước
Video: Học lập trình Arduino KHÔNG HỀ KHÓ - Bộ KIT học tập Arduino Uno R3 BLK 2024, Tháng mười một
Anonim
Thư viện Arduino để giải mã MP3
Thư viện Arduino để giải mã MP3
Thư viện Arduino để giải mã MP3
Thư viện Arduino để giải mã MP3

Do sự phổ biến ngày càng tăng của các bộ vi điều khiển tốc độ cao như ESP32 và ARM M series, việc giải mã MP3 dòng M không còn được yêu cầu thực hiện bởi phần cứng chuyên dụng. Việc giải mã hiện có thể được thực hiện trong phần mềm.

Có một thư viện tuyệt vời có sẵn từ earlephilhower cho thấy cách giải mã nhiều loại tệp âm thanh và phát chúng trên vi điều khiển ESP. Lấy cảm hứng từ điều này, tôi đã điều chỉnh một số mã để tạo ra một phương pháp mô-đun để đọc các tệp MP3 trên vi điều khiển.

Hy vọng của tôi là phương pháp này sẽ đủ chung để sử dụng trên bất kỳ vi điều khiển nào đủ nhanh (không chỉ là bo mạch ESP32) nhưng hiện tại tôi mới chỉ thử nghiệm trên ESP32.

Quân nhu

Như tôi đã nói trước đây, tôi hy vọng phương pháp này sẽ hoạt động với bất kỳ bộ vi điều khiển nhanh nào, nhưng có thể không. Do đó, để tái tạo kết quả của tôi, bạn sẽ cần:

  • Một bảng ESP32
  • Bảng đột phá SD
  • thẻ SD
  • Dây nhảy
  • breadboard
  • cáp micro USB (để tải lên bản phác thảo)
  • Arduino IDE

Bước 1: Đặt ra bảng mạch

Đặt ra bảng mạch
Đặt ra bảng mạch

Đặt ESP32 và thẻ SD breakout trên breadboard.

Bước 2: Kết nối thẻ SD

Đấu dây thẻ SD
Đấu dây thẻ SD

Các kết nối thẻ SD (ESP32 SD breakout) như sau:

GND GND

VDD 3v3

23 DI (MOSI)

19 LÀM (MISO)

18 SCLK

5 CS

Xin lưu ý rằng các kết nối này sẽ khác nhau nếu bạn đang sử dụng một bộ vi điều khiển khác.

Bước 3: Thư viện phần mềm

nếu bạn chưa cài đặt ESP-IDF, hãy truy cập trang web của họ và cài đặt nó.

Sau đó cài đặt thư viện bộ mã hóa vi mô. Bạn có thể thực hiện việc này bằng cách tải xuống kho lưu trữ và đặt nó vào thư mục Arduino Libraries của bạn. Thư viện bộ mã hóa vi mô hiện hỗ trợ các tệp.wav và.mp3.

Bất kể định dạng nào, có một vài phương thức phổ biến được liên kết với mỗi lớp và chúng được đề cập trong đoạn mã dưới đây. Chúng bao gồm nhận một số siêu dữ liệu tệp và in nó ra màn hình nối tiếp.

#include "SD.h" // đầu vào

#include "mp3.h" // bộ giải mã #include "pcm.h" // bộ chứa dữ liệu âm thanh thô mp3 MP3; void setup () {Serial.begin (115200); // Thiết lập Serial SD.begin (); // Thiết lập kết nối SD File file = SD.open ("/ cc.mp3"); // Mở tệp MP3 MP3.begin (tệp); // cho lớp MP3 biết tệp nào sẽ xử lý MP3.getMetadata (); // lấy siêu dữ liệu Serial.print ("Bits per Sample:"); Serial.println (MP3.bitsPerSample); // in các bit trên mỗi mẫu Serial.print ("Sample Rate:"); Serial.println (MP3. Fs); // và tỷ lệ mẫu} void loop () {}

Bước 4: Vẽ dữ liệu MP3 trên Serial Monitor

Vẽ dữ liệu MP3 trên Serial Monitor
Vẽ dữ liệu MP3 trên Serial Monitor

Với đoạn mã dưới đây, bạn có thể vẽ một số dữ liệu âm thanh trên màn hình nối tiếp. Điều này sẽ rất chậm nhưng sẽ chỉ cho bạn cách sử dụng thư viện MP3. Nó cũng làm giảm dữ liệu theo hệ số 16 để khi dữ liệu được vẽ biểu đồ, nó trông giống như một dạng sóng âm thanh. Mã này được lấy từ ví dụ SPI_MP3_Serial.ino đi kèm với thư viện bộ mã hóa vi mô. Tất nhiên, về sau, bạn sẽ muốn phát dữ liệu âm thanh này bằng cách nào đó nhưng đó là chủ đề của một hướng dẫn khác.

#include "SD.h" // đầu vào

#include "mp3.h" // bộ giải mã mp3 MP3; // Âm thanh pcm lớp MP3; // dữ liệu âm thanh thô void setup () {Serial.begin (115200); // Thiết lập Serial SD.begin (); // Thiết lập kết nối SD File file = SD.open ("/ cc.mp3"); // Mở tệp MP3 MP3.begin (tệp); // Truyền tệp sang lớp MP3} void loop () {audio = MP3.decode (); // Giải mã dữ liệu âm thanh thành lớp pcm / * có 32 mẫu trong audio.interleaved (16 trái và 16 phải) * nhưng chúng tôi sẽ chỉ vẽ điểm dữ liệu đầu tiên trong mỗi kênh. * Điều này có hiệu quả lấy mẫu dữ liệu theo hệ số 16 (để * chỉ xem dạng sóng) * / Serial.print (audio.interleaved [0]); // kênh bên trái Serial.print (""); Serial.println (audio.interleaved [1]); // kênh bên phải}

Đề xuất: