基于ArduinoUNO的LD3320语音识别+SYN6288语音合成的智能分类垃圾桶

基于ArduinoUNO的LD3320语音识别+SYN6288语音合成的智能分类垃圾桶文章目录写在前面器件连接部分代码运行结果小结写在前面接上一篇文章,这次是集合了语音识别+语音合成(就是语音播报实现一种反馈)+SG90舵机实现垃圾桶的开与闭,给出上篇文章链接,如果对LD3320语音识别还有问题的朋友可以看看:LD3320语音识别模块与Arduino软串口通讯实现开关灯功能发现还是有好多人都在做这个,当玩具也好,毕设也好,这个都是一个好玩又有趣的项目。因为这只是现在的一门小课…

大家好,又见面了,我是你们的朋友全栈君。

写在前面

接上一篇文章,这次是集合了语音识别+语音合成(就是语音播报实现一种反馈)+SG90舵机实现垃圾桶的开与闭,给出上篇文章链接,如果对LD3320语音识别还有问题的朋友可以看看:LD3320语音识别模块与Arduino软串口通讯实现开关灯功能
发现还是有好多人都在做这个,当玩具也好,毕设也好,这个都是一个好玩又有趣的项目。因为这只是现在的一门小课设,就拿来当玩具玩玩,后期看情况会加入WIFI(或者蓝牙?)实现无线通讯,顺便学习一下物联网,用Android Studio开发一个APP就可以实现手机控制。还是一样,这篇文章仅作为参考。如有做得不足或者不对的地方,欢迎一起交流学习。

器件

  • SG90舵机*2(我这只实现2个分类,就可回收垃圾与其他垃圾,道理都一样)

  • LD3320语音识别模块

  • SYN6288语音合成模块

  • Arduino UNO R3 328p

  • 小垃圾筒*2 (这里我没用到)

连接

在这里插入图片描述

我是这么接,当然这个不是绝对。

LD3320 Arduino
5V 5V
GND GND
RXD D5
TXD D6
SYN6288 Arduino
5V 5V
GND GND
RXD D2
TXD D3

两个舵机,所以

SG90 Arduino
红线 5V
棕线 GND
橙线 D9、D10

两个舵机,分别9号跟10号。

部分代码

LD3320可以通过串口与产品中的单片机进行串口通信达到控制效果,如采用这种方式进行控制,用户可以对main.c函数中的处理函数进行修改,将输出的信息更改为输出识别码,那么在每次识别成功后串口都将打印输出对应的识别码,产品中的单片机就可以对该识别码进行操作以达到控制效果。

给出LD3320模块的原理图在这里插入图片描述
厂家给的文件:
LDChip.c

