# 避障机器人--前言

之前的教程,我们都是通过控制端口来完成任务,目的是为了更好地理解控制器的运作。我们接下来要使用库来完成,将重心从关注硬件转移到关心程序逻辑上。通俗理解库就是指令的集合,将很常用的一些指令打包起来。不关心怎么实现,只需要知道怎么用就可以了。在之前的Arduino IDE安装指南中,我们已经将机器人要用到的库安装到arduino IDE里面了。oseppBlock IDE自带了要用到的库。


# 避障机器人1--前进和停止

在教程开始前,我们先说一个有趣的游戏。你和你的小伙伴在房间里捉迷藏,要用毛巾蒙住眼睛。
轮到你负责抓人了,于是你蒙上眼睛,数1…2…3…
游戏开始,你把手伸出来,摸索着向前面走,你的手碰到了墙壁…你停下来犹豫了一下……

# 情景分析

  1. 这节课使用超声波当作机器人的"双手",让机器人在房间里捉迷藏,碰到前面有障碍物时停下来,我们可以假设当距离小于350毫米时,机器人"碰到"了东西。
  2. 机器人由两个轮子提供动力,每个轮子都可以向前或者向后转动,就有4种组合:两个都向前,两个都向后,左边向前右边向后,和左边向后右边向前。对应前进,后退,原地右转,原地左转四种行动。
  3. 之前的程序都是从头到尾一条一条执行的,我们现在要学习一个语句if,它可以让指令有条件地执行,如果不满足条件是不会执行的。if语句的格式是if(条件){指令},当条件满足时,才会执行"{ }"花括号里面的指令。对应积木
  4. 在Arduino IDE中,通过使用库我们能很方便地操作机器人。记得要在程序的开头引入库。
  5. OseppRangeFinder U(2)定义一个超声波模块“U”,接在2号端口。对应积木
  6. 使用U.ping()就可以启动测量并得到距离,单位是毫米。对应积木 ,需要先放置定义超声波模块的积木,它才会出现。
  7. OseppTBMotor L(12,11,HIGH)定义一个马达“L”接在12,11号端口。代表安装在机器人左边的马达,相当于机器人的“左腿”。12号端口高电平时向前转,如果实际情况是相反的,只需要把把HIGH换成LOW就可以了。OseppTBMotor R(8,3,LOW),定义机器人“右腿”--“R”接在8,3号端口,8号端口低电平时向前转,同样如果情况相反,把LOW换成HIGH。对应积木
  8. L.forward(200),设置马达L前进,速度是200。L.backward(200)设置马达后退,速度是200。另外,速度设置成0马达就会停止。把“L”替换成“R”来设置右边轮子。对应积木 ,需要先放置定义马达的积木,它才会出现。

# 流程解析

  1. 在Arduino IDE的程序开头要先通过#include <oseppRobot.h>来引入机器人库代码。
  2. 然后用OseppRangeFinder U(2)OseppTBMotor L(12,11,HIGH)OseppTBMotor R(8,3,LOW)来定义超声波模块和两个马达模块。
  3. 开机运行setup函数中,将两个马达的速度都用X.forward(200)设置为前进。机器人向正前方移动。
  4. 使用超声波测量指令U.ping()可以测量当前的障碍物距离。使用if (U.ping() < 350)来判断当前的障碍物是否小于350毫米了。
  5. 如果if语句的条件满足了。将执行X.forward(0)指令来将两个马达速度都设置为0,机器人停止移动。
  6. 等待一会后,重复执行步骤4,5。
uml diagram

# 参考程序

  • oseppBlock IDE程序

  • Arduino IDE程序
#include <oseppRobot.h>  //引入机器人库

OseppRangeFinder U(2);         //超声波模块接到2号端口
OseppTBMotor L(12, 11, LOW);  //左边轮子,如果方向不对,要把LOW换成HIGH
OseppTBMotor R(8, 3, HIGH);     //右边轮子,如果方向不对,要把HIGH换成LOW

void setup() {
    L.forward(200);  //左边轮子,前进,速度200
    R.forward(200);  //右边轮子,前进,速度200
}

void loop() {
    if (U.ping() < 350) {  //如果超声波检测到距离小于350mm
        L.forward(0);      //左边轮子停止
        R.forward(0);      //右边轮子停止
    }
    delay(25);  //暂停25毫秒
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 运行结果

请注意马达将会转动。
接通电源,上传程序后,打开电池开关。机器人的两个轮子都向前转动,注意不要有东西阻挡超声波传感器。用手阻挡超声波传感器,马达会立刻停止转动。
如果发现轮子转的方向不对,参照程序注释,把方向调整正确。
拔掉USB线,将机器人放到地板上,打开电源,机器人向前移动,当靠近障碍物时停止。

# 课程解读

  1. 库的使用:首次使用需要在Arduino IDE中安装库,之后在程序的开头include <库名称.h>来引入。oseppBlock IDE会自动引入需要的库。

  2. 前面提到,超声波两次测量之间需要间隔一段时间。使用库时,库中的代码已经考虑了这个问题。在25毫秒内多次调用测量,将不会启动新的测量过程,而是直接返回上一次的结果。

  3. 当if语句只有一条指令时,可以省略“{}”花括号,例如:if (U.ping() < 350)Serial.println("stop");

  4. 判断表达式可以用的符号有:

    • a > b : a 大于 b
    • a >= b : a 大于或者等于 b
    • a < b : a 小于 b
    • a <= b : a 小于或者等于 b
    • a == b : a , b 相等
    • a != b : a , b 不相等

# oseppBlock操作视频

# ArduinoIDE操作视频

oseppRobot库https://cn.osepp.com/download/oseppRobot.zip