通过调用Arduino舵机以及SR04库,控制舵机带动超声波转向,测量不同方向的距离,从而规划走迷宫路径,进行壁障。
需要注意:与之前的单文件工程不同,此工程采用了多个文件的方式开发,这样增强了代码的可读性。 该项目的文件结构如下:
- ..\servoUltraSonic.ino
- ..\common.ino
- ..\setting.h
下载后,打开
..\servoUltraSonic.ino
文件即可打开工程。
电机左A | 电机左B | 电机右A | 电机右B | ECHO | TRIG | 舵机信号 |
---|---|---|---|---|---|---|
D6 | D11 | D5 | D3 | D7 | D4 | D9 |
将问题简化,是编程中应有的思维方式。
首先应默认小车在赛道中的行驶方式为直线行驶,直角转弯。这样,在宽度一定的赛道上,只测量车体右侧(或左侧)的距离就可以得到车体的位置信息。 因此我们只需获得车体前方距离,以及右侧(或左侧)的距离,就可以对车的运行状态做出规划,实现走迷宫的功能。 针对这两个距离,我们可以设置一个阈值,列出表格。 经过思考,我们可以针对几种简单的情况做出如下决策:
前方小于25cm | 右方小于25cm | 决策 |
---|---|---|
否 | 否 | 直走 |
否 | 是 | 直走 |
是 | 否 | 右转 |
是 | 是 | 左转 |
总结情况,并转换为Arduino程序语言,可以写为:
void loop() {
long forwardDistance = 0;
long rightDistance = 0;
//声明两个长整形变量,用于存储前方、右方的测距结果。
forwardDistance = controlServoAndGetDistance(FORWARD);
//调用函数测量前方距离
if(forwardDistance >= 25){
forward();
//如果前方距离大于25cm,继续向前走。
}else{
brake();
rightDistance = controlServoAndGetDistance(RIGHT);
//如果前方距离小于25cm,停车,测量右方距离。
if(rightDistance >= 25){
turn(RIGHT);
//如果右方距离大于25cm,向右转。
}else{
turn(LEFT);
//如果右方距离小于25cm,向左转。
}
}
}
经过验证,该控制逻辑符合要求,能适应一般的赛道。
迷宫小车程序的主要精华在于控制逻辑,这个简单的实例,仅作为抛砖引玉。希望可以激发你的想象,思考出更加完善的控制逻辑。
工程已经上传到项目中,可以打包下载,其中有更详细的注释。