# 避障机器人--前言
之前的教程,我们都是通过控制端口来完成任务,目的是为了更好地理解控制器的运作。我们接下来要使用库来完成,将重心从关注硬件转移到关心程序逻辑上。通俗理解库就是指令的集合,将很常用的一些指令打包起来。不关心怎么实现,只需要知道怎么用就可以了。在之前的Arduino IDE安装指南中,我们已经将机器人要用到的库安装到arduino IDE里面了。oseppBlock IDE自带了要用到的库。
# 避障机器人1--前进和停止
在教程开始前,我们先说一个有趣的游戏。你和你的小伙伴在房间里捉迷藏,要用毛巾蒙住眼睛。
轮到你负责抓人了,于是你蒙上眼睛,数1…2…3…
游戏开始,你把手伸出来,摸索着向前面走,你的手碰到了墙壁…你停下来犹豫了一下……
# 情景分析
- 这节课使用超声波当作机器人的"双手",让机器人在房间里捉迷藏,碰到前面有障碍物时停下来,我们可以假设当距离小于350毫米时,机器人"碰到"了东西。
- 机器人由两个轮子提供动力,每个轮子都可以向前或者向后转动,就有4种组合:两个都向前,两个都向后,左边向前右边向后,和左边向后右边向前。对应前进,后退,原地右转,原地左转四种行动。
- 之前的程序都是从头到尾一条一条执行的,我们现在要学习一个语句
if
,它可以让指令有条件地执行,如果不满足条件是不会执行的。if语句的格式是if(条件){指令}
,当条件满足时,才会执行"{ }"花括号里面的指令。对应积木 - 在Arduino IDE中,通过使用库我们能很方便地操作机器人。记得要在程序的开头引入库。
OseppRangeFinder U(2)
定义一个超声波模块“U”,接在2号端口。对应积木- 使用
U.ping()
就可以启动测量并得到距离,单位是毫米。对应积木,需要先放置定义超声波模块的积木,它才会出现。 OseppTBMotor L(12,11,HIGH)
定义一个马达“L”接在12,11号端口。代表安装在机器人左边的马达,相当于机器人的“左腿”。12号端口高电平时向前转,如果实际情况是相反的,只需要把把HIGH
换成LOW
就可以了。OseppTBMotor R(8,3,LOW)
,定义机器人“右腿”--“R”接在8,3号端口,8号端口低电平时向前转,同样如果情况相反,把LOW
换成HIGH
。对应积木L.forward(200)
,设置马达L前进,速度是200。L.backward(200)
设置马达后退,速度是200。另外,速度设置成0马达就会停止。把“L”替换成“R”来设置右边轮子。对应积木,需要先放置定义马达的积木,它才会出现。
# 流程解析
- 在Arduino IDE的程序开头要先通过
#include <oseppRobot.h>
来引入机器人库代码。 - 然后用
OseppRangeFinder U(2)
,OseppTBMotor L(12,11,HIGH)
,OseppTBMotor R(8,3,LOW)
来定义超声波模块和两个马达模块。 - 开机运行setup函数中,将两个马达的速度都用X
.forward(200)
设置为前进。机器人向正前方移动。 - 使用超声波测量指令
U.ping()
可以测量当前的障碍物距离。使用if (U.ping() < 350)
来判断当前的障碍物是否小于350毫米了。 - 如果if语句的条件满足了。将执行X
.forward(0)
指令来将两个马达速度都设置为0,机器人停止移动。 - 等待一会后,重复执行步骤4,5。
# 参考程序
- 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毫秒
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 运行结果
请注意马达将会转动。
接通电源,上传程序后,打开电池开关。机器人的两个轮子都向前转动,注意不要有东西阻挡超声波传感器。用手阻挡超声波传感器,马达会立刻停止转动。
如果发现轮子转的方向不对,参照程序注释,把方向调整正确。
拔掉USB线,将机器人放到地板上,打开电源,机器人向前移动,当靠近障碍物时停止。
# 课程解读
库的使用:首次使用需要在Arduino IDE中安装库,之后在程序的开头
include <库名称.h>
来引入。oseppBlock IDE会自动引入需要的库。前面提到,超声波两次测量之间需要间隔一段时间。使用库时,库中的代码已经考虑了这个问题。在25毫秒内多次调用测量,将不会启动新的测量过程,而是直接返回上一次的结果。
当if语句只有一条指令时,可以省略“{}”花括号,例如:
if (U.ping() < 350)Serial.println("stop");
判断表达式可以用的符号有:
a > b
: a 大于 ba >= b
: a 大于或者等于 ba < b
: a 小于 ba <= b
: a 小于或者等于 ba == b
: a , b 相等a != b
: a , b 不相等
# oseppBlock操作视频
# ArduinoIDE操作视频
oseppRobot库https://cn.osepp.com/download/oseppRobot.zip