ESP32-S3+JQ8900S语音播报模块

简介:

核心板还是随便在淘宝买的一款ESP32-S3-DevKitC-1,因为使用到了一些传感器,获取了一些数据,所以也需要一个语音模块帮助我播报。我选择的是JQ8900S。淘宝随便搜。我遇到的困难就是,根本不知道怎么让ESP32-S3去控制模块播报,今天终于突破了。TvT,真的有点子心酸。

测试思路:

模块如图所示:

1.首先是测试语音:

看到模块的USB口了不,注意不是Type-C的,是以前比较传统的梯形。

USB 数据线(注意需要可以传输数据)连接芯片,插上电脑,电脑会自动识别,如下图所示:

然后双击新盘,把要放置的声音拷贝过去即可。声音的话,可以找一些语音合成软件,这边不提供哈。

2.利用专门串口调试软件调试:

模块和usb转ttl连接在一起,电脑发送数据,测试模块是否可以正常使用。这边我没有接喇叭,喇叭不分正负,接在SPK-,SPK+即可。接线如图所示:

然后可以发送一些数据:

举个例子:

如果是需要播放,就用串口助手发送 AA 01 00 AB,如果有播放,那一切正常。

3.利用ESP32-S3,配合USB转TTL测试:

此处两条数据线都插在电脑上,尝试控制开发板用串口发送数据,然后用另一个com口接收数据。看是否有显示。如果有,那就把手动发送数据改成开发板自主发送数据,那就大功告成了。

代码部分:

1.引入库,因为我用的是原始的TX和RX,所以不需要别的库,如果你是硬件串口,需要额外添加:

#incldue <HardwareSerial.h>

如果是软件串口,需要额外下载zip库:网页搜索SoftwareSerialESP32 即可找到网友链接。

添加好库之后:

#incldue <SoftwareSerial.h>

 现在我用的是原始TX,RX,所以我只需要:

#include <Arduino.h>

2.初始化:


void setup() {
 Serial.begin(9600);
 delay(100);
}

其他串口,自行找初始化方法哦。

3.循环体:

void loop() {
  SetVolume_10();
  delay(2000);
  Start();
  delay(2000);
  Next();
  delay(2000);
}

这里的函数是我自己写的:

.Write()就是串口发送数据。

void SetVolume_10(void){
  Serial.write(0xAA);
  Serial.write(0x13);
  Serial.write(0x01);
  Serial.write(0x0A);
  Serial.write(0xC8);
} 
void Start(void){
  Serial.write(0xAA);
  Serial.write(0x02);
  Serial.write(0x00);
  Serial.write(0xAC);
}
void Next(void){
  Serial.write(0xAA);
  Serial.write(0x06);
  Serial.write(0x00);
  Serial.write(0xB0);
}

全部代码:

#include <Arduino.h>

void setup() {
 Serial.begin(9600);
 delay(100);
}

void loop() {
  SetVolume_10();
  delay(2000);
  Start();
  delay(2000);
  Next();
  delay(2000);
}

//设置音量为10
void SetVolume_10(void){
  Serial.write(0xAA);
  Serial.write(0x13);
  Serial.write(0x01);
  Serial.write(0x0A);
  Serial.write(0xC8);
} 

//播放
void Start(void){
  Serial.write(0xAA);
  Serial.write(0x02);
  Serial.write(0x00);
  Serial.write(0xAC);
}

//下一首
void Next(void){
  Serial.write(0xAA);
  Serial.write(0x06);
  Serial.write(0x00);
  Serial.write(0xB0);
}

如果还需要什么功能,可以自己找模块说明书,找需要发送的数据。

总结:

测试了那么多个模块,我一直被一个问题困扰,那就是电平转换问题

我所用的哪些模块,全都是5V供电,但是我使用5V是无论如何都没有用的。

这里的1,6.大概就是问题的所在。我用的ESP32-S3,IO口的电平都是3.3,虽然我搜索的是可以兼容5V但是还是不行。所以我把模块供电都改为3.3V,最后就成功了。

希望以后使用模块,可以注意这些问题,希望也可以解决大家的一些问题。

其实还有别的博主有发布关于JQ8900S模块的使用代码,但是我个人感觉都比较繁琐,就是他们大部分都是模拟了串口发送的过程,什么时候给高电平什么时候给低电平,但是我直接用的Write()函数,个人感觉方便,还易懂。

