# 避障机器人7--超时
时间一点一点过去……
你忽然意识到,你只在房间的中间转圈圈。还没有去过沙发后面。
于是你向着沙发后面摸索,终于把无路可逃的小伙伴们全部抓住了!
# 情景分析
- 现在的情况是,机器人遇到障碍物,选择了一个方向转身,比如向右转。不巧,因为特殊的障碍,机器人实际上转动不了,然后呢,就没有然后了。它一直在盼望奇迹出现……
- 函数
millis()
可以获得通电到现在过了多少时间,机器人在转弯前看一下时间并记下来,转弯过程中检查时间,如果花了太长时间就考虑换一个方向。 - 这节课程我们将使用到变量。变量用于保存数据,使用时通过变量名来获取数据。有点像函数,不过变量保存的是数据,并且是可以改变的。
- 使用变量之前,需要先定义它。定义的方法是
unsigned long begin=0
,定义了一个“无符号长整型”变量,暂时不解释,只需要知道:定义变量begin,用来保存转弯前的时间。定义变量的积木 - 在进入转弯之前,通过
millis
函数看一眼时间,存到变量里面。方法是begin=millis()
。存到变量对应的积木,需要先放置定义变量积木,它才会出现 - 在转弯过程中,检查时间过了多久,需要用现在的时间减去开始的时间,得到所用的时间:
millis()-begin
。使用变量积木,需要先放置定义变量积木,才会出现。加减乘除等运算,可通过点击中间的箭头来展开列表,选择来切换。 - 如果时间太长了,就从循环里面跳出来。跳出来的方法是使用
break
指令,它只能用在循环中。对应积木
# 流程解析
- 在程序开始处定义变量
unsigned long begin=0
。 - 上一节的程序
if(距离小于350毫米){后退;随机转弯;等待}……
- 在后退前插入设置变量
begin=millis();
。记录转弯开始的时间(后退时间也算在内)。 - 修改等待过程,
while(距离比350只多了一点点){}
,花括号内添加超时判断。 - 超时判断:
if(millis()-begin>3000){break;}
,如果等待时间超过3000毫秒(3秒钟)则跳出while(距离比350只多一点点)
循环。
# 参考程序
- oseppBlock IDE程序
- Arduino IDE程序
#include <oseppRobot.h>
OseppRangeFinder U(2);
OseppTBMotor L(12, 11, HIGH); //左边轮子,如果方向不对,要把HIGH换成LOW
OseppTBMotor R(8, 3, LOW); //右边轮子,如果方向不对,要把LOW换成HIGH
unsigned long begin = 0; //定义变量
void setup() {}
void loop() {
if (U.ping() < 350) {
begin = millis(); //记录下转弯开始的时间
while (U.ping() < 100) {
L.backward(150);
R.backward(150);
if (millis() - begin > 1000) {
break;//距离开始时间超过1秒,跳出循环.
}
}
if (random(0, 2)) {
L.forward(200);
R.backward(200);
} else {
L.backward(200);
R.forward(200);
}
while (U.ping() < 400) {
if (millis() - begin > 3000) {
break; //距离开始时间超过3秒,跳出循环.
}
}
} else if (U.ping() <= 700) {
L.forward(map(U.ping(), 350, 700, 80, 200));
R.forward(map(U.ping(), 350, 700, 80, 200));
} else {
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 课程解读
break
可以跳出循环,继续执行后面的指令,注意如果在循环中套着另一个循环,break
只会跳出最近的一层。
# 拓展知识
- 计算机程序几乎离不开变量,它对于编程的初学者也是较难掌握的部分,尤其在C语言中。在后面还会见到其他的变量类型,再一起介绍。
# 避障机器人总结
避障机器人课程主要知识点是程序的结构和常用函数的使用。你的机器人碰到难题时,把自己想象成机器人,在有限条件下,就像标题下面的小故事那样。思考问题该怎么解决,然后编写程序把你的经验告诉机器人。
如果你使用Arduino IDE,数数看我们的代码有多少行?我们填进去的有用的代码只有20行左右,已经涵盖了全部课程里的想法。学习机器人,想法比写代码更重要一些。
# 避障机器人系列教程中提到的知识点
- 机器人的前进,停止,左转,右转。
- 使用oseppRobot库中的超声波模块和马达模块。
- 程序的顺序执行,分叉执行if语句,循环执行while语句和break语句。
- 判断表达式符号:
>
(大于),>=
(大于或者等于),<
(小于),<=
(小于或者等于),==
(相等),!=
(不相等)。 - Arduino内置的函数
millis
,map
,random
。 - 变量的声明,赋值,使用。