uint8 LD_AsrAddFixed()
{ 
   
  uint8 k, flag;
  uint8 nAsrAddLength;
#define DATE_A 11 /*数组二维数值*/
#define DATE_B 20 /*数组一维数值*/
  uint8 code sRecog[DATE_A][DATE_B] =
  { 
   
    "la ji tong",\ //一级口令设为“垃圾桶”
    "fei zhi",\
    "su liao",\
    "bo li",\
    "yi la guan",\
    "bao zhi",\
    "yi wu",\
    "wei sheng zhi",\
    "guo ke",\
    "luo ye",\
    "chen tu"
  };	/*添加关键词,用户修改*/
  uint8 code pCode[DATE_A] =
  { 
   
    CODE_CMD,\
    CODE_1,\
    CODE_2,\
    CODE_3,\
    CODE_4,\
    CODE_5,\
    CODE_6,\
    CODE_7,\
    CODE_8,\
    CODE_9,\
    CODE_10
  };	/*添加识别码,用户修改*/
  ..........

文件:main.c

void 	User_handle(uint8 dat)
{ 
   
  if(0==dat)
  { 
   
    G0_flag=ENABLE;
		UARTSendByte(0x01);    //将识别到的识别码传到串口输出,以下同理
		PrintCom("1/r/n");
    LED=0;
  }
  else if(ENABLE==G0_flag)
  { 
   
    G0_flag=DISABLE;
    LED=1;
    switch(dat)
		{ 
   
		case CODE_1:
			UARTSendByte(0x02);
			PrintCom("2/r/n");
			SRD1 = 1;
			break;
		case CODE_2:
			UARTSendByte(0x02);
			PrintCom("2/r/n");
			SRD1 = 0;
			break;
...........

给出SYN6288原理图:
在这里插入图片描述

关于SYN6288得多说几句,主控制器和SYN6288语音合成芯片之间通过UART接口连接,控制器可通过通讯接口向SYN6288语音合成芯片发送控制命令和文本,SYN6288语音合成芯片把接收到的文本合成为语音信号输出,输出的信号经功率放大器进行放大后连接到喇叭进行播放。

使用之前得要把发送的文本转换文本编码格式
在这里插入图片描述
我们与这个芯片“对话”用的不是中文,得首先把中文转换它才能“念出来”,网上有很多这些转换的方法,这里就不再纂述。

Arduino代码

#include <Servo.h> //调用这个库,控制舵机的
#include <SoftwareSerial.h> //定义软串口的

SoftwareSerial softSerial1(6,5);   //6为RX,5为TX
SoftwareSerial softSerial2(3,2);   //3为RX,5为TX
Servo myservo1;  // 定义舵机一
Servo myservo2;  // 定义舵机二
int a;

void speech1(){ 
            //播放:提示音msgd
  unsigned char i = 0;
  unsigned char head[10];

  head[0] = 0xFD;
  head[1] = 0x00;
  head[2] = 0x07;
  head[3] = 0x01;
  head[4] = 0x00;
  head[5] = 0x6D;
  head[6] = 0x73;
  head[7] = 0x67;
  head[8] = 0x64;
  head[9] = 0xE6;

  for(i=0; i<10; i++){ 
   
    softSerial2.write(head[i]);
  }
}

void speech2(){ 
             //播放:可回收垃圾
  unsigned char j = 0;
  unsigned char head1[16];

  head1[0] = 0xFD;
  head1[1] = 0x00;
  head1[2] = 0x0D;
  head1[3] = 0x01;
  head1[4] = 0x00;
  head1[5] = 0xBF;
  head1[6] = 0xC9;
  head1[7] = 0xBB;
  head1[8] = 0xD8;
  head1[9] = 0xCA;
  head1[10] = 0xD5;
  head1[11] = 0xC0;
  head1[12] = 0xAC;
  head1[13] = 0xBB;
  head1[14] = 0xF8;
  head1[15] = 0xD4;

  for(j=0; j<16; j++){ 
   
    softSerial2.write(head1[j]);
  }
}

void speech3(){ 
               //播放:其他垃圾
  unsigned char k = 0;
  unsigned char head2[14];

  head2[0] = 0xFD;
  head2[1] = 0x00;
  head2[2] = 0x0B;
  head2[3] = 0x01;
  head2[4] = 0x00;
  head2[5] = 0xC6;
  head2[6] = 0xE4;
  head2[7] = 0xCB;
  head2[8] = 0xFB;
  head2[9] = 0xC0;
  head2[10] = 0xAC;
  head2[11] = 0xBB;
  head2[12] = 0xF8;
  head2[13] = 0xCA;

  for(k=0; k<14; k++){ 
   
    softSerial2.write(head2[k]);
  }
}

void setup() { 
   
  myservo1.attach(9);  // D9为舵机一信号口
  myservo2.attach(10); // D10为舵机二信号口
  Serial.begin(9600);  //串口初始化
  softSerial1.begin(9600);
  softSerial2.begin(9600);
}

void loop() { 
   
  softSerial1.listen();		//监听第一个串口
  a=softSerial1.read();      //读取串口1的值
  switch(a)
  { 
   
    case 1:
      speech1();            //播放提示音
      break;
    case 2:
      speech2();              //识别到是可回收垃圾,并播报出来
      delay(1000);
      myservo1.write(90);        //舵机一旋转90° 
      delay(3000);               //延迟一段时间,也就是扔垃圾的时间
      myservo1.write(0);        
      delay(5);                 //给舵机一个转动的时间
      break;
    case 3:
      speech3();
      delay(1000);            //识别到是其他垃圾,并播报出来
      myservo2.write(90);        //舵机二旋转90°
      delay(3000);
      myservo2.write(0);        
      delay(5); 
      break;
    default:
      break;
  }
}

关于softSerial1.listen(); 要说几句,之前一直发现一个问题,就是我在用着两个软串口进行通讯,发现语音播报的功能就显示不出来,但是我分着来用,却可以实现,这里提出串口监听的方法,按我的目前的理解就是,只运行第一个软串口,即语音识别模块的串口通讯,这样程序就能完好的运行了。

运行结果

因为这里不能直接上传视频,总的来说是可以正常运行的了,-.-
那我就用串口监视器来说明吧
在这里插入图片描述

小结

(估计也没人看总结)总的来说,基本的功能已经实现了,接下来就是提升或者想想怎么提高识别率以及增加几句“垃圾语”,因为目前时不时还是会乱识别到不该识别到的对话。用Arduino控制舵机就几句代码就可以实现,这比STM32或者51方便好多好多。
这是玩具,这是玩具,这是玩具。 文章中肯定有很多不足的地方,有很多交代不来的东西,我说怎么做这东西的人很多,但是在CSDN上没有,可能就是很多东西不知道怎么用语言表达。
希望能帮到做这个项目方向的朋友,也希望能帮到偶然点进来的朋友。

完整代码:点击下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153158.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 超分辨率-RDN[通俗易懂]

    超分辨率-RDN[通俗易懂]一、简介RDN——ResidualDenseNetwork——残差深度网络RDN是基于深度学习的超分方法之一二、结构RDN网络结构分为4个部分:1、SFENet(ShallowFeatureExtractionNet,浅层特征提取网络)2、RDBs(ResidualDenseBlocks,残差稠密块)3、DFF(DenseFeatureFusion,稠密特…

    2022年6月18日
    50
  • 基于TCP的socket编程原理概述「建议收藏」

    基于TCP的socket编程原理概述「建议收藏」解:服务器端:1)创建套接字socket;2)bind(将套接字绑定到本地地址和端口上)3)listen(将套接字设置为监听模式,准备接受连接请求)4)accept等待客户请求到来,当请求到后,接受连接请求,返回一个新的对应于此次连接的套接字5)用返回的套接字和客户端进行通信(send/receive)6)返回等待另个客户请求7)关闭套接字客户端:1)创

    2022年10月18日
    0
  • android美化界面设计_android界面模板

    android美化界面设计_android界面模板前言:很多童鞋对美化很感兴趣,都想拥有一个完完全全属于自己风格的手机系统!对那些自定义全局背景,1%电量显示,透明下拉菜单。。。都很感冒!美化的重点跟难点就在于对”framework-res.apk”和”systemUI.apk”这两个文件的编译和反编译!这里说的编译和反编译是所有深度美化都必须要做的事,也就是说,所有的美化都是基于对apk的反编译后,才能进行的!而绝大多数修改”framework…

    2022年9月2日
    4
  • eclipseSVN的安装及使用「建议收藏」

    eclipseSVN的安装及使用「建议收藏」eclipseSVN的安装及使用

    2022年4月22日
    44
  • 几种常见卷积神经网络结构

    几种常见卷积神经网络结构卷积神经网络图像特征的提取与分类一直是计算机视觉领域的一个基础而重要的研究方向。卷积神经网络(ConvolutionalNeuralNetwork,CNN)提供了一种端到端的学习模型,模型中的参数可以通过传统的梯度下降方法进行训练,经过训练的卷积神经网络能够学习到图像中的特征,并且完成对图像特征的提取和分类。作为神经网络领域的一个重要研究分支,卷积神经网络的特点在于其每一层的特征都由上一层的局部区域通过共享权值的卷积核激励得到。这一特点使得卷积神经网络相比于其他神经网络方法更适合应用于图像特征的.

    2022年6月16日
    20
  • 怎样在桌面建立透明框放置文件夹_雨滴桌面怎么用

    怎样在桌面建立透明框放置文件夹_雨滴桌面怎么用一、效果1、YcDock-left2.0动图是1.0版的,2.0是第二张图,懒得截动图了下载地址:2、YcDock-bottom2.0下载地址:喜欢的小伙伴点赞收藏下载吧

    2022年9月3日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号