# 避障机器人3--转个弯
犹豫过后,你转个身,继续向前面摸索……
# 情景分析
- 上一节机器人减速前进到离障碍物350毫米的地方停下来了,需要我们帮助它才会继续走,现在它要学会自己处理。
- 还要修复一个bug,将见到if语句的第三种形式:
if(条件1){条件1的指令}else if(条件2){条件2的指令}else{都不符合条件时的指令}
。我们增加第二个条件,只有在350到700毫米时,才进行减速。对应的积木,通过连续点击可以把if积木变成它。
# 流程解析
- 在上一节的程序里,将if语句改成
if(){}else if(){} else{}
格式。每次程序从头到尾执行,都有3种情况。 - 在if(障碍物距离小于350毫米)语句的条件成立时,将执行if(){}花括号内的指令,上一节机器人停止移动。我们现在将它改为转弯。其中一个马达前进,另外一个后退,机器人就会转弯。
- 为了修复关于map函数bug,我们需要给减速代码添加条件,else if(障碍物距离小于等于700毫米),将会执行
else if(){}
花括号中的指令。将map函数放置在这里,来让机器人减速。 - 否则距离就是大于700,执行
else{}
花括号中的指令。以合适的速度前进。 - 暂停一小会,重复步骤2到步骤4。
# 参考程序
- osepp Block IDE程序
- Arduino IDE程序
#include <oseppRobot.h>
OseppRangeFinder U(2);
OseppTBMotor L(12, 11, HIGH); //左边轮子,如果方向不对,要把HIGH换成LOW
OseppTBMotor R(8, 3, LOW); //右边轮子,如果方向不对,要把LOW换成HIGH
void setup() {}
void loop() {
if (U.ping() < 350) {
L.forward(200); //左边轮子用200速度前进
R.backward(200); //右边轮子用200速度后退,机器人会向哪边转身?
} else if (U.ping() <= 700) {
//不小于350,并且小于700
L.forward(map(U.ping(), 350, 700, 80, 200));
R.forward(map(U.ping(), 350, 700, 80, 200));
} else {
//距离大于700时,用200速度前进
L.forward(200);
R.forward(200);
}
delay(25);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 运行结果
接通电源,上传程序后,拔掉USB线。打开电池开关,将机器人放到地上。机器人向前移动,接近障碍物时开始减速,“碰到”障碍物自动转弯。
# 课程解读
- 每次使用函数时,都要考虑给它的要求,如果不注意,可能会得到意外结果。
- if-else_if结构中,如果前面的条件成立了,就不会再检查后面的条件了。
else if
,else
都不会执行,也不会计算条件。比如距离小于350时,else if中的U.ping()
是不会执行的。 - if-else_if结构中,要注意顺序,例如程序
if(距离小于700){}else if(距离小于350){这里的指令永远都不会得到执行}
,小于350的数字,必然小于700,else if成立,if也肯定成立,所以只会执行if中的代码。 - 你能不能加入一些代码,在转弯时把控制器自带的LED点亮,其他时候让LED熄灭?