中科因仑“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模块
TXDRXD
RXDTXD
GNDGND

连好之后把模块插入电脑,之后在设备管理器中寻找是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
TXDRXD
RXDTXD
GNDGND







作者: 张德帅    时间: 2018-9-13 01:10

  1. #include <LiquidCrystal_I2C.h>
  2. LiquidCrystal_I2C lcd(0x3f, 16, 2);//如果12864不显示请更换地址0x3f
  3. int Left_motor=8;     //左电机(IN3) 输出0  前进   输出1 后退
  4. int Left_motor_pwm=9;     //左电机PWM调速

  5. int Right_motor_pwm=10;    // 右电机PWM调速
  6. int Right_motor=11;    // 右电机后退(IN1)  输出0  前进   输出1 后退   
  7. char buffer[18];    //串口缓冲区的字符数组
  8. void setup()      //设定串口和引脚模式
  9. {   
  10.   lcd.init();
  11.     lcd.backlight();
  12.      Serial.begin(115200);
  13.      Serial.flush();    //清空串口缓存
  14.      pinMode(Left_motor,OUTPUT); // PIN 8 8脚无PWM功能
  15.      pinMode(Left_motor_pwm,OUTPUT); // PIN 9 (PWM)
  16.      pinMode(Right_motor_pwm,OUTPUT);// PIN 10 (PWM)
  17.      pinMode(Right_motor,OUTPUT);// PIN 11 (PWM)
  18.      analogWrite(Left_motor_pwm,0);
  19.      analogWrite(Right_motor_pwm,0);
  20. }
  21. void run()     // 前进
  22. {
  23. digitalWrite(Right_motor,LOW);  // 右电机前进
  24.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机前进     
  25.   analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  26.   
  27.   
  28.   digitalWrite(Left_motor,HIGH);  // 左电机前进
  29.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  30.   analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  31. }

  32. void goslow()     // 前进
  33. {
  34. digitalWrite(Right_motor,LOW);  // 右电机前进
  35.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机前进     
  36.   analogWrite(Right_motor_pwm,125);//PWM比例0~255调速,左右轮差异略增减
  37.   
  38.   
  39.   digitalWrite(Left_motor,HIGH);  // 左电机前进
  40.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  41.   analogWrite(Left_motor_pwm,155);//PWM比例0~255调速,左右轮差异略增减
  42. }



  43. void brake()         //刹车,停车
  44. {
  45.   
  46.   digitalWrite(Right_motor_pwm,LOW);  // 右电机PWM 调速输出0      
  47.   analogWrite(Right_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减

  48.   digitalWrite(Left_motor_pwm,LOW);  //左电机PWM 调速输出0         
  49.   analogWrite(Left_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
  50.   //delay(time * 100);//执行时间,可以调整  
  51. }

  52. void left()         //左转(左轮不动,右轮前进)
  53. {
  54.    digitalWrite(Right_motor,LOW);  // 右电机前进
  55.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机前进     
  56.   analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  57.   
  58.   digitalWrite(Left_motor,LOW);  // 左电机后退
  59.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  60.   analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  61. }

  62. /*void spin_left()         //左转(左轮后退,右轮前进)
  63. {
  64.   digitalWrite(Right_motor,LOW);  // 右电机前进
  65.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机前进     
  66.   analogWrite(Right_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
  67.   
  68.   digitalWrite(Left_motor,HIGH);  // 左电机后退
  69.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  70.   analogWrite(Left_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
  71.   //delay(time * 100);  //执行时间,可以调整  
  72. }
  73. */
  74. void right()        //右转(右轮不动,左轮前进)
  75. {
  76.   //小车右转
  77.    digitalWrite(Right_motor,HIGH);  // 右电机后退
  78.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机PWM输出1     
  79.   analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  80.   
  81.   
  82.   digitalWrite(Left_motor,HIGH);  // 左电机前进
  83.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  84.   analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  85. }
  86. /*
  87. void spin_right()        //右转(右轮后退,左轮前进)
  88. {
  89.   digitalWrite(Right_motor,HIGH);  // 右电机后退
  90.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机PWM输出1     
  91.   analogWrite(Right_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
  92.   
  93.   
  94.   digitalWrite(Left_motor,LOW);  // 左电机前进
  95.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  96.   analogWrite(Left_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
  97.   //delay(time * 100);  //执行时间,可以调整   
  98. }
  99. */
  100. void back()          //后退
  101. {
  102. digitalWrite(Right_motor,HIGH);  // 右电机后退
  103.   digitalWrite(Right_motor_pwm,HIGH);  // 右电机前进     
  104.   analogWrite(Right_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  105.   
  106.   
  107.   digitalWrite(Left_motor,LOW);  // 左电机后退
  108.   digitalWrite(Left_motor_pwm,HIGH);  //左电机PWM     
  109.   analogWrite(Left_motor_pwm,255);//PWM比例0~255调速,左右轮差异略增减
  110. }

  111. void loop()
  112. {
  113.   
  114. // lcd.setCursor(0,0);                //设置显示指针
  115. // lcd.print("123456789");     //输出字符到LCD1602上

  116.   
  117.     if(Serial.available() > 0)      //Serial.available()返回串口收到的字节数
  118.     {
  119.        int index = 0;
  120.        delay(100);        //延时等待串口收完数据,否则刚收到1个字节时就会执行后续程序
  121.        int numChar = Serial.available();  
  122.        if(numChar > 17)       //确认数据不会溢出,应当小于缓冲大小
  123.        {
  124.          numChar = 17;
  125.         }
  126.        while(numChar--)
  127.       {
  128.           buffer[index++] = Serial.read();  //将串口数据一字一字的存入缓冲
  129.       }
  130.        splitString(buffer);       //字符串分割
  131.     }
  132. }

  133. void splitString(char *data)
  134. {

  135.   lcd.init();
  136.      //  Serial.print("Data entered:");
  137.    //    Serial.println(data);
  138.        char *parameter;
  139.        parameter = strtok(data, " ,");    //string token,将data按照空格或者,进行分割并截取
  140.      //  Serial.print("***");
  141.    //   Serial.println(parameter);
  142.      lcd.setCursor(0,0);                //设置显示指针
  143.   lcd.print(parameter);     //输出字符到LCD1602上
  144. while(parameter != NULL)
  145. {
  146.     setLED(parameter);
  147.     parameter = strtok(NULL, " ,");   //string token,再次分割并截取,直至截取后的字符为空
  148. //   Serial.print("---");
  149. //   Serial.println(parameter);      
  150. }
  151.    for(int x = 0; x < 18; x++)      //清空缓冲
  152.   {
  153.    buffer[x] = '\0';
  154.   }
  155.      Serial.flush();
  156.   }

  157. void setLED(char *data)
  158. {
  159.    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] == ':')
  160.    && (data[12] == '1')&& (data[13] == '1'))
  161.    {
  162.    // Serial.println("go forward!");
  163.       run();
  164.   }
  165.   
  166.    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] == ':')
  167.    && (data[12] == '1')&& (data[13] == '2'))
  168.    {
  169.    // Serial.println("go back!");
  170.       back();
  171. }
  172.    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] == ':')
  173.    && (data[12] == '1')&& (data[13] == '3'))
  174.    {
  175.     //  Serial.println("go left!");
  176.       left();
  177.   }
  178.      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] == ':')
  179.      && (data[12] == '1')&& (data[13] == '4'))
  180.    {
  181.    //  Serial.println("go right!");
  182.       right();
  183.   }
  184.    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] == ':')
  185.    && (data[12] == '1')&& (data[13] == '5'))
  186.    {
  187.    //   Serial.println("Stop!");
  188.       brake();
  189.   }
  190.      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] == ':')
  191.      && (data[12] == '1')&& (data[13] == '6'))
  192.    {
  193.    //   Serial.println("goslow!");
  194.       goslow();
  195.   }
  196. /*  else
  197.    {
  198.     Serial.println("Stop!");
  199.      brake();  
  200.    }
  201. */
  202. }
复制代码

作者: 张德帅    时间: 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