<think>好的,我现在需要解决用户的问题:如何使用Arduino ESP32-S3进行红外传感器的速度检测,并请求示例代码和教程。首先,我得理解用户的需求。他们可能有一个红外传感器,比如红外对管或者红外速度传感器模块,想通过ESP32-S3来测量物体的运动速度。常见的应用可能是测速小车、转速测量等。 首先,我需要确认红外传感器的工作原理。红外速度检测通常基于遮挡原理,当物体通过传感器时,会遮挡红外光束,传感器输出信号变化。例如,旋转的编码盘上开有缝隙,每转一圈会产生多个脉冲。通过计算单位时间内的脉冲数,可以算出转速或线速度。 接下来,我需要考虑硬件连接。ESP32-S3的GPIO引脚可以接收数字信号,所以需要将红外传感器的输出连接到合适的引脚,比如GPIO 4。同时,可能需要上拉或下拉电阻,确保信号稳定。不过有些传感器模块可能已经内置了这些电路,直接输出高低电平。 然后是软件部分,需要编写Arduino代码来检测传感器信号的变化,计算时间间隔或脉冲频率。使用中断可能是必要的,因为这样可以准确捕获每个脉冲的上升沿或下降沿,避免轮询带来的延迟。ESP32-S3支持中断,所以可以配置一个中断服务程序(ISR)来计数脉冲。 在代码中,需要记录两次触发中断的时间差,从而计算速度。例如,如果已知每个脉冲对应物体移动的距离(比如编码盘每转一圈产生N个脉冲,周长已知),那么速度=距离/时间间隔。或者通过统计一定时间内的脉冲数来计算频率,进而得到转速。 需要注意的问题包括消抖处理,防止机械振动导致的误触发。可以在软件中加入延时滤波,或者在硬件上添加电容滤波。此外,中断处理函数应尽量简短,避免影响主程序运行。 示例代码的结构可能包括初始化中断、设置计数器、计算时间差和速度转换。用户可能需要根据实际传感器和被测物体的参数调整参数,比如每转脉冲数、轮子周长等。 还需要考虑可能的错误情况,比如传感器未触发时的处理,或者速度过低时的显示问题。此外,串口输出用于调试和显示结果,用户可能需要连接串口监视器查看数据。 最后,参考用户提供的引用资料,特别是关于ESP32-S3 CAM使用红外对管控制LED的项目,可能相关的硬件连接和代码结构可以借鉴。例如,引用[3]中提到的红外对管模块的使用方法,可能涉及到类似的GPIO配置和中断处理。此外,引用[4]提到的JQ8900S模块虽然用于语音播报,但展示了ESP32-S3与外设模块的交互,可能在代码结构上有参考价值。 总结步骤:硬件连接、配置中断、编写ISR、计算时间差和速度、输出结果。需要提供清晰的代码示例,并解释关键部分,让用户能够根据实际情况调整参数。同时,提醒用户注意消抖和测量精度的问题,可能需要进行实际测试和校准。</think>以下是使用Arduino ESP32-S3进行红外传感器速度检测的详细教程和示例代码: ### 一、红外测速原理 基于物体遮挡红外传感器时产生的脉冲信号,通过测量相邻两次触发的时间间隔$Δt$,结合已知物体运动特征(如轮周长$L$),计算速度$v$: $$v = \frac{L}{Δt}$$ 适用于旋转机械或线性运动场景[^3] ### 二、硬件准备 1. ESP32-S3开发板 2. 红外对管模块(如E18-D80NK) 3. 被测物体(带反光/遮挡标记) 4. 杜邦线若干 接线示意图: ``` 红外传感器OUT → ESP32-S3 GPIO4 VCC → 3.3V GND → GND ``` ### 三、示例代码 ```arduino volatile unsigned long lastTime = 0; volatile float speed = 0; const int sensorPin = 4; // 红外传感器信号引脚 const float circumference = 0.2; // 轮子周长(单位:米) void IRAM_ATTR sensorISR() { unsigned long currentTime = micros(); unsigned long deltaTime = currentTime - lastTime; if(deltaTime > 10000) { // 消抖处理(10ms) speed = circumference / (deltaTime / 1000000.0); // 计算速度 m/s lastTime = currentTime; } } void setup() { Serial.begin(115200); pinMode(sensorPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING); } void loop() { Serial.print("当前速度: "); Serial.print(speed * 3.6); // 转换为km/h Serial.println(" km/h"); delay(500); } ``` ### 四、关键代码解析 1. `volatile`关键字确保中断变量安全访问 2. `micros()`获取精确到微秒的时间戳 3. 中断触发方式选择`FALLING`(下降沿触发) 4. 10ms软件消抖过滤机械振动干扰 5. 单位转换实现m/s到km/h的实时显示 ### 五、校准优化建议 1. 精确测量实际运动部件周长 2. 使用示波器验证信号稳定性 3. 添加移动平均滤波算法: ```arduino #define FILTER_SIZE 5 float speedBuffer[FILTER_SIZE]; ... // 在loop()中添加: float avgSpeed = 0; for(int i=0; i<FILTER_SIZE-1; i++){ speedBuffer[i] = speedBuffer[i+1]; avgSpeed += speedBuffer[i]; } speedBuffer[FILTER_SIZE-1] = speed; avgSpeed = (avgSpeed + speed) / FILTER_SIZE; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值