基于I2S和esp-now协议制作esp32对讲机
1.概述
这篇文章介绍基于I2S和esp-now协议制作对讲机,他的实现需要在ESP32开发环境的2.0.10版本号下才能成功,高版本号的源码有改动会导致编译失败。
安装ESP32 2.0.10版本:
https://brucelong.blog.csdn.net/article/details/141426671
2.硬件介绍
2.1.材料准备
名称 | 型号 | 数量 |
---|---|---|
esp32开发板 | ESP-WROOM-32 | 2 |
麦克风 | INMP441 | 2 |
音频放大器 | MAX98357 | 2 |
喇叭 | 3w | 2 |
2.2.测试麦克风
首先测试下我们的麦克风是否能接收到音频信号,下面是测试方法。
1.搭建麦克风电路
麦克风 | ESP32 |
---|---|
SCK | IO4 |
WS | IO15 |
SD | IO13 |
GND | GND |
VCC | 3.3V |
2.测试程序
//调用I2S驱动
#include <driver/i2s.h>
//定义INMP441管脚
#define I2S_WS 15
#define I2S_SD 13
#define I2S_SCK 4
// I2S端口号
#define I2S_PORT I2S_NUM_0
//I2S读取到数据的缓存区
#define bufferLen 64
int16_t sBuffer[bufferLen];
void i2s_install() {
// 按照以下配置来启动I2S端口
const i2s_config_t i2s_config = {
.mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = 44100,
.bits_per_sample = i2s_bits_per_sample_t(16),
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
.intr_alloc_flags = 0,
.dma_buf_count = 8,
.dma_buf_len = bufferLen,
// .use_apll = false
};
i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
}
void i2s_setpin() {
// 设置I2S
const i2s_pin_config_t pin_config = {
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = -1,
.data_in_num = I2S_SD
};
i2s_set_pin(I2S_PORT, &pin_config);
}
void setup() {
// 打开串口
Serial.begin(115200);
Serial.println(" ");
delay(1000);
// 启动I2S端口
i2s_install();
i2s_setpin();
i2s_start(I2S_PORT);
delay(500);
}
void loop() {
//持续打印两条参考线
int rangelimit = 3000;
Serial.print(rangelimit * -1);
Serial.print(" ");
Serial.print(rangelimit);
Serial.print(" ");
// 获取I2S读取的数据
size_t bytesIn = 0;
esp_err_t result = i2s_read(I2S_PORT, &sBuffer, bufferLen, &bytesIn, portMAX_DELAY);
if (result == ESP_OK)
{
// 读取缓存区
int16_t muestras = bytesIn / 8;
if (muestras > 0) {
float promedio = 0;
for (int16_t i = 0; i < muestras; ++i) {
promedio += (sBuffer[i]);
}
promedio /= muestras;
// 串口打印出获取到的数据曲线
Serial.println(promedio);
}
}
}
3.测试麦克风
上传程序后在ArduinoIDE上打开窗口绘图仪,然后放出一些声音让麦克风采集,在监视器上能看到音频信号的跳动说明麦克风采集到了信号。
2.3.搭建对讲机电路
1.搭建麦克风电路
麦克风 | ESP32 |
---|---|
SCK | IO4 |
WS | IO15 |
SD | IO13 |
GND | GND |
VCC | 3.3V |
2.搭建音频放大器电路
MAX98357 | ESP32 |
---|---|
LRC | 22 |
BCLK | 26 |
DIN | 25 |
GND | GND |
VIN | VIN |
3.程序介绍
通过百度网盘分享的文件:esp32对讲机I2S_ESP-NOW协议
链接:https://pan.baidu.com/s/1Jvx-XWG0ejYKe6ORIhqrCQ?pwd=21zz
提取码:21zz
3.1.对讲机项目介绍
打开下载后的文件能够看到如下6个文件,他们作用如下
- esp32-audio-communication:项目主程序
- Audioi2s:封装I2S协议的对讲机函数,主要包含麦克风和音频放大器引脚的定义
- transport:封装esp-now协议的功能函数,主要用来传输音频信息。
在ArduinoIDE中打开 esp32-audio-communication
主程序,然后上传到两个ESP-32开发板
3.2.对讲机使用
将两个ESP32通电,然后按下其中一个开发板的BOOT
按键开始说话,在另一个ESP32开发板上就能听到声音。