中科因仑“3+1”工程特种兵精英论坛
标题: 庆科VBS7100智能语音机器人方案 [打印本页]
作者: 张德帅 时间: 2018-9-13 01:09
标题: 庆科VBS7100智能语音机器人方案
本帖最后由 张澳 于 2018-9-13 01:12 编辑
重庆工商职业学院因仑班
设计报告
项目名称:智能语音履带小车
摘要
本产品基于庆科MXPVT-VBS7100语音模块。通过语音模块识别人声,模块通过云端识别语音指令给ARDUINO发送一个返回值,MCU通过判断返回值执行不同的程序,从而达到使用语音对小车的控制。本产品开发起来相对简单shi'h,入门快。
关键字:MXPVT-VBS7100、arduino、语音。
元器件清单表:
元器件名称 | 数量 |
MXPVT-VBS7100核心板 | 1 |
外围扩展版 | 1 |
电池 | 1 |
fpc排线+杜邦线 | 若干 |
喇叭 | 1 |
咪头 | 1 |
ARDUINO | 1 |
履带车车身 | 1 |
1602+IIC模块 | 1
|
| Left_motor = 8 | Left_motor_pwm=9 | Right_motor=11 | Right_motor_pwm=10 |
前进 | 1 | 1 | 0 | 1 |
刹车 | 0 | 0 | 0 | 0 |
左转A | 0 | 0 | 0 | 1 |
左转B | 0 | 1 | 0 | 1 |
右转A | 1 | 1 | 0 | 0 |
右转B | 1 | 1 | 1 | 1 |
后退 | 0 | 1 | 1 | 1 |
在使用模块之前我们要对模块本身进行配置,可以使用USB转TTL模块连接语音模块进行连接,再使用上位机对模块进行配置。
语音模块配置硬件连接图:
语音模块 | USB转TTL模块 |
TXD | RXD |
RXD | TXD |
GND | GND |
连好之后把模块插入电脑,之后在设备管理器中寻找是COM **。打开stc-isp-15xx-v6.86G.exe(带串口调试的软件即可),找到并打开相应的串口,且选择“115200”波特率(波特率选错的话将无法正常通信)。
1、模块恢复出厂设置:
在串口发送窗口输入: AT+FACTORY
返回: OK说明写入成功(注:发送和接收均采用文本模式)
然后输入AT+REBOOT重启模块
2、配置模块网络:
AT+WSAP=<ssid>,<key>
返回: OK说明写入成功(ssid:AP的ssid名称,最大32字节。 key:AP的密码,最大字节字节。长度小于8位时,加密方式:OPEN。大于8位时,加密方式:WPA。
)
然后输入AT+REBOOT重启模块
3、设置ASR识别指令:
AT+ASRADD=<cmd>,<index>
cmd:需要ASR识别的命令的拼音
index:数字,当ASR识别到音频的拼音和配置的匹配成功,就通过EVENT返回对应的index编号。
例如:
AT+ASRADD=qian jin,11
AT+ASRADD=hou tui,12
AT+ASRADD=zuo zhuan,13
AT+ASRADD=you zhuan,14
4、 根据返回值设置程序:
打开文件夹内:Arduino程序/CarRun/CarRun.ino
翻到程序的173行位置可以看到以下程序
if((data[0] =='\r')
&&(data[1]== '\n')
&&(data[2]== '+')
&&(data[3] == 'A')
&&(data[4] == 'S')
&&(data[5]== 'R')
&&(data[6] == 'E')
&&(data[7] == 'V')
&&(data[8]== 'E')
&&(data[9] == 'N')
&&(data[10] == 'T')
&&(data[11]== ':')
&&(data[12] == '1')
&&(data[13] == '1'))
[attach]4378[/attach]
(只需更改括号内相对内容即可)
5、语音模块与MCU连接:
语音模块 | arduino |
TXD | RXD |
RXD | TXD |
GND | GND
|
作者: 张德帅 时间: 2018-9-13 01:10
- #include <LiquidCrystal_I2C.h>
- LiquidCrystal_I2C lcd(0x3f, 16, 2);//如果12864不显示请更换地址0x3f
- int Left_motor=8; //左电机(IN3) 输出0 前进 输出1 后退
- int Left_motor_pwm=9; //左电机PWM调速
- int Right_motor_pwm=10; // 右电机PWM调速
- int Right_motor=11; // 右电机后退(IN1) 输出0 前进 输出1 后退
- char buffer[18]; //串口缓冲区的字符数组
- void setup() //设定串口和引脚模式
- {
- lcd.init();
- lcd.backlight();
- Serial.begin(115200);
- Serial.flush(); //清空串口缓存
- pinMode(Left_motor,OUTPUT); // PIN 8 8脚无PWM功能
- pinMode(Left_motor_pwm,OUTPUT); // PIN 9 (PWM)
- pinMode(Right_motor_pwm,OUTPUT);// PIN 10 (PWM)
- pinMode(Right_motor,OUTPUT);// PIN 11 (PWM)
- analogWrite(Left_motor_pwm,0);
- analogWrite(Right_motor_pwm,0);
- }
- void run() // 前进
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,HIGH); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
- }
- void goslow() // 前进
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,125);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,HIGH); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,155);//PWM比例0~255调速,左右轮差异略增减
- }
- void brake() //刹车,停车
- {
-
- digitalWrite(Right_motor_pwm,LOW); // 右电机PWM 调速输出0
- analogWrite(Right_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
- digitalWrite(Left_motor_pwm,LOW); //左电机PWM 调速输出0
- analogWrite(Left_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100);//执行时间,可以调整
- }
- void left() //左转(左轮不动,右轮前进)
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
-
- digitalWrite(Left_motor,LOW); // 左电机后退
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
- }
- /*void spin_left() //左转(左轮后退,右轮前进)
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
-
- digitalWrite(Left_motor,HIGH); // 左电机后退
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- */
- void right() //右转(右轮不动,左轮前进)
- {
- //小车右转
- digitalWrite(Right_motor,HIGH); // 右电机后退
- digitalWrite(Right_motor_pwm,HIGH); // 右电机PWM输出1
- analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,HIGH); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
- }
- /*
- void spin_right() //右转(右轮后退,左轮前进)
- {
- digitalWrite(Right_motor,HIGH); // 右电机后退
- digitalWrite(Right_motor_pwm,HIGH); // 右电机PWM输出1
- analogWrite(Right_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,LOW); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- */
- void back() //后退
- {
- digitalWrite(Right_motor,HIGH); // 右电机后退
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,LOW); // 左电机后退
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
- }
- void loop()
- {
-
- // lcd.setCursor(0,0); //设置显示指针
- // lcd.print("123456789"); //输出字符到LCD1602上
-
- if(Serial.available() > 0) //Serial.available()返回串口收到的字节数
- {
- int index = 0;
- delay(100); //延时等待串口收完数据,否则刚收到1个字节时就会执行后续程序
- int numChar = Serial.available();
- if(numChar > 17) //确认数据不会溢出,应当小于缓冲大小
- {
- numChar = 17;
- }
- while(numChar--)
- {
- buffer[index++] = Serial.read(); //将串口数据一字一字的存入缓冲
- }
- splitString(buffer); //字符串分割
- }
- }
- void splitString(char *data)
- {
- lcd.init();
- // Serial.print("Data entered:");
- // Serial.println(data);
- char *parameter;
- parameter = strtok(data, " ,"); //string token,将data按照空格或者,进行分割并截取
- // Serial.print("***");
- // Serial.println(parameter);
- lcd.setCursor(0,0); //设置显示指针
- lcd.print(parameter); //输出字符到LCD1602上
- while(parameter != NULL)
- {
- setLED(parameter);
- parameter = strtok(NULL, " ,"); //string token,再次分割并截取,直至截取后的字符为空
- // Serial.print("---");
- // Serial.println(parameter);
- }
- for(int x = 0; x < 18; x++) //清空缓冲
- {
- buffer[x] = '\0';
- }
- Serial.flush();
- }
- void setLED(char *data)
- {
- if((data[0] == '\r') &&(data[1] == '\n') &&(data[2] == '+') && (data[3] == 'A')&& (data[4] == 'S')&&(data[5] == 'R') && (data[6] == 'E')&& (data[7] == 'V')&&(data[8] == 'E') && (data[9] == 'N')&& (data[10] == 'T')&&(data[11] == ':')
- && (data[12] == '1')&& (data[13] == '1'))
- {
- // Serial.println("go forward!");
- run();
- }
-
- if((data[0] == '\r') &&(data[1] == '\n') &&(data[2] == '+') && (data[3] == 'A')&& (data[4] == 'S')&&(data[5] == 'R') && (data[6] == 'E')&& (data[7] == 'V')&&(data[8] == 'E') && (data[9] == 'N')&& (data[10] == 'T')&&(data[11] == ':')
- && (data[12] == '1')&& (data[13] == '2'))
- {
- // Serial.println("go back!");
- back();
- }
- if((data[0] == '\r') &&(data[1] == '\n') &&(data[2] == '+') && (data[3] == 'A')&& (data[4] == 'S')&&(data[5] == 'R') && (data[6] == 'E')&& (data[7] == 'V')&&(data[8] == 'E') && (data[9] == 'N')&& (data[10] == 'T')&&(data[11] == ':')
- && (data[12] == '1')&& (data[13] == '3'))
- {
- // Serial.println("go left!");
- left();
- }
- if((data[0] == '\r') &&(data[1] == '\n') &&(data[2] == '+') && (data[3] == 'A')&& (data[4] == 'S')&&(data[5] == 'R') && (data[6] == 'E')&& (data[7] == 'V')&&(data[8] == 'E') && (data[9] == 'N')&& (data[10] == 'T')&&(data[11] == ':')
- && (data[12] == '1')&& (data[13] == '4'))
- {
- // Serial.println("go right!");
- right();
- }
- if((data[0] == '\r') &&(data[1] == '\n') &&(data[2] == '+') && (data[3] == 'A')&& (data[4] == 'S')&&(data[5] == 'R') && (data[6] == 'E')&& (data[7] == 'V')&&(data[8] == 'E') && (data[9] == 'N')&& (data[10] == 'T')&&(data[11] == ':')
- && (data[12] == '1')&& (data[13] == '5'))
- {
- // Serial.println("Stop!");
- brake();
- }
- if((data[0] == '\r') &&(data[1] == '\n') &&(data[2] == '+') && (data[3] == 'A')&& (data[4] == 'S')&&(data[5] == 'R') && (data[6] == 'E')&& (data[7] == 'V')&&(data[8] == 'E') && (data[9] == 'N')&& (data[10] == 'T')&&(data[11] == ':')
- && (data[12] == '1')&& (data[13] == '6'))
- {
- // Serial.println("goslow!");
- goslow();
- }
- /* else
- {
- Serial.println("Stop!");
- brake();
- }
- */
- }
复制代码
作者: 张德帅 时间: 2018-9-13 01:10
完成以上步骤你就可以使用语音模块控制小车啦!是不是很简单!!!
作者: 张德帅 时间: 2018-9-13 08:59
本帖最后由 张德帅 于 2018-9-13 09:03 编辑
贴上资料链接:https://pan.baidu.com/s/1XfecwylHKkQnAUnEGNsRTw 密码:io5p
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) |
Powered by Discuz! X3.4 |