功放模块

1. 产品简介

MAX98357 I2S功放模块是采用美信MAX98357 芯片开发的I2S数字D类功率放大器模块。与ESP32等具有I2S接口的主控相结合,可广泛用于物联网节点、智能家居设备、蓝牙音频播放器等项目。

本产品支持3.3V~5V供电。在5V供电、4Ω喇叭的状态下,具备2.5W以上的输出功率。并且,可通过修改SD端口电阻的方式设置多种模式:放大器关闭、输出左声道、输出右声道、输出混合声道。在产品上,默认设置为混合声道,并且引出了SD接口,可通过外接不同电阻的方式切换功能。

本产品体积小巧,邮票孔设计、可直插或者贴装在项目PCB上或面包板上。输出支持PH2.0喇叭接口与邮票孔两种连接方式,灵活方便。

2. 产品特性

3. 应用场景

4. 引脚排列图

引脚排列图

引脚 引脚功能 备注
SPK- 喇叭负极 喇叭参数:4Ω/8Ω <3W
VCC 电源输入 DC 3.3V-5V
GND 接地
NC 空脚
SD 关闭功放,调节声道 详见4.1.2 SD模式(SD)说明
GAIN 调节放大器增益 默认9dB 详见4.1.1 增益控制 (GAIN)说明
SPK+ 喇叭正极 喇叭参数:4Ω/8Ω <3W
DIN 数字输入信号
BCLK 位时钟输入 Bit Clock Input
LRC 帧时钟 I2S和LJ模式的左/右时钟。TDM模式的同步时钟。

4.1 特殊引脚功能

4.1.1 增益控制 (GAIN)

4.1.2 SD模式(SD)

yuanlitu

电阻替换图

5. 规格参数

模块参数

芯片音频相关参数

6. 产品尺寸图

尺寸图

7. 使用教程

7.1 蓝牙播放音乐实验

7.1.1 硬件准备

7.1.2 软件准备

7.1.3 硬件连接

蓝牙连线图

管脚连接说明:

I2S功放模块:VCC引脚---(连接)---ESP32-E主控: 3V3;

I2S功放模块:GND引脚---(连接)---ESP32-E主控:GND;

I2S功放模块:LRC引脚---(连接)---ESP32-E主控: 26/D3;

I2S功放模块:BCLK引脚---(连接)---ESP32-E主控: 25/D2;

I2S功放模块:DIN引脚---(连接)---ESP32-E主控: 14/D6;

I2S功放模块:SPK+引脚---(连接)---喇叭:正极

I2S功放模块:SPK-引脚---(连接)---喇叭:负极

7.1.4 演示代码

程序功能:打开ESP32-E的蓝牙功能,创建名称为bluetoothAmplifier的蓝牙节点,用带蓝牙功能的手机连接bluetoothAmplifier节点来播放音乐。

#include <DFRobot_MAX98357A.h>
DFRobot_MAX98357A amplifier;  

void setup(void)
{
  Serial.begin(115200);//串口速率设置为115200
  while( !amplifier.begin(/*btName=*/"bluetoothAmplifier", /*bclk=*/GPIO_NUM_25, /*lrclk=*/GPIO_NUM_26,/*din=*/GPIO_NUM_14) ){
    Serial.println("Initialize failed !");//没有检测到I2S引脚信号,则初始化失败
    delay(3000);
  }
  Serial.println("Initialize succeed!");//检测到I2S引脚信号,则初始化成功
}

void loop(void)
{
  delay(3000);
}

7.1.5 实验过程

打开Arduino IDE,开发板选择为FireBeetle2 ESP32-E,上传速率设置为921600。

主控选择

将代码拷贝到Arduino IDE上,编译烧录代码到FireBeetle2 ESP32-E里。

代码的上传

打开手机蓝牙功能,连接上bluetoothAmplifier节点,使用音乐播放器播放音乐。

蓝牙

7.2 SD卡播放音乐实验

7.2.1 硬件准备

7.2.2 软件准备

7.2.3 硬件连接

