ESP8266 Trình phát MP3

Hướng dẫn này chỉ cho bạn cách làm một máy nghe nhạc MP3 sử dụng ESP8266, mô-đun phát MP3, thẻ micro SD và loa. Các tệp MP3 (nhạc hoặc âm thanh đã ghi) được lưu trong thẻ micro SD. Sau đó, ESP8266 có thể điều khiển mô-đun phát MP3 để đọc một bài hát được chọn từ thẻ SD, chuyển đổi nó thành tín hiệu âm thanh và gửi tín hiệu đó đến loa. Cụ thể, chúng ta sẽ học:

Sau đó, bạn có thể chỉnh sửa mã để thêm một biến trở hoặc encoder quay để điều chỉnh âm lượng.

Phần cứng cần chuẩn bị

1×ESP8266 NodeMCU ESP-12E
1×Recommended: ESP8266 NodeMCU ESP-12E (Uno-form)
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×Serial MP3 Player Module
1×Micro SD Card
1×3.5mm Aux Speaker
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Mô-đun Phát MP3 Serial và Loa

Bản đồ chân của mô-đun phát MP3 nối tiếp

Một mô-đun phát MP3 nối tiếp có ba giao diện:

  • Giao diện với ESP8266 gồm 4 chân:
    • Chân RX: chân dữ liệu, cần được kết nối với chân TX của ESP8266 (Serial phần cứng hoặc Serial phần mềm)
    • Chân TX: chân dữ liệu, cần được kết nối với chân RX của ESP8266 (Serial phần cứng hoặc Serial phần mềm)
    • Chân VCC: chân nguồn, cần được kết nối tới VCC (5V)
    • Chân GND: chân nguồn, cần được kết nối tới GND (0V)
  • Giao diện với loa là một jack Aux 3,5 mm cái.
  • Giao diện với thẻ Micro SD là một khe cắm thẻ Micro SD ở phía sau của module.
bảng chân của mô-đun phát mp3 nối tiếp
image source: diyables.io

Cấu hình chân loa

Một loa thường có hai giao diện:

  • Giao diện tín hiệu âm thanh: là đầu cắm nam 3,5 mm Aux kết nối với mô-đun MP3
  • Giao diện nguồn: có thể là USB, adapter nguồn 5V hoặc bất kỳ giao diện nguồn nào khác

Cách hoạt động

Những gì chúng ta cần chuẩn bị:

  • Lưu trước danh sách các bài hát hoặc âm thanh đã ghi mà chúng ta muốn phát lên thẻ micro SD.
  • Lắp thẻ micro SD vào mô-đun phát MP3.
  • Kết nối mô-đun phát MP3 với ESP8266.
  • Kết nối loa với mô-đun MP3.
  • Kết nối loa với nguồn điện.

Mỗi tệp MP3 được lưu trên thẻ nhớ Micro SD sẽ có một chỉ số. Chỉ số này thể hiện thứ tự của bài hát đã lưu, bắt đầu từ 0.

Sau đó chúng ta có thể lập trình ESP8266 để gửi lệnh cho mô-đun MP3. Nó hỗ trợ các lệnh sau:

  • Phát
  • Tạm dừng
  • Phát tiếp theo
  • Phát trước
  • Thay đổi âm lượng

Khi mô-đun phát MP3 đọc các tệp MP3 từ thẻ micro SD, nó sẽ chuyển đổi các tệp MP3 thành tín hiệu âm thanh và xuất tín hiệu âm thanh ra loa thông qua giao diện Aux 3,5 mm.

Sơ đồ đấu dây

sơ đồ đấu nối của module phát mp3 ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Xem thêm Sơ đồ chân ESP8266Cách cấp nguồn cho ESP8266.

ESP8266 Mã nguồn - Phát nhạc

Đoạn mã dưới đây phát bài hát đầu tiên được lưu trên thẻ nhớ Micro SD.

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp8266/esp8266-mp3-player */ #include <SoftwareSerial.h> #define CMD_PLAY_NEXT 0x01 #define CMD_PLAY_PREV 0x02 #define CMD_PLAY_W_INDEX 0x03 #define CMD_SET_VOLUME 0x06 #define CMD_SEL_DEV 0x09 #define CMD_PLAY_W_VOL 0x22 #define CMD_PLAY 0x0D #define CMD_PAUSE 0x0E #define CMD_SINGLE_CYCLE 0x19 #define DEV_TF 0x02 #define SINGLE_CYCLE_ON 0x00 #define SINGLE_CYCLE_OFF 0x01 #define ESP8266_RX D5 // The ESP8266 pin connected to the TX of the Serial MP3 Player module #define ESP8266_TX D6 // The ESP8266 pin connected to the RX of the Serial MP3 Player module SoftwareSerial mp3(ESP8266_RX, ESP8266_TX); void setup() { Serial.begin(9600); mp3.begin(9600); delay(500); // wait chip initialization is complete mp3_command(CMD_SEL_DEV, DEV_TF); // select the TF card delay(200); // wait for 200ms mp3_command(CMD_PLAY, 0x0000); // Play mp3 //mp3_command(CMD_PAUSE, 0x0000); // Pause mp3 //mp3_command(CMD_PLAY_NEXT, 0x0000); // Play next mp3 //mp3_command(CMD_PLAY_PREV, 0x0000); // Play previous mp3 //mp3_command(CMD_SET_VOLUME, 30); // Change volume to 30 } void loop() { } void mp3_command(int8_t command, int16_t dat) { int8_t frame[8] = { 0 }; frame[0] = 0x7e; // starting byte frame[1] = 0xff; // version frame[2] = 0x06; // The number of bytes of the command without starting byte and ending byte frame[3] = command; // frame[4] = 0x00; // 0x00 = no feedback, 0x01 = feedback frame[5] = (int8_t)(dat >> 8); // data high byte frame[6] = (int8_t)(dat); // data low byte frame[7] = 0xef; // ending byte for (uint8_t i = 0; i < 8; i++) { mp3.write(frame[i]); } }

