![]() |
机器人直线行走的编程-接口、传感器的读数、地面的灰度阈值 |
||
| 2026/3/9 14:28:13 | 4876 |
|
将两个巡线传感器分开一 点距离(大于线的宽度)安装在机器人的底盘 上,开始巡线的时候令黑线正好从两个巡线传 感器之间穿过,如图8-1所示。这样,如果两 个传感器检测到都在白色的地板上方,就说明 机器人在线的上方,可以让机器人一直往前 走;如果右边的传感器检测到了黑线,就往右 转;如果左边的传感器检测到了黑线就往左 转。若用原来的方法,即使机器人遇到一根直线,也要走“之”字形前进,而如果采用刚刚 设计的方案,机器人在巡直线的时候就完全可以笔直前进了,这样它就可以比“之”字形巡 线法跑得更快了。
当使用两个传感器时,在巡直线时机器人可以一直前进而不用拐弯,这样比走“之”字形的 轨迹就要平滑得多了。怎样让它走得更加平滑呢?很自然地,同学们就会想到,能不能再 增加更多的传感器数量呢?没错,这是一种很常用的办法。 如果有4个巡线传感器,就可以这么做:假设把4个传感器从右到左分别叫做1号、 2号、3号、4号。如果1号检测到了黑线,说明机器人行进的方向和黑线之间的角度已经 很大了,应该马上向右大幅转动;否则,如果2号检测到了黑线,则说明机器人的行进方向 和黑线之间有角度但还不是很大,只需要向右“温柔”地转弯就可以了。对于3号、4号传 感器,同学们可以用类似的方法进行分析。这样我们在控制程序中就可以判断,根据不同 的传感器给出不同的电机控制信号。用这种方法,机器人不仅比只有两个传感器时跑得 更快、更平滑,而且对于突然急转弯的黑线有更好的适应性。同学们会发现小机器人跑得 更加可靠了。 到目前为止,我们已经为机器人编写过好几个小程序了。在每个程序中都免不了要 和各种数字打交道,比如所使用的接口、传感器的读数、地面的灰度阈值等。在编写程序的过程中,也许有的同学已经发现了很多不方便的地方。 比如说在使用 pinMode 命令为端口规定方向时肯定要用到它的编号,然后再用 digitalRead 之类的命令操纵端口时也要用到同一个编号。同学们想一想,如果某天我们 突然要改为使用另一个端口,那么是不是要一个一个地把它的编号改变过去呢?显然用 这种方式编写程序修改起来既费力又容易出错。 再比如说,有时我们用analogRead 命令读到了传感器当前的值,但如果在接下来的 程序里我们还要用到这个值做比较复杂的计算,该怎么办呢?我们可不想在接下来的算 式中每个用到这个值的地方都去调用一次analogRead 命令,因为这样做的代价太大了。 实际上,在C 语言编程中,只要合理地使用常量和变量就可以很方便地解决上面这 几个问题了。 1.变量 变量是什么?顾名思义,变量就是数值可能发生变化的量。在程序中,常常需要把一 个数据存储起来供以后使用,还可能随时在程序中更改这个数据的值。这种情况下,就要 用到变量了。变量由数据类型、变量名和变量的值组成。 假设主控板上有一个温度传感器能感知外界温度。可以在程序里就可以声明一个叫 作温度(Temperature) 的变量来记录传感器的数值,并且声明它的类型是整数型。 int temperature; //int 代表变量类型是整数,变量名为 temperature, 表示温度 而在后面的程序运行过程中,主控板测得当前温度为20℃,在程序中就可以给温度 变量赋值为20。这时,如果要用它做各种计算,那么只要用temperature 这个变量名就可 以代表当前的温度值了。 temperature=20; //将温度赋值为20℃ 2.变量的声明与赋值 上面的例子中,先声明了一个名叫 temperature 的整数型的变量。然后又将它赋值 为20。我们这么做时,变量的声明和赋值是分开进行的。而在另一种情况下,也可以在 声明变量的同时就为它赋值。这时给变量赋予的值叫作初始值或是默认值。比如,我们 认为房间内大部分情况下温度是23℃。就可以这样做: int temperature=23; //声明名为temperature 的整型变量,并设初始值为23 当然,在后续的程序中随时可以改变这个变量的值,将它重新赋值为那时的温度值。 这也是我们为什么要使用变量的原因。 在为变量命名时,可以根据习惯使用英文或汉语拼音。但是,要注意的是变量名一般 都要和变量的实际用途相关。有的同学为了省事,喜欢用a0 、b1 之类的简单字母加上个 数字作为变量名。这样做是很坏的习惯,你的代码将会很难被别人读懂,甚至不久后你自 己都忘了它们是做什么用的。所以,请同学们一定要养成良好的命名习惯。这也是优秀 的程序员的标志之一。 3.常量 常量就是数值永远不会发生变化的量。我们在数学课中已经接触过好几个大名鼎鼎 的变量,和它相对的自然就是常量了。圆周率π就是一个大小永远不变的量 — — 常量。 在计算机程序中,有的数值是在程序的整个生命中都不会被改变的,我们就Z好用常量来 表示它们。常量的声明很简单,只要在变量的类型前加上一个 const 就可以了。不过,和 变量不同的一点是,常量在声明时一定要给它赋值,这个值就是它那个永远不变的值。 现在,同学们可能已经想到了,我们在程序中所使用的端口的编号就是典型的应该使 用常量来定义的。下面的例子就声明了一个整数类型的常量,用来表示 LED 小灯连接到 了主控板上的3号端口上。 const int ledPort=3; //声明一个名为 ledPort 的整数型常量,并赋值为3 4.数据类型 以前所举的所有例子里,变量和常量都是用来表示整数的。同学们一定会好奇,除了 整数类型,我们至少还学习过小数啊!比如,如果测得的温度值是20.5℃,那可怎么办 呢?现在就来介绍 一 下C 语言中的其他几种常用数据类型 此外,如果在 int 和 char 类型的变量前加上 unsigned 关键字,就代表这个变量不可 能为负值。 好了,现在就在一个实际例子中,用刚刚学到的知识定义几个不同类型的变量。 假设我们的程序需要处理学生的成绩,每个学生在考试中都得到了一个百分制的分 数,而这个分数又可以分为A、B 、C、D4 挡,还可以根据分数够不够60分判断是否及格。 已知全班同学的分数后还可以计算出平均分。那么很可能需要声明以下几个变量: int score; boolean isQualified; char grade; float averageScore; //整数类型变量score 代表学生的分数 //布尔类型变量isQualified 代表学生是否及格 //字符类型变量 char 代表学生的分数等JA,B,C,D //浮点数类型变量averageScore 代表全班的平均分
|
||
| 下一篇 | ||
| 返回顶部 ∧ |
| 技术支持 |
| 关于创泽 |
| 隐私条款 |
|
版权所有 @ 创泽智能机器人集团股份有限公司 运营中心 / 北京市·清华科技园九号楼5层 生产中心 / 山东省日照市开发区太原路71 |