请选择 进入手机版 | 继续访问电脑版
查看: 625|回复: 5

MXPVT-VBS7100在Arduino小车上的应用

[复制链接]

3

主题

9

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2018-9-18 16:05:35 | 显示全部楼层 |阅读模式
本帖最后由 幸运星 于 2018-9-18 16:28 编辑

    小车基于庆科MXPVT-VBS7100语音模块。通过语音模块识别人声,模块通过云端识别语音指令给ARDUINO发送一个返回值,MCU通过判断返回值执行不同的程序,从而达到使用语音对小车的控制。本产品开发起来相对简单容易,入门快。
关键字: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'))
(只需更改括号内相对内容即可)

5、语音模块与MCU连接:
语音模块arduino
TXDRXD
RXDTXD
GNDGND
小车资料源代码:
贴上资料链接:https://pan.baidu.com/s/1XfecwylHKkQnAUnEGNsRTw 密码:io5p






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

3

主题

9

帖子

68

积分

注册会员

Rank: 2

积分
68
 楼主| 发表于 2018-9-18 16:05:36 | 显示全部楼层
以下是源代码:

#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();  
   }
*/
}
回复

使用道具 举报

3

主题

10

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2018-9-19 13:21:19 | 显示全部楼层
学习,这个就厉害了o( ̄▽ ̄)d
阳光下像个孩子,风雨里像个大人。
回复

使用道具 举报

0

主题

16

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2018-9-21 15:56:57 | 显示全部楼层
模块能对声音进行预处理么,比如去背景噪音?
回复

使用道具 举报

4

主题

31

帖子

328

积分

中级会员

Rank: 3Rank: 3

积分
328
发表于 2018-9-22 08:46:37 | 显示全部楼层
不错哦!
回复

使用道具 举报

0

主题

16

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2018-9-28 15:51:52 | 显示全部楼层
学习一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表