MicroBit智能语音交互小车-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7375|回复: 1

[项目] MicroBit智能语音交互小车

[复制链接]
发表于 2019-3-20 18:06 | 显示全部楼层 |阅读模式
本帖最后由 悠然南山 于 2019-5-2 10:57 编辑

【项目简介
      本项目基于MicroBit 及 MXPVT--VBS7100
智能语音模块制作一款智能语音交互小车,通过语音命令可以控制小车的运动,并且小车还能模仿人声进行简单交互。另外,进入AI模式小车的功能就更多了,做算术、听儿歌、讲故事、报天气等,瞬间变身为一个儿童故事机。通过引入语音交互控制,使小朋友在学习MircoBit的过程中能获得更多的兴趣。

系统组成
system.png


硬件材料
1. Micro:bit开发板                                 1 个
2. MXPVT-VBS7100语音模块                 1 个
3. L298N电机驱动模块                           1 个
4. 超声波模块                                         1 个
5. 180度舵机                                          1 个
6. 直流减速电机                                     2 个
7. 两驱小车车架                                     1 辆
8. 小喇叭                                                1 个
9. 麦克风                                                1 个
10. 电源
8. 杜邦线                                                若干

【实物装配


IMG_20190318_152251.jpg
由深圳小喵科技提供的Microbit、IObit套件。Microbit的板子仅有半张身份证大小,出乎想象的小巧,做工却是非常精致的。

IMG_20190318_152404.jpg
MXPVT-VBS7100语音模块,这是由MXCHIP出品的智能语音模块。使用串口即可控制。

IMG_20190322_175242.jpg
超声波模块和舵机。

IMG_20190318_152031.jpg
小车车架。

IMG_20190322_173129.jpg
将Microbit和MXPVT-VBS7100安装完毕。

IMG_20190322_173012.jpg
俯视图

IMG_20190322_173216.jpg
L298N电机驱动模块和小喇叭安装在车架底部。

IMG_20190430_222901.jpg
终于装配完成了。

Microbit0.jpg
编写软件可以使用深圳小喵科技出品的离线版makecode、KittenBlock,后者基于Scratch 3.0,支持喵家的众多硬件产品,还支持使用Python语言编程。

Microbit_7.jpg
超声波距离探测。

Microbit_8.jpg
控制舵机转向15°、90°、165°角,以实现超声波探测器对小车左前方、正前方、右前方障碍物的探测。

Microbit_9.jpg
左右车轮直流电机控制。P12、P13为L298N电机使能控制,P14、P15为左侧车轮电机脚,P16、P19为右侧车轮电机控制脚。相关控制电平如下:
l298n.png

Microbit_10.jpg
根据超声波探测器到不同方位的障碍物时返回的数值,采取相应的避让措施。如:1表示左前方有障碍物、2表示正前方、4表示右前方。

Microbit_11.jpg
串口初始化及ASR数据初始化,以便实现语音指令识别。

Microbit_12.jpg
通过串口接受语音模块返回的event指令代号,对小车执行相应的运动控制。