SD卡模块

管脚连接说明:

I2S功放模块:VCC引脚---(连接)---ESP32-E主控: 3V3;

I2S功放模块:GND引脚---(连接)---ESP32-E主控:GND;

I2S功放模块:LRC引脚---(连接)---ESP32-E主控: 26/D3;

I2S功放模块:BCLK引脚---(连接)---ESP32-E主控: 25/D2;

I2S功放模块:DIN引脚---(连接)---ESP32-E主控: 14/D6;

SD卡模块:5V引脚---(连接)---ESP32-E主控板:VCC;

SD卡模块:GND引脚---(连接)---ESP32-E主控板: GND;

SD卡模块:MOSI引脚---(连接)---ESP32-E主控板:23/MOSI;

SD卡模块:SS引脚---(连接)---ESP32-E主控板:4/D12;

SD卡模块:SCK引脚---(连接)---ESP32-E主控板:18/SCK;

SD卡模块:MISO引脚---(连接)---ESP32-E主控板: 19/MISO;

I2S功放模块:SPK+引脚---(连接)---喇叭:正极;

I2S功放模块:SPK-引脚---(连接)---喇叭:负极;

7.2.4 演示代码

代码意义: 接入SD卡模块之后,连接成功后,直接播放SD卡里面的音乐,按下RST按钮,从头开始播放

#include <DFRobot_MAX98357A.h>

DFRobot_MAX98357A amplifier;   

String musicList[100];   // SD卡音乐菜单
void setup(void)
{
  Serial.begin(115200);
  while ( !amplifier.initI2S(/*_bclk=*/GPIO_NUM_25, /*_lrclk=*/GPIO_NUM_26, /*_din=*/GPIO_NUM_14) ){
    Serial.println("Initialize I2S failed !");
    delay(3000);
  }
  while (!amplifier.initSDCard(/*csPin=*/GPIO_NUM_4)){
    Serial.println("Initialize SD card failed !");
    delay(3000);
  }
  Serial.println("Initialize succeed!");
  amplifier.scanSDMusic(musicList);
  printMusicList();
  amplifier.setVolume(5);
  amplifier.closeFilter();
  amplifier.openFilter(bq_type_highpass, 500);
  amplifier.SDPlayerControl(SD_AMPLIFIER_PLAY);
  delay(5000);   
  if(musicList[1].length()){
    Serial.println("Changing Music...\n");
    amplifier.playSDMusic(musicList[1].c_str());
  }else{
    Serial.println("The currently selected music file is incorrect!\n");
  }
}
void loop()
{
  parseSerialCommand();
  delay(500);
}
void printMusicList(void)
{
  uint8_t i = 0;
  if(musicList[i].length()){
    Serial.println("\nMusic List: ");
  }else{
    Serial.println("The SD card audio file scan is empty, please check whether there are audio files in the SD card that meet the format!");
  }

  while(musicList[i].length()){
    Serial.print("\t");
    Serial.print(i);
    Serial.print("  -  ");
    Serial.println(musicList[i]);
    i++;
  }
}
void parseSerialCommand(void)
{
  String cmd;   
  float value;   
  if(Serial.available()){   
    cmd = Serial.readStringUntil('-');   

    if(cmd.equals("hp")){   
      Serial.println("Setting a High-Pass filter...\n");
      value =Serial.parseFloat();
      amplifier.openFilter(bq_type_highpass, value);
    }else if(cmd.equals("lp")){   
      Serial.println("Setting a Low-Pass filter...\n");
      value =Serial.parseFloat();
      amplifier.openFilter(bq_type_lowpass, value);
    }else if(cmd.equals("closeFilter")){   
      Serial.println("Closing filter...\n");
      amplifier.closeFilter();
    }else if(cmd.equals("vol")){
      Serial.println("Setting volume...\n");
      value =Serial.parseFloat();
      amplifier.setVolume(value);
    }else if(cmd.equals("start")){   
      Serial.println("starting amplifier...\n");
      amplifier.SDPlayerControl(SD_AMPLIFIER_PLAY);
    }else if(cmd.equals("pause")){   
      Serial.println("Pause amplifier...\n");
      amplifier.SDPlayerControl(SD_AMPLIFIER_PAUSE);
    }else if(cmd.equals("stop")){   
      Serial.println("Stopping amplifier...\n");
      amplifier.SDPlayerControl(SD_AMPLIFIER_STOP);
    }else if(cmd.equals("musicList")){   
      Serial.println("Scanning music list...\n");
      amplifier.scanSDMusic(musicList);
      printMusicList();
    }else if(cmd.equals("changeMusic")){   
      cmd = musicList[Serial.parseInt()];
      if(cmd.length()){
        Serial.println("Changing Music...\n");
        amplifier.playSDMusic(cmd.c_str());
      }else{
        Serial.println("The currently selected music file is incorrect!\n");
      }

    }else{   
      Serial.println("Help : \n \
      Currently available commands (format: cmd-value):\n \
        Start playback: e.g. start-\n \
        Pause playback: e.g. pause-\n \
        Stop playback: e.g. stop-\n \
        Print music list: e.g. musicList-\n \
        Change songs according to the music list: e.g. changeMusic-1\n \
        Set and open high-pass filter: e.g. hp-500\n \
        Set and open low-pass filter: e.g. lp-15000\n \
        Close filter: e.g. closeFilter-\n \
        Set volume: e.g. vol-5.0\n \
      For the detailed meaning, please refer to the code comments of this demo.\n");   
    }
    while(Serial.read() >= 0);   
  }
}

7.2.5 实验过程

打开Arduino IDE,开发板选择为FireBeetle2 ESP32-E,上传速率设置为921600。

SD主控选择

将代码拷贝到Arduino IDE上,编译烧录代码到FireBeetle2 ESP32-E主控,自动播放SD卡存储的音频文件。

SD代码上传

8. API函数库

/*************************** 配置函数 ******************************/
/**
   * @fn begin
   * @brief Init function
   * @param btName - 创建的蓝牙设备名
   * @param bclk - I2S通信引脚号, 串行时钟SCK, 也叫位时钟(BCK)
   * @param lrclk - I2S通信引脚号, 帧时钟WS, 即命令(声道)选择,用于切换左右声道的数据
   * @param din - I2S通信引脚号, 串行数据信号SD, 用于传输二进制补码表示的音频数据
   * @return true on success, false on error
   */
  bool begin(const char *btName="bluetoothAmplifier", 
             int bclk=GPIO_NUM_25, 
             int lrclk=GPIO_NUM_26, 
             int din=GPIO_NUM_14);

  /**
   * @fn initI2S
   * @brief Initialize I2S
   * @param _bclk - I2S通信引脚号, 串行时钟SCK, 也叫位时钟(BCK)
   * @param _lrclk - I2S通信引脚号, 帧时钟WS, 即命令(声道)选择,用于切换左右声道的数据
   * @param _din - I2S通信引脚号, 串行数据信号SD, 用于传输二进制补码表示的音频数据
   * @return true on success, false on error
   */
  bool initI2S(int _bclk, int _lrclk, int _din);

  /**
   * @fn initBluetooth
   * @brief Initialize bluetooth
   * @param _btName - 创建的蓝牙设备名
   * @return true on success, false on error
   */
  bool initBluetooth(const char * _btName);

  /**
   * @fn initSDCard
   * @brief Initialize SD card
   * @param csPin SD卡模块的spi通信的cs引脚号
   * @return true on success, false on error
   */
  bool initSDCard(uint8_t csPin=GPIO_NUM_4);

