风筝
发表于: 昨天 20:14 | 显示全部楼层

在智能音箱、智能音响等智能家居设备中,经常使用HIFI级来形容其音频性能。这些设备通常具有高质量的音频解码器、音频放大器、高保等音频元件,能够提供更加真实、清晰、细腻的音乐表现,带给用户更好的听觉体验。在本篇帖子中,我们将使用UDA1334A立体声解码器模块还原音频信号。


所需的组件

●    ESP-WROOM-32 ESP32开发板

●    UDA1334A I2S立体声解码器模块

●    跳线


UDA1334A I2S立体声解码器模块简介

UDA1334A是一款多功能数模转换器,以其出色的音频性能而闻名。其关键特性在于能够提供高保真声音再现,使其成为音频爱好者和专业人士的首选。DAC支持广泛的采样频率,确保准确、细致的音频播放。

1.jpg


UDA1334A解码器模块的引脚分布

UDA1334A模块共有14个引脚,如下图所示:

pin.jpg

●    5V:电源输入 (5V)

●    3.3V:电源输入 (3.3V)

●    GND:IC 的接地参考

●    LRC(Left/Right Clock):用于左/右声道识别的输入

●    DOUT(Data Out):用于传输转换后的模拟信号的串行数据输出

●    BCLK(Bit Clock):用于同步数据传输的输入

●    LOUT(Left Channel Output):左声道的模拟音频输出

●    AGND(Analog Ground):用于内部模拟参考的接地

●    ROUT(Right Channel Output):右声道的模拟音频输出

●    SCLK(System Clock):用于系统时钟同步的输入

●    SF0 和 SF1(Digital Filter Select):用于选择数字滤波器选项的输入。SF0 和 SF1 用于设置输入数据格式。默认情况下,两者都被拉低以用于 I2S,但您可以更改它们以获得其他格式。

●    MUTE:用于静音音频输出的输入

●    PLL(Phase-Locked Loop):用于外部时钟同步的输入

●    DEEM(De-emphasis):用于去加重控制的输入


硬件连接

将ESP32开发板连接到UDA1334A模块,如下图所示:

wire.jpg

代码

首先,在Arduino IDE上安装ESP32-audioI2S库:https://github.com/schreibfaul1/ESP32-audioI2S

然后将以下代码上传到您的ESP32开发板。

  1. //**********************************************************************************************************
  2. //*    audioI2S-- I2S audiodecoder for ESP32,                                                              *
  3. //**********************************************************************************************************
  4. //
  5. // first release on 11/2018
  6. // Version 3  , Jul.02/2020
  7. //

  8. #include "Arduino.h"
  9. #include "WiFiMulti.h"
  10. #include "Audio.h"
  11. #include "SPI.h"
  12. #include "SD.h"
  13. #include "FS.h"

  14. // Digital I/O used
  15. #define SD_CS          5
  16. #define SPI_MOSI      23
  17. #define SPI_MISO      19
  18. #define SPI_SCK       18
  19. #define I2S_DOUT      25
  20. #define I2S_BCLK      27
  21. #define I2S_LRC       26

  22. Audio audio;
  23. WiFiMulti wifiMulti;
  24. String ssid =     "xxxxx";
  25. String password = "xxxxx";


  26. void setup() {
  27.     pinMode(SD_CS, OUTPUT);      digitalWrite(SD_CS, HIGH);
  28.     SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
  29.     SPI.setFrequency(1000000);
  30.     Serial.begin(115200);
  31.     SD.begin(SD_CS);
  32.     WiFi.mode(WIFI_STA);
  33.     wifiMulti.addAP(ssid.c_str(), password.c_str());
  34.     wifiMulti.run();
  35.     if(WiFi.status() != WL_CONNECTED){
  36.         WiFi.disconnect(true);
  37.         wifiMulti.run();
  38.     }
  39.     audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);
  40.     audio.setVolume(12); // 0...21

  41. //    audio.connecttoFS(SD, "/320k_test.mp3");
  42. //    audio.connecttoFS(SD, "test.wav");
  43. //    audio.connecttohost("http://www.wdr.de/wdrlive/media/einslive.m3u");
  44. //    audio.connecttohost("http://macslons-irish-pub-radio.com/media.asx");
  45. //    audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.aac"); //  128k aac
  46.       audio.connecttohost("http://mp3.ffh.de/radioffh/hqlivestream.mp3"); //  128k mp3
  47. }

  48. void loop()
  49. {
  50.     audio.loop();
  51.     if(Serial.available()){ // put streamURL in serial monitor
  52.         audio.stopSong();
  53.         String r=Serial.readString(); r.trim();
  54.         if(r.length()>5) audio.connecttohost(r.c_str());
  55.         log_i("free heap=%i", ESP.getFreeHeap());
  56.     }
  57. }

  58. // optional
  59. void audio_info(const char *info){
  60.     Serial.print("info        "); Serial.println(info);
  61. }
  62. void audio_id3data(const char *info){  //id3 metadata
  63.     Serial.print("id3data     ");Serial.println(info);
  64. }
  65. void audio_eof_mp3(const char *info){  //end of file
  66.     Serial.print("eof_mp3     ");Serial.println(info);
  67. }
  68. void audio_showstation(const char *info){
  69.     Serial.print("station     ");Serial.println(info);
  70. }
  71. void audio_showstreamtitle(const char *info){
  72.     Serial.print("streamtitle ");Serial.println(info);
  73. }
  74. void audio_bitrate(const char *info){
  75.     Serial.print("bitrate     ");Serial.println(info);
  76. }
  77. void audio_commercial(const char *info){  //duration in sec
  78.     Serial.print("commercial  ");Serial.println(info);
  79. }
  80. void audio_icyurl(const char *info){  //homepage
  81.     Serial.print("icyurl      ");Serial.println(info);
  82. }
  83. void audio_lasthost(const char *info){  //stream URL played
  84.     Serial.print("lasthost    ");Serial.println(info);
  85. }
复制代码

上传后,ESP32将与广播服务器建立连接并开始播放歌曲。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 56 | 回复: 109



手机版|

GMT+8, 2024-12-19 01:35 , Processed in 0.059028 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表