本帖最后由 悠然南山 于 2019-5-2 10:57 编辑
【项目简介】
本项目基于MicroBit 及 MXPVT--VBS7100 智能语音模块制作一款智能语音交互小车,通过语音命令可以控制小车的运动,并且小车还能模仿人声进行简单交互。另外,进入AI模式小车的功能就更多了,做算术、听儿歌、讲故事、报天气等,瞬间变身为一个儿童故事机。通过引入语音交互控制,使小朋友在学习MircoBit的过程中能获得更多的兴趣。
【系统组成】
【硬件材料】
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. 杜邦线 若干
【实物装配】
由深圳小喵科技提供的Microbit、IObit套件。Microbit的板子仅有半张身份证大小,出乎想象的小巧,做工却是非常精致的。
MXPVT-VBS7100语音模块,这是由MXCHIP出品的智能语音模块。使用串口即可控制。
超声波模块和舵机。
小车车架。
将Microbit和MXPVT-VBS7100安装完毕。
俯视图
L298N电机驱动模块和小喇叭安装在车架底部。
终于装配完成了。
编写软件可以使用深圳小喵科技出品的离线版makecode、KittenBlock,后者基于Scratch 3.0,支持喵家的众多硬件产品,还支持使用Python语言编程。
超声波距离探测。
控制舵机转向15°、90°、165°角,以实现超声波探测器对小车左前方、正前方、右前方障碍物的探测。
左右车轮直流电机控制。P12、P13为L298N电机使能控制,P14、P15为左侧车轮电机脚,P16、P19为右侧车轮电机控制脚。相关控制电平如下:
根据超声波探测器到不同方位的障碍物时返回的数值,采取相应的避让措施。如:1表示左前方有障碍物、2表示正前方、4表示右前方。
串口初始化及ASR数据初始化,以便实现语音指令识别。
通过串口接受语音模块返回的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]
很不幸在视频中小车一侧的电机出现了故障。另外,由于小车行进时电机和舵机的噪声干扰,麦克风对语音拾取是很大的问题。
|