
#第十届立创电赛#便携扬声器
简介
使用 ESP32S3 制作一个简单的扬声器,使用数字麦克风和数字功放
简介:使用 ESP32S3 制作一个简单的扬声器,使用数字麦克风和数字功放开源协议
:Public Domain
描述
注:* 为必填项
请在报名阶段填写 ↓
* 1、项目功能介绍
这是一个基于 ESP32 的编写的便携式扬声器,通过数字麦克风获得音频数据,然后通过数字功放 HT513 从喇叭播放出去。
*2、项目属性
原创首次公开。
* 3、开源协议
GPL3.0开源协议
请在竞赛阶段填写 ↓
*4、硬件部分
使用 ESP32 S3 作为核心(但是并未使用ESP32 S3 特有的属性)。
*5、软件部分
通过 Arduino 基于 AudioTools 库完成。
1. 音频数据通过MSM261S4030H0来获得
2.使用国产的 HT513作为功放。这款芯片支持通过寄存器直接调整音量,使用起来非常方便。外部有一个旋转按钮,通过 ADC 来得到当前需要的音量。
完整代码如下:
/**
@file streams-i2s-i2s-2.ino
@brief Copy audio from I2S to I2S: We use 2 different i2s ports!
@author Phil Schatzmann
@copyright GPLv3
*/
#include
#include "AudioTools.h"
AudioInfo IN_info(16000, 1, 32);
AudioInfo OUT_info(16000, 1, 32);
I2SStream in;
I2SStream out;
VolumeStream vol(in);
StreamCopy copier(out, vol); // copies sound into i2s
//FormatConverterStream converter(in); // or use converter(out)
//StreamCopy copier(out, converter); // copier(converter, sound);
// HT513 音量
uint16_t Volume;
// 最小音量
#define LOWESTVOLUME 1
#define TOLENCE 16
#define HT513_ADDR_L 0x6c
/**
@brief ht513写寄存器
@param addr 寄存器地址
@param val 要写的值
@retval None
*/
void HT513_WriteOneByte(uint8_t addr, uint8_t val)
{
Wire.beginTransmission(HT513_ADDR_L);
Wire.write(addr);
Wire.write(val);
int ack = Wire.endTransmission(true);
Serial.print("Ack ");
Serial.println(ack, HEX);
}
/**
@brief ht513读寄存器
@param addr 寄存器地址
@retval 读取到的寄存器值
*/
uint8_t HT513_ReadOneByte(uint8_t addr)
{
uint8_t temp = 0;
Wire.beginTransmission(HT513_ADDR_L);
Wire.write(addr);
Wire.endTransmission(false);
uint8_t bytesReceived = 0;
bytesReceived = Wire.requestFrom(HT513_ADDR_L, (uint8_t)1, true);
if (bytesReceived == 1) {
temp = Wire.read();
}
else {
Serial.println("Read Error ");
}
return temp;
}
// Arduino Setup
void setup(void) {
delay(5000);
// HT513 SD Pin 需要设置为 High
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
analogReadResolution(9);
// Open Serial
Serial.begin(115200);
// change to Warning to improve the quality
//AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Info);
Wire.begin(18, 17);
int nDevices;
byte error, address;
Serial.println("Scanning...");
nDevices = 0;
for ( address = 1; address Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address Serial.print("0");
}
Serial.println(address, HEX);
nDevices++;
}
else if (error == 4) {
Serial.print("Unknow error at address 0x");
if (address Serial.print("0");
}
Serial.println(address, HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
// 设置 SD 为LOW
HT513_WriteOneByte(0x12, 0b11110000);
// 设置数据格式为 I2S, 32Bits
HT513_WriteOneByte(0x13, 0b00000000);
// 读取音量设置
Volume = analogRead(3);
uint8_t Vol=(Volume,0,511,0x07,0xff);
HT513_WriteOneByte(0x16, Vol);
HT513_WriteOneByte(0x15, Vol);
Serial.println(Volume, HEX);
// 调整声道
HT513_WriteOneByte(0x17, 0b10110000);
Serial.println("++++++++++++++++");
// 设置 SD 为HIGH
HT513_WriteOneByte(0x12, 0b11110100);
uint8_t Value = HT513_ReadOneByte(0x12);
Serial.println(Value, HEX);
Value = HT513_ReadOneByte(0x13);
Serial.println(Value, HEX);
Value = HT513_ReadOneByte(0x16);
Serial.println(Value, HEX);
Value = HT513_ReadOneByte(0x17);
Serial.println(Value, HEX);
// Define Converter
//converter.begin(IN_info, OUT_info);
// start I2S in
Serial.println("starting I2S...");
auto config_in = in.defaultConfig(RX_MODE);
config_in.copyFrom(IN_info);
config_in.i2s_format = I2S_STD_FORMAT;
config_in.is_master = true;
config_in.port_no = 1;
config_in.pin_bck = 37;
config_in.pin_ws = 38;
config_in.pin_data = 36;
// config_in.fixed_mclk = sample_rate * 256
// config_in.pin_mck = 2
in.begin(config_in);
// start I2S out
auto config_out = out.defaultConfig(TX_MODE);
config_out.copyFrom(OUT_info);
config_out.i2s_format = I2S_STD_FORMAT;
config_out.is_master = true;
config_out.port_no = 0;
config_out.pin_bck = 15;
config_out.pin_ws = 6;
config_out.pin_data = 7;
config_out.pin_mck = 16;
out.begin(config_out);
// set initial volume
vol.begin(IN_info); // we need to provide the bits_per_sample and channels
vol.setVolume(0.3);
Serial.println("I2S started...");
}
// Arduino loop - copy sound to out
void loop() {
copier.copy();
if (abs(analogRead(3) - Volume) > TOLENCE) {
// 读取音量设置
Volume = analogRead(3);
// 设置 SD 为LOW
HT513_WriteOneByte(0x12, 0b11110000);
uint8_t Vol=map(Volume,0,511,0x07,0xff);
HT513_WriteOneByte(0x16, Vol);
// 设置 SD 为HIGH
HT513_WriteOneByte(0x12, 0b11110100);
Serial.print(analogRead(3), HEX);
Serial.print(" ");
Serial.print(Volume, HEX);
Serial.print(" ");
Serial.println(Vol, HEX);
}
}
*6、BOM清单
*7、大赛LOGO验证

* 8、演示您的项目并录制成视频上传
视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;
视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程

评论