# 避障机器人7--超时

时间一点一点过去……
你忽然意识到,你只在房间的中间转圈圈。还没有去过沙发后面。
于是你向着沙发后面摸索,终于把无路可逃的小伙伴们全部抓住了!

# 情景分析

  1. 现在的情况是,机器人遇到障碍物,选择了一个方向转身,比如向右转。不巧,因为特殊的障碍,机器人实际上转动不了,然后呢,就没有然后了。它一直在盼望奇迹出现……
  2. 函数millis()可以获得通电到现在过了多少时间,机器人在转弯前看一下时间并记下来,转弯过程中检查时间,如果花了太长时间就考虑换一个方向。
  3. 这节课程我们将使用到变量。变量用于保存数据,使用时通过变量名来获取数据。有点像函数,不过变量保存的是数据,并且是可以改变的。
  4. 使用变量之前,需要先定义它。定义的方法是unsigned long begin=0,定义了一个“无符号长整型”变量,暂时不解释,只需要知道:定义变量begin,用来保存转弯前的时间。定义变量的积木
  5. 在进入转弯之前,通过millis函数看一眼时间,存到变量里面。方法是begin=millis()。存到变量对应的积木 ,需要先放置定义变量积木,它才会出现
  6. 在转弯过程中,检查时间过了多久,需要用现在的时间减去开始的时间,得到所用的时间:millis()-begin。使用变量积木 ,需要先放置定义变量积木, 才会出现。加减乘除等运算,可通过点击 中间的箭头来展开列表,选择来切换。
  7. 如果时间太长了,就从循环里面跳出来。跳出来的方法是使用break指令,它只能用在循环中。对应积木

# 流程解析

  1. 在程序开始处定义变量unsigned long begin=0
  2. 上一节的程序if(距离小于350毫米){后退;随机转弯;等待}……
  3. 在后退前插入设置变量begin=millis();。记录转弯开始的时间(后退时间也算在内)。
  4. 修改等待过程,while(距离比350只多了一点点){},花括号内添加超时判断。
  5. 超时判断:if(millis()-begin>3000){break;},如果等待时间超过3000毫秒(3秒钟)则跳出while(距离比350只多一点点)循环。
uml diagram

# 参考程序

  • 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

# 课程解读

  1. break可以跳出循环,继续执行后面的指令,注意如果在循环中套着另一个循环,break只会跳出最近的一层。

# 拓展知识

  1. 计算机程序几乎离不开变量,它对于编程的初学者也是较难掌握的部分,尤其在C语言中。在后面还会见到其他的变量类型,再一起介绍。

# 避障机器人总结

避障机器人课程主要知识点是程序的结构和常用函数的使用。你的机器人碰到难题时,把自己想象成机器人,在有限条件下,就像标题下面的小故事那样。思考问题该怎么解决,然后编写程序把你的经验告诉机器人。
如果你使用Arduino IDE,数数看我们的代码有多少行?我们填进去的有用的代码只有20行左右,已经涵盖了全部课程里的想法。学习机器人,想法比写代码更重要一些。

# 避障机器人系列教程中提到的知识点

  1. 机器人的前进,停止,左转,右转。
  2. 使用oseppRobot库中的超声波模块和马达模块。
  3. 程序的顺序执行,分叉执行if语句,循环执行while语句和break语句。
  4. 判断表达式符号:>(大于),>=(大于或者等于),<(小于),<=(小于或者等于),==(相等),!=(不相等)。
  5. Arduino内置的函数millismaprandom
  6. 变量的声明,赋值,使用。

# oseppBlock操作视频

# ArduinoIDE操作视频