1. 创作背景
目前,人们的生活正朝着便捷化、智能化方向发展。根据数据显示,我国每天产生的垃圾平均每人1.3kg左右,而且每日产生垃圾的量还在持续增长,而且每日产生的垃圾各式各样,种类很多。由于国民普遍性的存在垃圾分类意识浅薄,从而导致了我国垃圾分类政策难以推广。又由于垃圾分类的不明确,所以产生的污染环境、资源浪费、资源回收率低、资源可再生性若的一系列问题。
本设计就是结合人工智能的方式去宣传垃圾分类的意识,用直观、简洁、高效的方式科普国民对垃圾分类的意识。本设计也着重的针对老年人、青少年教育、文化程度较低的人群进行科普垃圾分类的重要性,以及每样垃圾的归类知识。
基于Arduino语音识别技术实现人机对话,当用户向单片机输入语音指令后,系统就会自动识别分析并执行垃圾分类操作。
2.创作思路
在Arduino单片机结合LD3320语音识别模块的基础上,实现了对垃圾分类语音智能识别系统的设计。其工作原理是通过LD3320语音识别模块的功能将用户发出的声音逐一转换成特定的字符串,字符串转换后通过模块中的串口发送到Arduino单片机的控制单元。控制单元接收到语音识别模块的字符串预置命令后,指引四个舵机开发板,控制舵机的旋转角度,实现垃圾桶的闭合状态。当过程结束后,Arduino单片机控制MP3语音播放模块播放相对应的指令。
第二章 关键技术
2.1Arduino单片机
2.1.1 Arduino开发板
Arduino单片机的储存空间也就是主控芯片所集成的储存空间。在储存空间中使用2kb的SRAM、1kb的EEPROM电可擦写编程只读储存器以及32kb flash。
Arduino单片机可通过USB接口与PC进行通讯,在PC中与ArduinoIDE进行衔接, 用于上传源程序,与此同时也给Arduino开发板提供电源。开发板对于供电要求也还是很苛刻的,所提供的电源必须是5V电压而VIN可以使用7至12伏特的电压。开发板一共有14个数字输出/输入的管脚,6个模拟输入。
同时也可以由程序的定义为输入或者输出;在管脚中2和3端口可以输入,外部中断信号3/5/6/9/10/11六个管脚可以提供8位(0-255)的滤波PWM输出;板载reset复位口,当按下reset复位键后Arduino将会恢复出产设置状态。
2.2 非特定语音识别分析技术
2.2.1LD3320语音识别模块
本产品采取LD3320语音识别模块。该模块是ICRoute公司生产的一款非特定语音识别芯片,它内置有非特定语音识别的DSP(Digital Signal Processing)算法。GND端用于接电源负极,vcc端接电源正极,ICR是识别模块状态显示。当收到语音是该处有绿灯闪烁,TXD用于串口的数据发送,RXD用于数据的接收。MIP,MIN是MIC的电源正负极,不同的接法MIC的识别率不同。同时与电脑上的LP—COMM串口调试工具配合可动态添加50条指令。LD3320识别模块无须外接其他设备,单一设备可完成语音识别。
第三章 需求分析
目前,人们的生活正朝着便捷化、智能化方向发展。根据数据显示,我国每天产生的垃圾平均每人1.3kg左右,而且每日产生垃圾的量还在持续增长,而且每日产生的垃圾各式各样,种类很多。由于国民普遍性的存在垃圾分类意识浅薄,从而导致了我国垃圾分类政策难以推广。又由于垃圾分类的不明确,所以产生的污染环境、资源浪费、资源回收率低、资源可再生性若的一系列问题。
本设计就是结合人工智能的方式去宣传垃圾分类的意识,用直观、简洁、高效的方式科普国民对垃圾分类的意识。本设计也着重的针对老年人、青少年教育、文化程度较低的人群进行科普垃圾分类的重要性,以及每样垃圾的归类知识。
基于Arduino语音识别技术实现人机对话,当用户向单片机输入语音指令后,系统就会自动识别分析并执行垃圾分类操作。
3.1系统目标
通过本系统的开发,应达到以下目标:
(1)系统具有一定的使用价值。
(2)系统操作简便,容易上手。
(3)具有对应数据库,可通过数据库录入垃圾分类信息。
(4)可通过语音识别技术达成人机交互。
(5)可通过抓取语音指令并分析执行相对应的操作。
3.2功能分析
系统最终实现的功能如下:
(1)语音识别交互。
(2)通过识别到的内容进行分析。
(3)通过已分析的内容进行归类。
(4)预留系统后期二次开发管脚以及I/O口。
(5)通过串口将两种硬件模块达成通讯。
第四章 系统设计
4.1 功能实现
4.1.1 功能设计
该系统软件的设计是基于Arduino IDE开发环境。该环境底层使用C/C++语言开发。当程序需要某一个模块驱动程序时,直接在IDE库函数中调用该模块的头文件加载到已有的文件中。在本系统设计采用头文件,专门驱动舵机的转动。
图4-1为系统的主流程图。当电源接通以后,机械臂要复位操作,如果语音识别模块识别到语音,该模块上面的绿灯闪烁,再判断内容是不是原先设定的指令,再执行相应操作,否则要下一次识别。
第五章 系统实现
5.1 物料准备
本设计主要硬件如下:
1.arduino单片机(图1):用于处理复杂的硬件动作以及指令。
2.LD3320语音识别模块(图2):用于采集语音信息以及分析语音信息。
3.MP3播放模块(图3):当系统做出判断后给用户反馈语音信息。
5.2 硬件焊接
将arduino的A1-A8焊接到LD3320语音识别模块中(图5-1),使两块硬件之间能达成通讯,再将MP3模块的RT与LD3320的XT引脚焊接(图5-2),RT对XT,XT对RT,将舵机焊接到arduino主板的I/O口,最后将扬声器焊接到MP3播放模块中。
5.3 程序设计
(1)引入舵机的支持库和软串口库
include <Servo.h>
include <SoftwareSerial.h>
(2)将LD3320板载管脚RX、TX和Arduino开发板的RX、TX交叉连接,使Arduino主板与LD3320达成串口通讯 :
A4(扩展板上SDA)为RX,接语音识别模块的TXD
A5(扩展板上SCL)为TX,接语音识别模块的RXD
(3)定义四个舵机,myservo1为可回收垃圾、myservo2为厨余垃圾、myservo3为有害垃圾、myservo4为其他垃圾。
SoftwareSerial softSerial(A4, A5);
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
(4)定义舵机管脚为int型 变量名最后一位数对应舵机编号,给变量赋予的值对应Arduino开发板管脚。每个管脚对应的值为:ms1对应可回收垃圾桶舵机、ms2对应厨余垃圾桶舵机、ms3对应有害垃圾桶舵机、ms4对应其他垃圾桶舵机。
int val;
int ms1 = 4;
int ms2 = 5;
int ms3 = 6;
int ms4 = 7;
(5)定义语音播报管脚,当返回管脚编号时:yy1“语音播报(这是可回收垃圾……)”、yy2=“语音播报(这是厨余垃圾……)”、yy3=“语音播报(这是有害垃圾……)”、yy4=“语音播报(这是其他垃圾……)”、yy5=“语音播报(我在的……)”、yy6=“语音播报(系统自我介绍播报……)”
int yy1 = 8;
int yy2 = 9;
int yy3 = 10;
int yy4 = 11;
int yy5 = 12;
int yy6 = 13;
(5)统一初始化串口波特率为9600。
void setup() {
Serial.begin(9600);
softSerial.begin(9600);
(6)初始化语音引脚,将yy1至yy6的管脚拉高,随后再次拉低。
pinMode(yy1, OUTPUT);
pinMode(yy2, OUTPUT);
digitalWrite(yy2, HIGH);
digitalWrite(yy3, HIGH);
(7)初始化舵机,将舵机1(ms1)至舵机4(ms4)的旋转角度初始化为90度。
myservo1.attach(ms1);
myservo2.attach(ms2);
myservo3.attach(ms3);
myservo4.attach(ms4);
myservo1.write(90);
delay(200);
(8)为了在初始化的过程中,防止舵机旋转角度发生抖动所以释放舵机角度,以解决多个舵机抖动。
myservo1.detach();
myservo2.detach();
myservo3.detach();
myservo4.detach();
}
(9)可回收垃圾桶盖开关操作,当接到指令初始化舵机后,舵机顺时针旋转90度,此时垃圾桶的状态为“开”,延时1秒后触发语音播报,当播报结束后舵机再次延时5秒,垃圾桶状态为关。
void khslj()
{
myservo1.attach(舵机1);
myservo1.write(舵机旋转90度);
delay(延时1秒);
digitalWrite(语音播报管脚为1, 低电平);
delay(延时1000毫秒);
digitalWrite(语音播报, 高电平);
delay(延时5秒);
ServoAction(开合状态码);
myservo1.detach(释放舵机);
}
(10)开盖,合盖动作函数
void ServoAction(int servo_num)
{
打开盖 舵机打开转向角度,用for语句,目的是减慢舵机的速度
循环 (int 引脚 = 90度; 引脚 > 0; 引脚 = 引脚 - 1)
{
如果 (servo_num == 1) myservo1.write(引脚);
判断 (servo_num == 2) myservo2.write(引脚);
判断(servo_num == 3) myservo3.write(引脚);
判断(servo_num == 4) myservo4.write(引脚);
延时(5);
}
延时(2000);
Serial.输出(servo_num);
Serial.输出("开");
(11)合盖舵机合上转向角度
判断 (servo_num == 1) myservo1.write(90);
判断(servo_num == 2) myservo2.write(90);
判断(servo_num == 3) myservo3.write(90);
判断 (servo_num == 4) myservo4.write(90);
delay(200);
Serial.println("合");
}
void loop()
{
val = softSerial.read(从软串口获得数据);
判断 (val > -1)
{
输出(val);
}
(12) 从串口读取语音识别模块的返回值,110是厨余垃圾,111是其他垃圾,112是有害垃圾,113是可回收垃圾
if (val == 254)
{
digitalWrite(yy5, LOW);
delay(1000);
digitalWrite(yy5, HIGH);
delay(50);
}
(13)如果识别到“介绍自己”指令后,播放预设的自我介绍文档,
if (val == 114)//254对应是唤醒语(“垃圾桶”)
{
digitalWrite(yy6, LOW);
delay(1000);
digitalWrite(yy6, HIGH);
delay(50);
}
(14)获取到串口数据后进行循环判断,110对应可回收垃圾、111对应厨余垃圾、112对应有害垃圾、113对应其他垃圾
if (val == 110)
{
cylj();
}
if (val == 111)
{
qtlj();
}
if (val == 112)
{
yhlj();
}
if (val == 113)