/*************************** 功能函数 ******************************/

  /**
   * @fn scanSDMusic
   * @brief 扫描SD卡里面的WAV格式的音乐文件
   * @param musicList - SD卡里面扫描到的WAV格式的音乐文件, 类型是字符串数组
   * @return None
   * @note 音乐文件路径名字当前仅支持英文, 格式当前仅支持WAV格式的音乐文件
   */
  void scanSDMusic(String * musicList);

  /**
   * @fn playSDMusic
   * @brief 播放SD卡里面的音频文件
   * @param Filename - 音乐文件名, 当前仅支持 .wav 格式的音频文件
   * @note 音乐文件名需为绝对路径, 列如: /musicDir/music.wav
   * @return None
   * @note 音乐文件路径名字当前仅支持英文, 格式当前仅支持WAV格式的音乐文件
   */
  void playSDMusic(const char *Filename);

  /**
   * @fn SDPlayerControl
   * @brief SD卡音频播放控制接口
   * @param CMD - 播放控制命令: 
   * @n SD_AMPLIFIER_PLAY: 开始播放音乐, 可从之前暂停播放的位置继续播放
   * @n   若没有通过playSDMusic()选择播放的音乐文件, 会默认播放音乐列表第一首
   * @n   若SD卡没有扫描到正确格式的音乐文件也会播放失败(音乐文件路径名字当前仅支持英文, 格式当前仅支持WAV格式的音乐文件)
   * @n SD_AMPLIFIER_PAUSE: 暂停播放, 保留当前音乐文件的播放位置
   * @n SD_AMPLIFIER_STOP: 停止播放, 结束当前音乐的播放
   * @return None
   */
  void SDPlayerControl(uint8_t CMD);

  /**
   * @fn getMetadata
   * @brief 通过 AVRC 命令获取"诠释数据"(metadata)
   * @param type - 需要获取的元数据的类型, 目前支持的参数: 
   * @n     ESP_AVRC_MD_ATTR_TITLE   ESP_AVRC_MD_ATTR_ARTIST   ESP_AVRC_MD_ATTR_ALBUM
   * @return 相应类型的 "元数据"
   */
  String getMetadata(uint8_t type);

  /**
   * @fn getRemoteAddress
   * @brief 获取远程蓝牙设备地址
   * @note 地址将在本机与远程蓝牙设备配对连接后, 成功进行蓝牙AVRCP协议通信后获取
   * @return 返回存储远程蓝牙设备地址的数组指针
   * @n 当未连接远程设备, 或和远程设备进行蓝牙AVRCP协议通信不成功时, 返回None
   * @n AVRCP(Audio Video Remote Control Profile)
   */
  uint8_t * getRemoteAddress(void);

  /**
   * @fn setVolume
   * @brief 设置音量
   * @param vol - 设置音量, 可以设置范围 0 ~ 9
   * @note 5 即为音频数据原始音量, 无增减
   * @return None
   */
  void setVolume(float vol);

  /**
   * @fn openFilter
   * @brief 打开音频滤波器
   * @param type - bq_type_highpass: 开启高通滤波; bq_type_lowpass: 开启低通滤波
   * @param fc - 过滤波的阈值, 范围: 2~20000
   * @note 列如, 设置高通滤波模式, 阈值为500, 即为过滤掉音频信号中低于500的信号; 且高通滤波和低通滤波会同时工作
   * @return None
   */
  void openFilter(int type, float fc);

  /**
   * @fn closeFilter
   * @brief 关闭音频滤波器
   * @return None
   */
  void closeFilter(void);

  /**
   * @fn reverseLeftRightChannels
   * @brief Reverse left and right channels, When you find that the left
   * @n  and right channels play opposite, you can call this interface to adjust
   * @return None
   */
  void reverseLeftRightChannels(void);

更多资料下载

DFR0954 STP 3D 模型.rar

DFR0954 2D CAD 尺寸图.rar

DFR0954 2D PDF 尺寸图.pdf

DFR0954 电路原理图.pdf

MAX98357A 芯片手册.pdf

WIKI文档修改历史

文档版本号 修改时间 修改人 修改内容
V1.0 2022.5.10 康啸 第一版发布

产品修改历史

产品版本号 修改时间 修改人 产品修改内容
V1.0 2022.5.10 刘礼华 第一版发布

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

DFshopping_car1.png DFRobot商城购买链接