基于I2S通讯MAX98357模块的JetsonNano声音外放

前言

有很多方法可以为 Jetson 设备添加音频功能。USB 扬声器和USB 麦克风是一种简单的解决方案,但它们确实占用了宝贵的 USB 插槽,这些插槽可能更适合用于键盘、蓝牙功能、Internet Keys 和其他配件。

在 Jetson 设备上,NVIDIA 通过 40 针 GPIO 扩展接头提供对 I2C、SPI 和 I2S 等一系列外围设备的访问。为了处理音频,我们最感兴趣的是 I2S 外设,它是一种用于连接数字音频设备的电气串行总线接口。我们不需要从头开始创建 I2S 功能,但了解常见通信协议的来龙去脉总是有用的,因此有关 I2S 的更多信息,请查看这篇精彩的文章。


硬件介绍

Adafruit MAX98357 I2S D 类单声道放大器适用于具有数字音频功能的微控制器和微型计算机。它可以接收标准的 I2S 数字音频输入,并将其解码为模拟信号,然后直接放大到扬声器中。

这款小型单声道放大器的重量超过了它的重量 - 能够为 4 欧姆阻抗扬声器提供高达 3.2 瓦的功率。鉴于其 D 类架构,该放大器非常高效,可轻松在 2.7V 至 5.5V 直流电源下运行 - 非常适合便携式和电池供电项目。


开始配置JETSON NANO

第一步,使用jetson-io库,开启I2S引脚功能

如果没有jetson-io库,请移步阅读:http://t.csdn.cn/RbA6w

安装好jetson-io库后,

sudo /opt/nvidia/jetson-io/jetson-io.py

就可以看到如下界面:

选择配置40p扩展引脚选项,然后设置为如下界面(使用回车设置星号)

然后back后第一个选项就是保存并推出和重启。重启后引脚即配置完成。


硬件连接

按照这样子连接:

其中,SD和GAIN引脚好像是可以悬空的,本人没接这两个引脚,一样能正常使用。

然后,物理连接max98357和喇叭,喇叭本人选的是3W 8欧姆的,类似这样:


测试阶段

现在系统已经配置完了,硬件也连接好了,可以直接在Ubuntu界面改变音量大小,听听喇叭有无提示音发出。

然后去播放一首歌来听听吧。3W的喇叭会比1W的音质好点,声音也挺大的。

### 使用 MAX98357 进行 I2S 录音配置 #### 配置概述 为了实现使用 MAX98357 芯片通过 I2S 接口进行录音的功能,在初始化阶段需完成 I2S 库以及 MAX98357 的基本设置。这涉及到硬件连接、软件库的选择和参数设定等多个方面的工作。 #### 硬件准备与连接 确保 INMP441 和 MAX98357 正确接入开发板上的 I2S 接口,具体连线方式依据所使用的微控制器平台而定。通常情况下,这些模块会共享同一组 SCK(串行时钟)、WS(字选择信号)和 SD(串行数据)线路[^1]。 #### 初始化过程 在 `setup()` 函数内执行必要的初始化操作: ```cpp #include <Arduino.h> #include "driver/i2s.h" #define I2S_NUM I2S_NUM_0 // 定义要使用的I2S编号 #define SAMPLE_RATE 22050 // 设置采样率 void setup(){ Serial.begin(115200); // 开始配置I2S总线 i2s_config_t i2s_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX), .sample_rate = SAMPLE_RATE, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = I2S_COMM_FORMAT_I2S_MSB, .intr_alloc_flags = 0, .dma_buf_count = 8, .dma_buf_len = 64, .use_apll = false, .tx_desc_auto_clear = true, .fixed_mclk = 0 }; // 创建并安装I2S驱动实例 i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); // 配置I2S引脚映射表 i2s_pin_config_t pin_config; pin_config.bck_io_num = CONFIG_I2S_BCLK; // BCLK Pin Number pin_config.ws_io_num = CONFIG_I2S_LRCLOCK; // LRClock Pin Number pin_config.data_out_num = I2S_PIN_NO_CHANGE; // 不需要输出pin pin_config.data_in_num = CONFIG_I2S_DIN; // DIN Pin Number i2s_set_pin(I2S_NUM, &pin_config); // 将上述定义好的引脚分配给指定的I2S单元 } ``` 此部分代码展示了如何创建一个接收模式下的 I2S 实例,并指定了所需的通信格式和其他重要属性,比如采样频率、每样本位数等。同时设置了对应的 GPIO 引脚用于物理层面上的数据交换[^2]。 #### 数据读取与处理 一旦完成了前面提到的基础工作之后,则可以在主循环里编写逻辑来周期性地获取来自麦克风阵列的声音片段,并将其保存到内存缓冲区内供后续分析或转储至外部存储介质中去。 ```cpp uint8_t* buffer; size_t bytes_read; void loop() { // 从I2S接口读取音频帧 size_t bytes_to_read = sizeof(buffer); i2s_read(I2S_NUM, buffer, bytes_to_read, &bytes_read, portMAX_DELAY); // 处理接收到的数据... } // 当不再需要继续录制时调用该函数停止服务 void stop_recording(void){ i2s_driver_uninstall(I2S_NUM); } ``` 这段示例说明了怎样利用 `i2s_read` API 来持续不断地抓取由 MIC 输入端传来的原始 PCM 流,并存放在预先分配的一块连续地址空间之中等待进一步的操作——例如编码压缩成 MP3 文件或是直接上传云端服务器等等[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星羽空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值