一、工程概述

1、项目描述

最近在Bilibili刷到大佬树莓好倒用ESP32实现了公网对讲的功能,同时大佬“小孩康”已是成功做出了此公网对讲机,在此我想复刻一下2位大佬的作品,留下保姆级别的教程,再次感谢两位大佬的帮助。

树莓好倒霉大佬Bilibili地址:

https://space.bilibili.com/1025274077

树莓好倒霉大佬博客地址:

使用ESP32做一个实时语音对讲机(局域网)

使用ESP32做一个实时语音对讲机(局域网)–对应gitlab工程

MQTT协议实现公网对讲(互联网)

MQTT协议实现公网对讲(互联网)–对应gitlab工程

小孩康大佬Bilibili地址:

自制ESP32 IIS公网对讲机 对讲机是不是已经成为过去式?

小孩康大佬嘉立创工程文件地址:

BILI对讲机嘉立创工程

2、项目说明

2.1、描述

在本教程中,我们将展示如何使用ESP-NOW通信协议在两个ESP32板之间建立双向通信。

ESP-NOW是乐鑫开发的无连接通信协议,具有短数据包传输的功能。此协议使多个设备无需使用Wi-Fi即可相互通信。这是一种快速的通信协议,可用于在ESP32板之间交换小消息(最大250字节)。 ESP-NOW具有多种用途,您可以采用不同的安排进行单向或双向通信。

在此项目中我们将使用ESP32+INMP441+MAX98357通过MQTT协议实现公网对讲功能,主要框架图如下图所示:

2.2、MQTT协议

本项目中使用MQTT协议;MQTT协议是TCP协议的应用,是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT使用的发布/订阅消息模式,提供了一对多的消息分发机制,从而实现与应用程序的解耦。这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。

MQTT可以运行在几乎所有的设备上,例如公网服务器(Linux、Windows系统等)、树莓派、局域网电脑等,当然,如果MQTT服务运行在局域网中,那就只能实现局域网的消息转发。如果你没有公网服务器,可以使用MQTT地址,实现互联网转发。如果没有公网条件的朋友,我的MQTT服务器将会免费开放,需要的朋友请私信我,我会在服务器上新建个只属于你账号和密码进行使用。

后续我会专门出一节讲解如何塔基MQTT服务器

2.3、使用的软件
开发环境使用的是Arduino IDE,后期我会专门出一期Arduino IDE环境的搭建教程:

2.4、使用的硬件
2.4.1、麦克风:INMP441(随便找家买就行,只要型号准确)


2.4.2、功放:MAX98357(随便找家买就行,只要型号准确)


2.4.3、主控:ESP32*2(可直接使用嘉立创工程的BOM中选的芯片)

备注:

2.4.4、充电模块:TP4056充电模块(随便找家买就行,只要型号准确)

2.4.5、外放喇叭(只要尺寸合适就行,顺便找家买)

2.4.6、内置电池(只要尺寸合适就行,顺便找家买,我买的这家可作为参考)

2.5、编程思路:

2.5.1、基本流程

发送:初始化I2S采集后,数据会源源不断的存放在DMAbuf中,按下按键,将数据取出,转换成需要的格式,最终转换成8bit数据发送出去。
接收:在ESP-NOW接受回调函数中,将接收到的数据重新转换为16位, 发送到I2S中的DMA去。注意,在没有接收到消息的是否,需清空dambuf,要不然会重复播放上一帧的音频,发出很大的噪音。
数据流向:I2S采集->原始32bit->16bit->8bit->esp-now发送->MQTT服务器(中转)->接收到数据8bit->转换为16bit->I2S播放

2.5.2、具体配置:
麦克风采集配置

const i2s_config_t rec_i2s_config = {
      .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
      .sample_rate = SAMPLE_RATE,
      .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
      .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,
      .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S| I2S_COMM_FORMAT_I2S_MSB),
      .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
      .dma_buf_count = 2,
      .dma_buf_len = 256,
}

扬声器采集配置:

const i2s_config_t spk_i2s_config = {
      .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
      .sample_rate = SAMPLE_RATE,
      .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
      .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, //2-channels
      .communication_format =(i2s_comm_format_t)(I2S_COMM_FORMAT_I2S),
      .intr_alloc_flags = 0,
      .dma_buf_count = 2,
      .dma_buf_len = 256,
};

2.6、硬件连接:
2.6.1、麦克风:INMP441:

购买麦克风硬件中标识ESP芯片中对应引脚嘉立创PCB板中对应标识
BCKIO4SCK
WSIO15WS
dataIO18SD

2.6.2、麦克风对应的程序代码:

2.6.3、功放:MAX98357:

购买麦克风硬件中标识ESP芯片中对应引脚嘉立创PCB板中对应标识
BCKIO23BLCK
WSIO22LRC
dataIO25DIN

2.6.4、功放对应的程序代码: