Trong bài này chúng ta sẽ học cách lập trình STM32 với DFPlayer để phát nhạc, âm thanh… cực kì đơn giản qua UART. DFPlayer là một module giải mã âm thanh rẻ, dễ điều khiển, có sẵn mạch khuếch đại âm thanh nên rất được ưa chuộng.
Bài này nằm trong Serie Học STM32 từ A tới Z
Giới thiệu module DFPLayer
DFPlayer Mini là mạch phát âm thanh MP3 từ thẻ microSD cực kì nhỏ gọn, lại tích hợp sẵn ampli để có thể kết nối trực tiếp với loa. Ngoài ra, ta còn có thể điều khiển nó bằng Arduino, STM32… Module hỗ trợ giải mã MP3, WAV, WMA.
DFPlayer Mini MP3 là mạch phát tập tin âm thanh kiểu máy chơi nhạc MP3. Mạch có thể được sử dụng riêng lẻ, chỉ cần pin, loa và nút nhấn, hoặc kết hợp với vi điều khiển có giao tiếp chuẩn UART.
Thông số kĩ thuật
- Tốc độ lấy mẫu (kHz): 8 / 11.025 / 12 / 16 / 22.05 / 24 / 32 / 44.1 / 48, với ngõ ra DAC 24bit
- Hỗ trợ đầy đủ FAT16, FAT32, thẻ TF (microSD) tối đa 32GB.
- Có thể điều khiển qua các chân IO hoặc qua giao tiếp nối tiếp (UART).
- Các file âm thanh có thể sắp xếp theo thư mục (tối đa 99 thư mục), mỗi thư mục chứa tối đa 255 bài hát.
- Có nhiều lệnh điều khiển, có thể sử dụng như một máy nghe nhạc MP3
Sơ đồ chân


Trong bài này chúng ta sẽ sử dụng giao tiếp UART để điều khiển DFPlayer, vậy nên chỉ sử dụng 4 chân VCC, GND, TX, RX. Nhớ nối chéo: chân TX của STM32 (PA9) nối vào RX của DFPlayer, chân RX của STM32 (PA10) nối vào TX của DFPlayer.
Nối loa (dưới 3W) vào 2 chân SPK_1 và SPK_2 là chạy được luôn, vì DFPlayer có sẵn mạch khuếch đại âm thanh.
Nếu muốn sử dụng amply ngoài, ta nối vào các chân DAC_L, DAC_R, GND tương ứng với 3 đường vào của audio.
Sơ đồ mạch STM32 DFPlayer như sau:

Lưu ý: Nên mắc thêm 1 điện trở 1kΩ nối tiếp trên dây từ TX của STM32 tới chân RX của DFPlayer. Không có điện trở này, loa thường bị rè, có tiếng lụp bụp khi truyền lệnh, nhất là khi DFPlayer cấp nguồn 5V.
Ngoài ra các bạn có thể sử dụng các nút nhấn được mô tả trong datasheet.
Cách điều khiển DFPlayer
Download: datasheet DFPlayer mini
Định dạng khung truyền
Đầu tiên chúng ta cần cài đặt UART như sau:
- Baudrate: 9600
- Parity: None (không kiểm tra chẵn/lẻ)
- Data bits: 8, Stop bits: 1
Để giao tiếp với DFPlayer, mỗi lần truyền lệnh chúng ta phải tuân theo định dạng sau:
- Byte Start luôn luôn là 0x7E
- Byte VER: mặc định là 0xFF
- Byte Length: số lượng byte tính từ VER tới hết para2 (không tính checksum). Mặc định là 0x06
- Byte CMD: mã lệnh, sẽ được định nghĩa ngay sau đây
- Byte Feedback: phản hồi, để 1 nếu cần phản hồi, 0 nếu không cần. Mặc định là 0
- Byte para1 và para2 là 2 byte tham số truyền vào
- 2 byte Checksum: mã checksum để kiểm tra việc truyền có bị lỗi hay không, bằng 0 trừ đi tổng các byte từ VER tới para2
- Byte End: kết thúc khung truyền, luôn luôn là 0xEF

Trong thư viện mình sẽ tạo 1 mảng khung truyền có 10 byte (vì checksum có 2 byte nhé).

Để gửi một lệnh, mình chỉ cần điền vào các vị trí tương ứng là CMD, para1, para2 và checksum, còn tất cả các vị trí còn lại để mặc định. Sau đó truyền frame này qua UART là DFPlayer sẽ nhận được. Giống như điền vào mẫu phiếu gửi hàng: khung phiếu luôn cố định, chỉ cần điền tên hàng và số lượng.

Các lệnh trong DFPlayer
Các lệnh tương ứng là giá trị điền vào byte CMD của frame truyền. Mình chỉ sử dụng các lệnh điều khiển (control) mà không sử dụng lệnh truy vấn (query).

Lập trình STM32 DFPLayer phát nhạc như 1 chiếc MP3
Cấu hình CubeMX
Cấu hình như bình thường các tab Debug, Clock,…
Chúng ta sẽ dùng USART1 để giao tiếp với DFPlayer, tham số cấu hình như sau:

Lập trình với Keil C
Download thư viện theo hướng dẫn: Download tài liệu lập trình STM32
Thay đổi đường dẫn thư viện và add file DFPlayer vào Project. Phần này mình đã hướng dẫn ở các bài trước.
Khởi tạo biến MP3 lưu trữ cài đặt của DFPlayer.

Trong main ta khởi tạo DFPlayer với huart1.
Chỉnh âm lượng (từ 0 tới 30) sao cho vừa nghe.
Sau đó bắt đầu chạy.
Trong while(1) chúng ta sử dụng câu lệnh next và prev để chuyển bài.

Trong thẻ nhớ chúng ta tạo một thư mục tên mp3, sau đó copy các file .mp3 vào trong nhé.
Để phát nhạc theo từng thư mục, chúng ta tạo ra các thư mục có tên 01, 02, 03… và các file bên trong cũng phải đổi tên thành 001, 002, 003…
Khi đó dùng lệnh DFPLAYER_PlayFileInFolder(DFPLAYER_Name* MP3, uint8_t folder, uint32_t num) để chạy file đó.
Lưu ý: Các lệnh next/prev và phát theo số thứ tự sẽ phát theo thứ tự file được copy vào thẻ nhớ (thứ tự trong bảng FAT), chứ không phải theo tên file. Muốn phát đúng thứ tự, hãy format thẻ rồi copy lần lượt từng file theo đúng thứ tự mong muốn, hoặc dùng lệnh phát theo thư mục/tên file như trên.
Kết quả phát nhạc bằng DFPlayer với STM32
Kết
DFPlayer có thể sử dụng để tạo một chiếc máy nghe nhạc đơn giản, hoặc dùng cùng vi điều khiển để dễ dàng phát âm thanh định dạng mp3, giúp cho các ứng dụng phong phú hơn.
Bạn có thể dùng nó để phát thông báo chuyến bay hoặc gọi số thứ tự như ở bệnh viện chẳng hạn. Như sản phẩm LED pháo hoa của mình cũng sử dụng DFPlayer để tạo âm thanh tiếng pháo nổ.
Nếu cảm thấy bài viết này có ích hãy chia sẻ với bạn bè nhé. Đừng quên gia nhập hội những anh em Nghiện lập trình nhé!!


cho mình hỏi sao mạch mình nó không phát mà cứ nghe tạch tạch tạch