Hướng dẫn từng bước

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau đây:

  • Xem ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
  • Nối các thành phần như được thể hiện trong sơ đồ.
  • Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, chẳng hạn (ví dụ NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
  • Làm theo hướng dẫn trên Cách hoạt động
  • Sao chép mã ở trên và mở bằng Arduino IDE.
  • Nhấn nút Upload trên Arduino IDE để tải mã lên ESP8266.
  • Thưởng thức âm nhạc

Mã ESP8266 - Phát nhạc với các nút điều khiển

Đoạn mã dưới đây là một bản nâng cấp của đoạn mã trước đó. Nó thêm bốn nút để bạn có thể tương tác với trình phát MP3.

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp8266/esp8266-mp3-player */ #include <SoftwareSerial.h> #include <ezButton.h> #define CMD_PLAY_NEXT 0x01 #define CMD_PLAY_PREV 0x02 #define CMD_PLAY_W_INDEX 0x03 #define CMD_SET_VOLUME 0x06 #define CMD_SEL_DEV 0x09 #define CMD_PLAY_W_VOL 0x22 #define CMD_PLAY 0x0D #define CMD_PAUSE 0x0E #define CMD_SINGLE_CYCLE 0x19 #define DEV_TF 0x02 #define SINGLE_CYCLE_ON 0x00 #define SINGLE_CYCLE_OFF 0x01 #define ESP8266_RX D5 // The ESP8266 pin connected to the TX of the Serial MP3 Player module #define ESP8266_TX D6 // The ESP8266 pin connected to the RX of the Serial MP3 Player module SoftwareSerial mp3(ESP8266_RX, ESP8266_TX); ezButton button_play(D1); // create ezButton object for pin D1 ezButton button_pause(D2); // create ezButton object for pin D2 ezButton button_next(D3); // create ezButton object for pin D3 ezButton button_prev(D4); // create ezButton object for pin D4 void setup() { Serial.begin(9600); mp3.begin(9600); delay(500); // wait chip initialization is complete mp3_command(CMD_SEL_DEV, DEV_TF); // select the TF card delay(200); // wait for 200ms button_play.setDebounceTime(50); // set debounce time to 50 milliseconds button_pause.setDebounceTime(50); // set debounce time to 50 milliseconds button_next.setDebounceTime(50); // set debounce time to 50 milliseconds button_prev.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button_play.loop(); // MUST call the loop() function first button_pause.loop(); // MUST call the loop() function first button_next.loop(); // MUST call the loop() function first button_prev.loop(); // MUST call the loop() function first if (button_play.isPressed()) { Serial.println("Play mp3"); mp3_command(CMD_PLAY, 0x0000); } if (button_pause.isPressed()) { Serial.println("Pause mp3"); mp3_command(CMD_PAUSE, 0x0000); } if (button_next.isPressed()) { Serial.println("Play next mp3"); mp3_command(CMD_PLAY_NEXT, 0x0000); } if (button_prev.isPressed()) { Serial.println("Play previous mp3"); mp3_command(CMD_PLAY_PREV, 0x0000); } } void mp3_command(int8_t command, int16_t dat) { int8_t frame[8] = { 0 }; frame[0] = 0x7e; // starting byte frame[1] = 0xff; // version frame[2] = 0x06; // The number of bytes of the command without starting byte and ending byte frame[3] = command; // frame[4] = 0x00; // 0x00 = no feedback, 0x01 = feedback frame[5] = (int8_t)(dat >> 8); // data high byte frame[6] = (int8_t)(dat); // data low byte frame[7] = 0xef; // ending byte for (uint8_t i = 0; i < 8; i++) { mp3.write(frame[i]); } }

Sơ đồ nối dây cho đoạn mã ở trên:

sơ đồ kết nối loa cho trình phát mp3 ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Bây giờ, bạn có thể chỉnh sửa các dự án để thêm nhiều chức năng hơn, ví dụ:

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Tham khảo các hàm