基于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java开发手册之OOP规约

    Java开发手册之OOP规约Java开发手册之OOP规约

    2022年4月22日
    45
  • Oracle数据库备份与还原语句

    Oracle数据库备份与还原语句1、备份语句(数据库导出)expusername/password@ip:port/servernamefile=”C:\Users\Administrator\Desktop\kpms.bak”full=yignore=y;2、导入语句(数据库还原)①全部导入:imp用户名/密码@数据库实例名full=yfile=C:\Users\Administrator\Desktop\kpms.bakignore=y;②单表导入:impusername/password@ip:p..

    2022年7月12日
    71
  • linux设置crontab任务_定时任务crontab每天7点执行

    linux设置crontab任务_定时任务crontab每天7点执行   在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps-ef|grepcron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“crontable”的简写。一、cron服务  cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。  servicecrondstar…

    2022年8月24日
    20
  • Thinkphp5学习笔记

    Thinkphp5学习笔记架构Thinkphp5目录架构thinkphp应用部署目录├─application应用目录(可设置)│├─common公共模块目录(可更改)│├─in

    2021年12月13日
    45
  • 傻妞机器人新版安装教程「建议收藏」

    傻妞机器人新版安装教程「建议收藏」本文由以下部分组成傻妞基础功能简介。傻妞机器人安装(只对接QQ)傻妞常规设置傻妞对接微信/公众号/TG机器人傻妞重启以及更换机器人QQ傻妞青龙扩展使用。其他一、傻妞功能简介1.傻妞青龙扩展可以发送命令控制青龙任务,添加青龙变量,提交COOKIE,查询资产,查看任务日志等等!可对接其他项目。2.配置扩展在sillyGirl/conf/config.yaml文件配置各种API,让傻妞功能丰富多彩。目前支持返回图片和文本(包括链接)。样例文件见文末。3.自定义文件功能扩展在sill

    2022年6月23日
    1.0K
  • php JSON数据格式化方法

    php JSON数据格式化方法

    2021年12月30日
    194

发表回复

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

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