源代码:
[mw_shl_code=javascript,true]let Obstacle = 0
let distance = 0
function LeftRear2() {
    pins.digitalWritePin(DigitalPin.P12, 1)
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P19, 1)
    pins.digitalWritePin(DigitalPin.P16, 0)
    pins.digitalWritePin(DigitalPin.P15, 0)
    pins.digitalWritePin(DigitalPin.P14, 1)
}
function DriveLeft2() {
    pins.digitalWritePin(DigitalPin.P12, 1)
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P19, 0)
    pins.digitalWritePin(DigitalPin.P16, 1)
    pins.digitalWritePin(DigitalPin.P15, 1)
    pins.digitalWritePin(DigitalPin.P14, 0)
}
function GetDistance() {
    led.enable(false)
    distance = sonar.ping(
    DigitalPin.P11,
    DigitalPin.P5,
    PingUnit.Centimeters
    )
    led.enable(true)
}
function ObstacleDetect2() {
    Obstacle = 0
    servos.P2.setAngle(15)
    basic.pause(500)
    GetDistance()
    if (distance < 20) {
        Obstacle = Obstacle + 1
    }
    servos.P2.setAngle(90)
    basic.pause(500)
    GetDistance()
    if (distance < 20) {
        Obstacle = Obstacle + 2
    }
    servos.P2.setAngle(165)
    basic.pause(500)
    GetDistance()
    if (distance < 20) {
        Obstacle = Obstacle + 4
    }
    if (Obstacle >= 8) {
        Obstacle = 0
    }
}
function RightRear2() {
    pins.digitalWritePin(DigitalPin.P12, 1)
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P19, 0)
    pins.digitalWritePin(DigitalPin.P16, 1)
    pins.digitalWritePin(DigitalPin.P15, 1)
    pins.digitalWritePin(DigitalPin.P14, 0)
}
function DriveRight2() {
    pins.digitalWritePin(DigitalPin.P12, 1)
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P19, 1)
    pins.digitalWritePin(DigitalPin.P16, 0)
    pins.digitalWritePin(DigitalPin.P15, 0)
    pins.digitalWritePin(DigitalPin.P14, 1)
}
function Rear2() {
    pins.digitalWritePin(DigitalPin.P12, 1)
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P19, 1)
    pins.digitalWritePin(DigitalPin.P16, 0)
    pins.digitalWritePin(DigitalPin.P15, 1)
    pins.digitalWritePin(DigitalPin.P14, 0)
}
function DriveAhead2() {
    pins.digitalWritePin(DigitalPin.P12, 1)
    pins.digitalWritePin(DigitalPin.P13, 1)
    pins.digitalWritePin(DigitalPin.P19, 0)
    pins.digitalWritePin(DigitalPin.P16, 1)
    pins.digitalWritePin(DigitalPin.P15, 0)
    pins.digitalWritePin(DigitalPin.P14, 1)
}
distance = 0
basic.forever(function () {
    ObstacleDetect2()
    basic.showNumber(Obstacle)
    if (Obstacle == 0) {
        DriveAhead2()
    } else if (Obstacle == 1) {
        DriveLeft2()
    } else if (Obstacle == 2) {
        Rear2()
    } else if (Obstacle == 3) {
        DriveLeft2()
    } else if (Obstacle == 4) {
        DriveRight2()
    } else if (Obstacle == 5) {
        DriveAhead2()
    } else if (Obstacle == 6) {
        DriveRight2()
    } else if (Obstacle == 7) {
        Rear2()
        basic.pause(200)
        DriveLeft2()
    }
    basic.pause(100)
})

let Cmd = 0
let String1 = ""
serial.onDataReceived(serial.delimiters(Delimiters.NewLine), function () {
    String1 = serial.readUntil(serial.delimiters(Delimiters.NewLine))
    basic.showString(String1)
    Cmd = parseFloat(String1.substr(10, 1))
    basic.showString("" + Cmd)
    if (Cmd == 1) {
        DriveAhead2()
    } else if (Cmd == 2) {
        DriveLeft2()
    } else if (Cmd == 3) {
        DriveRight2()
    } else {
        Rear2()
    }
})
serial.redirect(
SerialPin.P0,
SerialPin.P8,
BaudRate.BaudRate115200
)
basic.pause(500)
serial.writeLine("AT+ASRADD=qian jin,1")
basic.pause(100)
serial.writeLine("AT+ASRADD=zuo zhuan,2")
basic.pause(100)
serial.writeLine("AT+ASRADD=you zhan,3")
basic.pause(100)
serial.writeLine("AT+ASRADD=hou tui,4")
basic.forever(function () {
        
})
[/mw_shl_code]

很不幸在视频中小车一侧的电机出现了故障。另外,由于小车行进时电机和舵机的噪声干扰,麦克风对语音拾取是很大的问题。




发表于 2020-4-21 14:26 | 显示全部楼层
请问最后您的智能车子调好了吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 01:30 , Processed in 0.242407 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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