最近发现这几个小 Demo 还有人在下载,因此重新看了之前传的代码,发现各种注释和格式的不规范,不禁汗颜…… 想到下载这个项目的应该都是些初学者,为了不引人『误入歧途』,决定抽空把代码都规范一下。 需要注意的是,这几个项目的教学目标受众是只有微弱 C 基础的人。实际项目中,注释不应是代码的翻译。 希望大家学得开心!
通过调用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)
{
// 如果前方距离大于25cm,继续向前走。
forward();
}
else
{
// 如果前方距离小于25cm,停车,测量右方距离。
brake();
rightDistance = controlServoAndGetDistance(RIGHT);
if (rightDistance >= 25)
{
// 如果右方距离大于25cm,向右转。
turn(RIGHT);
}
else
{
// 如果右方距离小于25cm,向左转。
turn(LEFT);
}
}
}
经过验证,该控制逻辑符合要求,能适应一般的赛道。
迷宫小车程序的主要精华在于控制逻辑,这个简单的实例,仅作为抛砖引玉。希望可以激发你的想象,思考出更加完善的控制逻辑。
工程已经上传到项目中,可以打包下载,其中有更详细的注释。