摘要:本文介绍循迹小车的接线方法及类的基础知识
在开发之前,还是先将循迹传感器与ESP32扩展板连接好,VCC和GND的连接在这里就不再描述了,找到合适的排针接上就可以了,主要关注一下哪个循迹传感器连接到了哪个GPIO引脚,这个涉及到了后边程序开发中的代码编写。ESP32扩展板与L298N的连接方法与之前的项目相同,具体连接如下所示:
模块 | 引脚 | 连接对象 |
L298N模块 | IN1 | ESP32的P18 |
IN2 | ESP32的P23 | |
IN3 | ESP32的P32 | |
IN4 | ESP32的P33 | |
OUT1、OUT2 | 右前轮TT电动机 | |
OUT3、OUT4 | 左前轮TT电动机 | |
+12V | 电池的正极 | |
GND | 电池的负极和ESP32的GND(分别连接) | |
+5V | ESP32的+5V(开发时不需要连接,运行时连接) | |
左一循迹模块 | DO输出 | ESP32的P27 |
+5V | ESP32的+5V | |
GND | ESP32的GND | |
左二循迹模块 | DO输出 | ESP32的P26 |
+5V | ESP32的+5V | |
GND | ESP32的GND | |
右一循迹模块 | DO输出 | ESP32的P21 |
+5V | ESP32的+5V | |
GND | ESP32的GND | |
右二循迹模块 | DO输出 | ESP32的P4 |
+5V | ESP32的+5V | |
GND | ESP32的GND |
在上面的连接表中可以看到,小车的L298N电机驱动模块的连接与之前的几个实验的连接方法完全相同,而小车在运行过程中,所左的各种行驶动作也是基本相同的,基本包括了,向前行驶,左转,右转,停止等等常规操作。看来还需要把原来的代码再拷贝过来一份了?不,这次我们变一个写法,先把与小车相关的操作封装成一个Car类,让这些相关的动作和配置信息形成一个独立的相互关联的有机整体,这样以后在使用的时候就会方便很多了,就向之前使用并且详细介绍过的Servo类和Wire类一样。
在C++中,类是指对现实世界中一切事物的抽象,有些编程语言也称之为“对象”。在编程开发中,可以将具有相似点的不同事物抽象为“类”,找到这些不同事物之间的共同点。例如生活中的自行车、摩托车和小轿车,可以将它们都定义成“类”。
类本质上是属于用户自定义的数据类型,该数据类型除了拥有一些描述自身特性的属性数据外,还具有一定的行为能力,也就是类中的方法。通常来说,一个类的定义包含两部分的内容,一是该类的属性,另一部分是它所拥有的方法。以前边提到的自行车为例,长度、高度、重量等等,可以称之为自行车的属性。而响铃、车轮转动则可以称之为自行车的一种行为,可以抽象为类中的方法。
前边提到的自行车、摩托车和小轿车都是一种交通工具,因此可以将交通工具定义为“基类”,而自行车、摩托车和小轿车都是基于交通工具的子类,或者说是一种特殊的交通工具。它们除了具备交通工具的基础特征之外,还有一些个性化的属性或者行为。这就是类之间的继承关系。
好了,关于类的基本知识就介绍到这里了,下面来了解一下类的基本定义。
在C++中,使用关键字class来定义类,其基本的形式如下:
class 类名 { public: //公共的行为或属性 protected: //受保护的行为或属性 private: //私有的行为或属性 }; |
类名:必须要遵循一般的命名规则。这与之前介绍的函数和变量的命名规则基本一致。
public:共有的。用来定义公开的属性和方法。不管是类的内部,还是类实例的拥有者,都可以访问。通常情况下,属性都不定义成public类型,外界必须通过给定的方法来修改或者得到相应的属性值。相比于外部直接访问属性,通过方法来操作属性有以下几个好处:
- 可以在方法中加入安全验证机制,避免谁都能访问或者谁都能修改。
- 可以在方法中加入合法性验证机制,避免使用者有意或者无意将其变为非法数据,而影响功能的实现。
- 有些属性的值是与自身状态相关的,使用方法来获取属性的值,可以进行相应的状态检查,避免获得无效的属性值。
protected:受保护的。这里面定义的属性或者方法,只能在类内部或者子类的方法中调用或者访问。其他的类是无法直接访问受保护的方法或者属性的。
private:私有的。用来定义私有的属性和方法。定义为私有的属性和方法,不能被外界所调用或者访问,只有类内部的方法才能调用和访问。
下面再来介绍一下一类特殊的方法——构造函数。构造函数的作用是在创建类的对象实例时进行类的初始化。
在C++中,每个类都有且必须有构造函数。如果开发者没有自行编写构造函数,则C++会自动提供一个无参数的构造函数,称为默认构造函数。这个默认构造函数不做任何初始化工作。一旦用户编写了构造函数,则这个无参数的默认构造函数就消失了。如果用户还希望能有一个无参数的构造函数,就必须自行编写。构造函数的特征是其名字必须与类名保持一致,并且不需要定义返回值。因为调用这个方法后返回的是这个类的实例,这是不能改变的。
下一篇将具体介绍Car类的定义和实现的方法。