基于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)
上一篇 2022年6月26日 下午3:46
下一篇 2022年6月26日 下午3:46


相关推荐

  • 关于GPT

    关于GPT

    2026年3月16日
    4
  • SPU和SKU概念

    SPU和SKU概念SPU 介绍 SPU StandardProd 标准产品单位 概念 SPU 是商品信息聚合的最小单位 是一组可复用 易检索的标准化信息的集合 该集合描述了一个产品的特性 通俗点讲就是属性值 特性相同的货品就可以称为一个 SPU 举例 例如绿色的 IPhone12 就是一个 SPU 与商家 颜色 款式 套餐等都无关 SKU 介绍 SKU stockkeeping 库存量单位 概念 SKU 即库存进出计量的单位 可以是以件 盒 托盘等为单位 SKU 是物理上不可分割的最小

    2026年3月26日
    2
  • java调用HTTP接口(Get请求和Post请求)

    java调用HTTP接口(Get请求和Post请求)前提:一个Http接口:http://172.83.38.209:7001/NSRTRegistration/test/add.do?id=8888888&name=99999999id和name是传入的参数浏览器访问接口:java代码调用Http接口代码如下(代码中注释分为两部分:处理get请求和post请求):packagecom.inspur.OKHTTP…

    2022年5月24日
    818
  • idea2020.2激活码(JetBrains全家桶)

    (idea2020.2激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    269
  • Android触摸事件_简述兴奋在突触的传递过程

    Android触摸事件_简述兴奋在突触的传递过程版本:2.0日期:2014.3.21 2014.3.29 版权:©2014kince转载注明出处  一、基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突。比如在使用SliddingMenu菜单的时候,可能会与ViewPager或者其他的一些带有滑动事件的View相冲突,再比如ScrollView嵌套ListView相冲突等等。还有就是在自定义控件的时候,需

    2025年10月20日
    7
  • java double 类型_关于Java中的double类型数据

    java double 类型_关于Java中的double类型数据在初学 Java 的时候 一般我们都会从基本的数据类型开始学习 而在基本数据类型中 我认为 double 类型是比较难理解的 并且在以后的学习或工作中 在 double 类型数据这遇到的坑也是极多的 例如下面的这样一个程序 publicstatic String args System out println 2 0 1 1 很多人会认为上面的程序会打印出 0 9 但实际上 它打

    2026年3月18日
    2

发表回复

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

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