# Scartch 教程

# Scartch资料下载

[Scartch资料下载](./Scratch资料.zip)

## 驱动安装与开发环境

### 1.KidsBlock软件安装方法 

注意：这里是以Windows系统为例，macOS 系统可以以此作为参考。

1.  点击下载链接进行下载：Windows系统：https://www.kidsblock.cn/Down/KidsBlock.exe、MacOS系统：https://www.kidsblock.cn/Down/KidsBlock-MACOS.dmg。注意：本软件后续将保持更新，以实际下载到的版本为准，不同版本按照教程基本一致，请按照实际安装
2.  先选中“为使用这台电脑的任何人安装”，再点击“下一步”。

![](media/5868a1bfda48a42ef163f33f228cfc6a.png)

3.  先点击“浏览（B）...”,选择安装的位置（我这里选择安装在C盘，你也可以选择安装在电脑的其他盘），再点击“安装”。这样，软件就在安装过程中。

![](media/bc35a80ff1f77650c4f4778ba88ce15f.png)

![](media/1f52414579ea8fa83660d2a35111fd50.png)

4.  几秒种后，安装完成。点击“完成”就可以打开安装好的软件。

![](media/e5221f246e9bd5286a6302ee527f9cf4.png)

5.  如果出现电脑安全警报窗口，点击“允许访问”。这样就可以打开了软件页面。

![](media/f2328405bc206bf39f8ee54d2f76a2ac.png)

![](media/1a26801e93f3ac21c5b721a21bd0fe13.png)

有更新软件时一般打开会自动提醒，为了软件能正常使用我们选择升级![](media/846685e3e9b0f18d155a7ecf389ca796.png)

我们也可在设置中手动更新软件

![](media/1143b889fd69e72473a4071055f8f19a.png)

如果已经是最新版本则显示![](media/415745a84dbc153e57067dc86fc519d2.png)

### 2.KidsBlock软件的使用方法

（以下是以Windows系统为例，MacOS系统可以参考）

1. 软件中各按钮的功能：

![](media/0ddc4103cc9f2488dbaa85267f5b90e8.png)

2. 点击![](media/3dd044ace633a5f7218b0d19a55ff9cf.png)可以选择语言![](media/a26ac98fda5eb460bae6370e017e1869.png)“English”和“简体中文”。

3. 点击![](media/ceea175e15c8425a1a70baaaf56d40b3.png)，选择点击“安装驱动”。（注意：如果电脑已经安装了驱动程序，则不需要再安装驱动；如果没有，则需要进行以下操作）

A.在“设备驱动程序安装向导”页面选择点击“下一页”。

![](media/be8269c2e723ad6bb95a3027aaa96f5a.png)

B.过一会儿，选择点击“完成”。

![](media/0d8f2d15f93f9c162d590af9962160f4.png)

C.选择点击“下一页”。

![](media/3a18d722c99f4c739f71f9de6dad3897.png)

D.选择点击“完成”。

![](media/1d1562c2614b811ff0cb43da449985a1.png)

E.如果出现安全页面，选择点击“允许”即可，然后选择点击“Install”。

![](media/726e0c8a971ebd698a2785aa0aa96b48.png)

![](media/55317031882e78e69fc63225e50219de.png)

F.选择点击“安装”。

![](media/7f1a8c8dbe51711f213c382aeb0228c2.png)

G.过一会儿，点击“Finish”。

![](media/06a890be5adedc1400ecd722634099e8.png)

H.选择点击“Extract”。

![](media/8f99c1a32792b8d04f1986982b20edc8.png)

I.选择点击“下一页”。

![](media/7b3b94085bb2012b4dab64a4d3ea6e1d.png)

J.选择点击“我接受这个协议”后，点击“下一页”。

![](media/c176eaa9b8a278d497b5cb3aed623331.png)

K.选择点击“完成”。

![](media/86e3fce6103bbd8e80f058d26b5fc77f.png)

L.选择“安装”。

![](media/5a7ee544df41f82915ad7a07c5367988.png)

N.过几秒钟后，驱动安装完成，点击“确定”即可。

![](media/72f2d50822510f87b5320f674d24d8ea.png)

4.  驱动安装完后，点击![](media/33193aae5cf46bccd050b84af65b9dde.png)进入主控板页面，可以选择需要添加的设备（控制板），本项目需要选择Uno     Plus主控板。先点击Uno Plus主控板所处区域，后点击“连接”。这样Uno     Plus主控板已连接上，点击“返回编辑器”回到编码编辑器。这样，我们会发现![](media/e3d5380fcd0890ff6320185808d7fab9.png)变成![](media/a007c723131e3e7323ce323d07e71196.png)，同时![](media/8cac6f60c26e2b10d1b2dc313ea5eb03.png)变成![](media/4f8778ff131729b181ea6ec292614a3c.png)，说明Uno     Plus主控板和端口（COM） 都已经连接上了。

![](media/dffb264fb8b7313928d1ae0f8d23b4d9.png)

![](media/2fce58968e59ac36c46a9a1f84193ef7.png)

![](media/3ff6136ef4a84bea34669b28e98ed032.png)

![](media/d343401828fddbe1e6413602345192a8.png)

5.  假如Uno Plus主控板已经连接上后，但是![](media/8cac6f60c26e2b10d1b2dc313ea5eb03.png)没有变成![](media/4f8778ff131729b181ea6ec292614a3c.png)，则需要手动点击![](media/8cac6f60c26e2b10d1b2dc313ea5eb03.png)来连接端口（COM）。先点击![](media/8cac6f60c26e2b10d1b2dc313ea5eb03.png)，在出现的对话页面中点击![](media/a034167a19e4c273d77848c3df421dc3.png)，连接成功后，会出现“已连接”页面，说明端口已连接上了。

![](media/5b2c3d62be5681caed19095150aa70d8.png)

![](media/22cd29b6a1a6970409239eb7e610dbb3.png)

![](media/e38ca3317bc7fa51081b680cc03f361f.png)

![](media/d343401828fddbe1e6413602345192a8.png)

如果需要断开端口，先点击![](media/4f8778ff131729b181ea6ec292614a3c.png)，在出现的对话页面中点击“断开连接”。这样，端口就断开了。

![](media/0fbc2939ff2e68b5560c539b4650b09a.png)

6.  Uno Plus主控板和端口（COM）都已经连接上，接着点击![](media/44a15c56037a5e48ecbb79a3ea02cd4c.png)切换模式，这样就可以将![](media/44a15c56037a5e48ecbb79a3ea02cd4c.png)切换成![](media/aa20eb800371bb25be725dd0ce5179c1.png)。

![](media/62865ed079a437d4403527a08477f2a6.png)

![](media/4738dfa04a1b1f3ef3ae9f8673b66fc9.png)

![](media/ff378f0c56013da971ac6e53cd6ccc2c.png)

7.  ![](media/edf13a6361883d47ee8d7b127531bb0e.png)是添加传感器/模块和元件的扩展包，点击![](media/edf13a6361883d47ee8d7b127531bb0e.png)可以进入传感器/模块扩展库界面，点击传感器/模块所处区域，就可以添加对应的传感器/模块。例如需要添加超声波传感器模块，点击“超声波传感器”所处区域，“未加载”变成“已加载”，说明“超声波传感器”模块添加成功。

![](media/62a0822242047cd856941c14ef6e3243.png)
![](media/3c5966e327bdc6423aff32c94a48f54d.png)

点击![](media/95039e92d5182ecb0bccc177aaec3f80.png)，可以回到代码编辑器界面，在模块区可以看到添加的“超声波传感器”模块。

![](media/6e53a9ecc5338e7ff4c6c4f8e43ded0d.png)
![](media/f0f2f219e7e3f5669a9b7108db73cdc1.png)

如果需要删除“超声波传感器”模块，只需要点击![](media/edf13a6361883d47ee8d7b127531bb0e.png)再次进入传感器/模块扩展库界面，点击“超声波传感器”所处区域，“已加载”变成“未加载”，则说明“超声波传感器”模块删除成功。

![](media/3c5966e327bdc6423aff32c94a48f54d.png)
![](media/62a0822242047cd856941c14ef6e3243.png)

其他的传感器/模块和元器件的添加和删除，方法是一样的。

8.  打开已有的SB3类型文件的方法：推荐使用方法2，方法1打开时有时可能会丢失代码数据！

方法1：鼠标左键双击SB3类型文件，这样就可以打开SB3类型文件。例如：需要打开![](media/1874abbb35ed2bb3a1bd5967f3a13181.png)文件，则只需要左键双击![](media/1874abbb35ed2bb3a1bd5967f3a13181.png)文件就可以直接打开。

![](media/bf7026e10afe3f7b8f2485a79c51608c.png)

方法2：打开Kidsblock软件，点击“文件”，选择点击“从电脑中上传”，在电脑上选中需要打开的SB3类型文件（例如：![](media/1874abbb35ed2bb3a1bd5967f3a13181.png)文件）

![](media/c8b69ae6e64fda3bae42967c3ad84d84.png)

![](media/78c3a7f1445d59c19c999fdcf03785df.png)

![](media/e46bd7b77ff563b22ff25fb882bf932a.png)



## 实验课程

### 第1课 LED灯项目

前面所有的东西都已经准备完毕，我们正式开始桌面小车的编程项目。前面我们从简单的传感器和模块开始，循序渐进完成模块传感器的测试项目，现在再来完成几个不同类型的机器人，最后我们把所有学到的知识结合到一起，完成一个综合的项目：多功能桌面小车。

注意：本项目中的各传感器/模块上标有（G）表示负极，是连接到控制板或传感器扩展板上的G或-或GND；标有（V）表示正极，是连接到控制板或扩展板上的V或VCC或+或5V。

（1）项目介绍： 

![](media/ae80c4ac2d601bf0e96ccb25ed872dcb.jpg)

前面我们安装了keyes UNO Plus开发板的驱动。接下来的项目我们就要由简单到复杂，一步一步探索Arduino的世界了。首先我们要来完成经典的“Arduino点亮LED”，也就是Blink项目。Blink对于学习Arduino的爱好者而言，是最基础的项目是新手必须经历的一个练习。

LED是发光二极管的简称。由含镓（Ga）、砷（As）、磷（P）、氮（N）等的化合物制成。当电子与空穴复合时能辐射出可见光，因而可以用来制成发光二极管。在电路及仪器中作为指示灯，或者组成文字或数字显示。

为了实验的方便，我们将LED发光二极管做成了一个模块，在第一个项目中，我们用一个最基本的测试代码来控制LED，亮一秒钟，灭一秒钟，来实现闪烁的效果。你可以改变代码中LED灯亮灭的时间，实现不同的闪烁效果。LED模块信号端S为高电平时LED亮起，S为低电平时LED熄灭。

![](media/85b2076096371fd9ca03671602b1e5ce.png)
![](media/31734302247e9a18efc688056a9c1019.png)

（2）LED模块参数： 

控制接口: 数字口

工作电压: DC 3.3-5V

排针间距: 2.54mm

LED显示颜色：红色

（3）项目组件： 


|keyes UNO Plus开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|keyes 草帽LED白发红模块*1|
|-|-|-|
|![](media/09106473b729ff790b8b6c63172956aa.png)|![](media/9a393a6a25c68ad7339932d93fb0eca1.png)|![](media/31fb938502d3d519813c391569d6a3f3.png)|
|USB线*1|3Pin 双母头杜邦线*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/3bd68528286ba9ed0cab51cb5c96943b.png)|![](media/bb66cfb86ed22b9b941523acf946bf9b.jpg)|![](media/82b0a81462c83f9adf6f8279df1adcd8.png)|




（4）接线图： 

![](media/a6d9c8183709df03437c678f22df9052.png)

由上图我们可以看到，扩展板是堆叠在开发板上的，LED模块的-接到了扩展板的G,LED模块的+接到了扩展板的5V，LED模块的S已经接到了扩展板上的D9接口，接好线之后我们开始编写代码：

（5）项目代码： 

可以直接打开我们编写好的程序：点击文件下的打开然后找到Scartch教程的第一课程序

![](media/b2a966e9b7538790d8094e8e8aa6593a.png)

也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

①在事件栏里拉出“Arduino启动”模块。

![](media/b6bbfb8822be46dad31acf563f85c0c8.png)

②在引脚栏拖出设置引脚输入/输出模块

![](media/8fda1fac5f36f971db762df679809719.png)

③在控制栏拖出无限循环模块

![](media/da5b9cf2bf6927d334cfa9b3766447ee.png)

④在引脚栏拖出设置引脚高低电平模块，设置管脚为2，电平为高，点亮LED。

![](media/1741d76950aebdee6574834f9ec14ee4.png)

⑤在控制栏目里拖出延时模块，设置为1秒

![](media/6d1fb22ada992ba4a0eff71b02591af1.png)

⑥在引脚栏拖出设置引脚高低电平模块，设置管脚为2，电平为低，熄灭LED。

![](media/7b78dac07c2c49e1bcea8e2b14fbb431.png)

⑦再来一个延时1秒

![](media/6d1fb22ada992ba4a0eff71b02591af1.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/fdadaecda65dffcd0d3635c246b5f293.png)

上传程序：选择正确串口，波特率是：9600；控制板选择uno plus开发板；然后点击上传程序，程序上传成功会提示上传成功。

![](media/39bc9c36e84c03143832ef4fd0e29d19.png)

（6）项目结果： 

点击上传程序到开发板，成功之后，D9脚接着的LED打开和关闭，而且间隔的时间是一秒钟。

（7）项目拓展： 

前面我们控制了LED 的闪烁，我们来拓展一下思路，我们要改变LED灯闪烁的频率,把延时改成0.2秒。代码如下：

![](media/d8ce601ea36346fa3d515149bedeeb21.png)

怎么样是不是很好理解，就是通过改变这个代码的延时时间，来改变9脚LED亮和灭的频率，我们上传代码。看看这个LED灯闪烁的频率是不是比之前快了？



### 第2课 LED 亮度的调节 

（1）项目介绍： 

前面课程中，我们详细的介绍了通过代码控制LED亮灭，实现闪烁的效果。这节课我们使用PWM来控制LED亮度不断地变化，模拟我们呼吸的效果。

PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波（一个不停在高电平与低电平之间切换的信号)来控制模拟输出。一般来说端口的输入电压只有两个0V与5V。如果想要改变灯的亮度怎么办呢个？有同学说串联电阻，对，这个方法是正确的。但是，如果想要得到不同的亮度，且在不同亮度之间来回变动怎么办呢？不可能不停地切换电阻吧。这种情况下就需要使用PWM了，那它是怎么控制的呢？

![](media/a6dbf9a1d18d8849437f013dcaf2d4a6.png)对于Arduino的数字端口电压输出只有LOW与HIGH两个，对应的就是0V与5V的电压输出，可以把LOW定义为0，HIGH定义为1，1秒内让Arduino输出500个0或者1的信号。如果这500个全部为1，那就是完整的5V，如果全部为0，那就是0V。如果010101010101这样输出，刚好一半，端口输出的平均电压就为2.5V了。这个和放映电影是一个道理，咱们所看的电影并不是完全连续的，它其实是每秒输出25张图片。在这种情况下，人的肉眼是分辨不出来的，看上去就是连续的了。PWM也是同样的道理，如果想要不同的电压，就控制0与1的输出比例控制就可以了。当然这和真实的连续输出还是有差别的，单位时间内输出的0,1信号越多，控制的就越精确。

（2）项目组件： 


|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|keyes 草帽LED白发红模块*1|
|-|-|-|
|![](media/8139401f972b7aef74821a6edaf3d8fd.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/31fb938502d3d519813c391569d6a3f3.png)|
|USB线*1|3Pin 双母头杜邦线*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/2ca7c235092678450c97c7ba40c15503.png)|![](media/07752ebfc8e8af62f1b86c4a725ea284.jpg)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)|


（3）接线图： 

Arduino的PWM引脚在3，5，6，9，10，11,上一小节的接线刚刚好在9脚，所以我们这个接线不用变

![](media/eb4e6d393edafbda78ae4cb3b58a961e.png)

（4）项目程序 

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

①在事件栏里拉出“Arduino启动”模块。

![](media/b6bbfb8822be46dad31acf563f85c0c8.png)

②在引脚栏拖出设置引脚输入/输出模块

![](media/9d49007253df529c171a2f41525c2c46.png)

③在变量类型栏中拖出声明全局变量模块并设置变量名为“i”

![](media/57ba8301343477d2183e96b7a61c4394.png)

④在控制栏拖出无限循环模块

![](media/9f1da17fb0b3e48361c942cbbaf1d4b2.png)

⑤然后再拖出重复执行直到模块

![](media/817a8ec36a38faae0ea31721e1c0e378.png)

⑥然后在重复执行里加运算栏的大于模块，然后在变量类型栏下拖出变量模块变量名为i ，最后设置数字为254

![](media/d09a04b507f7d8e49c847bb140e84c55.png)

⑦在变量类型下做出设置变量加一的模块，并设置变量名为 i

![](media/f5760e71bfd9cc064e0fc44fe481f3e5.png)

⑧在引脚栏下拖出设置引脚为PWM模块，并添加变量i为PWM值

![](media/1b680cdc743f9023b48dc1c841ca5661.png)

⑨在控制栏拖出延时模块，设置延时为0.005秒

![](media/4683e2552c3289b7cbadc3cbc9ef77f6.png)

⑩再拖出重复执行直到模块

![](media/817a8ec36a38faae0ea31721e1c0e378.png)

⑪然后在重复执行里加运算栏的小于模块，然后在变量类型栏下拖出变量模块变量名为i ，最后设置数字为1

![](media/877b2c482d058c09eb4d944b0f5d22ab.png)

⑫在变量类型下做出设置变量减一的模块，并设置变量名为 i

![](media/1a62a74c51704eaca3fd42321f810d06.png)

⑬在引脚栏下拖出设置引脚为PWM模块，并添加变量i为PWM值

![](media/1b680cdc743f9023b48dc1c841ca5661.png)

⑭在控制栏拖出延时模块，设置延时为0.005秒

![](media/4683e2552c3289b7cbadc3cbc9ef77f6.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/093093c2c331a3655c3126101ae7d2ad.png)

（5）项目结果：

上传代码到开发板代，完成后，我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程，而不是直接的亮灭，如同呼吸一般，均匀变化。

（6）项目拓展： 

可以直接打开我们编写好的程序，我们不改变灯的脚位，只是改变程序里面延时ms的值为30ms，看看它如何改变渐变效果。

![](media/48d0ffe1d0665621c99ef468be4b1c62.png)

上传代码到开发板，观察LED渐变的效果是否慢了一些。



### 第3课 循迹传感器项目 

（1）项目介绍： 

![](media/6780dd9ed614a63a3862f503e39b3b7e.png)

这个3路循迹传感器模块上自带有三个电位器，用于调节循迹传感器敏感度。循迹传感器其实也是红外传感器，这里的循迹传感器模块用到的元件是TCRT5000红外对管，TCRT5000红外对管具有一个高发射功率红外发射二极管和一个高灵敏度红外接收管。当发射管的红外信号经反射被接收管接收后，接收管的电阻会发生变化，在电路上一般以电压的变化体现出来。电阻的变化取决于接收管所接收的红外信号强度，常表现在反射面的颜色和反射面接收管的距离。在检测的时候，黑色高电平有效，白色是为低电平有效。

红外对管寻迹：

当乌龟车在白色底面行驶时，装在车下的红外发射管发射红外信号，经白色发射后，被接收管接收，一旦接收管接收到信号，输出端将输出低电平（0）；当乌龟车行驶到黑线时，红外线信号被黑色吸收后，将输出高电平（1），从而实现了通过红外线检测信号的功能。将检测到的信号送到单片机的I/O口，当I/O口检测到的信号为高电平（1）时，表明乌龟车处于黑色的引线上；同理，当I/O口检测到的信号为低电平（0）时，表明乌龟车处于白色地面上。

（2）参数：

工作电压：DC 3.3-5V

接口：5PIN接口（PH2.0mm-5P 卧贴插座 ）

输出信号：数字信号

检测高度：0—3cm

尺寸：40\*32\*9mm

重量：6.8g

定位孔大小：直径3mm

![](media/07f91c262808ec0b48146173080d227e.png)

(3)项目组件： 

|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|keyes 草帽LED白发红模块*1|Keyes connectors 循迹传感器*1|
|-|-|-|-|
|![](media/d95b316725f0fbe659f6c324da013a76.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/31fb938502d3d519813c391569d6a3f3.png)|![](media/4f3f0b0638fcb1a64af48afdc3740309.png)|
|XH2.54转PH2.0 5P 连接线*1|3Pin 双母头杜邦线*1|USB线*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/f5dc1ad0f10e043c326aefa252a82575.png)|![](media/07752ebfc8e8af62f1b86c4a725ea284.jpg)|![](media/fe8ba66f46905de69adbbd38b476e425.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)|




（4）接线图: 

![](media/e157b23ed0454b74887536f4d04ac994.png)

循迹传感器接扩展板的D11、D7、D8引脚（左11，中7，右8）。

（5）项目程序： 

可以直接打开我们编写好的程序，也可以直接在事件栏拖出Arduino启动模块

![](media/b5d1968f1acd2f7bfa08da240f05b018.png)

在串口栏拖出设置串口波特率模块，波特率为9600

![](media/08e0fa094c0ea76e68ae2091aba3803b.png)

在控制栏拖出重复执行模块

![](media/566d66d20bfb8a882c73cc8d5fd5df80.png)

在串口栏拖出串口打印模块，设置打印文字“L：”不换行

![](media/ba583e47b93a5448f1b01b903b28e55e.png)

在串口栏拖出串口打印模块，添加串口模块中的读取数字引脚模快引脚为11脚，不换行

![](media/a28b77df9dcd9078599748f6697eb31b.png)

在以上面步骤同样的方法添加“M：”“R：”引脚为7，8

![](media/e1eee7bc2c63180523866e8d69e3aa41.png)

在控制栏拖出延时模块并设置延时为0.1秒

![](media/f9c50716e0772ab2b739254cea02d52a.png)

完整代码：

![](media/53066d83802ec883edf886abeaae81e7.png)

（6）项目结果： 

上传代码带开发板，打开串口监视，可以看到左中右三个循迹传感器的状态，如果我们用白纸去遮挡传感器，传感器的状态都是0。在没有接收到信号的时候，三个传感器都是高电平状态，显示的数值是1。

![](media/31db07816524298e1ec76c28983e015b.png)

（7）项目拓展： 

上面我们了解了循迹传感器的工作原理，接下来我们在第9脚接上一个LED灯，然后通过读取循迹传感器的状态，来控制LED的亮和灭。如下图接线：

![](media/c69c5454106c3b7bcd07fd67f6fa30c8.png)

可以直接打开我们编写好的程序：


![](media/15e7dc5893a01887644d1e8f7ef543f6.png)

上传代码到开发板，用我们的手去一个个的靠近传感器，我们看看LED灯的状态发生了改变没有？当我们用手去遮挡循迹传感器的时候，我们可以看到LED灯亮起来了。





### 第4课 舵机控制项目 

![](media/ebfc39b179ba70727ddf81ce6817deb5.png)（1）项目介绍：

舵机是一种位置伺服的驱动器，主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机，其内部有一个基准电路，产生周期为20ms，宽度为1.5ms的基准信号，将获得的直流偏置电压与电位器的电压比较，获得电压差输出。

![](media/69be958142b773acdae33eeef12afed7.png)舵机有很多规格，但所有的舵机都有外接三根线，分别用棕、红、橙三种颜色进行区分，由于舵机品牌不同，颜色也会有所差异，棕色为接地线，红色为电源正极线，橙色为信号线。

舵机的转动的角度是通过调节PWM（脉冲宽度调制）信号的占空比来实现的，标准PWM（脉冲宽度调制）信号的周期固定为20ms（50Hz），理论上脉宽分布应在1ms到2ms之间，但是，事实上脉宽可由0.5ms 到2.5ms之间，脉宽和舵机的转角0°～180°相对应。

![](media/5f3471aed2a4350556b9f7cd0b3284c5.png)

对应的舵机角度值如下:

![](media/ebadad234cf7e43ee799e66bb6c67b27.png)

（2）舵机参数： 

工作电压：DC 4.8V〜6V

可操作角度范围：大约 About 180°(在 500→2500 μsec)

脉波宽度范围：500→2500 μsec

空载转速：0.12±0.01 sec/60（DC 4.8V） 0.1±0.01 sec/60（DC 6V）

空载电流：200±20mA（DC 4.8V） 220±20mA（DC 6V）

停止扭力：1.3±0.01kg·cm（DC 4.8V） 1.5±0.1kg·cm（DC 6V）

停止电流：≦850mA（DC 4.8V） ≦1000mA（DC 6V）

待机电流：3±1mA（DC 4.8V） 4±1mA（DC 6V）

（3）项目组件： 


|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|Keyes SG90 9G 舵机|
|-|-|-|
|![](media/81e1a0c60fc4a3f33fbfcb5820bcacab.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/c4f689ac599db153e099236e7639c1f4.png)|
|USB线*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/b5ed6ad4769edb0ddd467deaa2b79d09.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)|




（4）接线图： 

接线注意：舵机连接到G（GND）、V（VCC）、10，舵机的棕色线是与Gnd(G)相连，红色线与5v(V)相连，橙色线是与数字10相连的。接舵机的时候必须要外接供电，因为驱动舵机的电流要求比较大，一般峰值的情况下接近1A，开发板的电流远远不够。如果不接外接电源，很有可能烧坏开发板。

![](media/ac4131d8e8f6b1e87d34cce8d3571cb3.png)

（5）项目程序：

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

先点击左下角的![](media/e882b79afa3a1666047f8928f895615b.png)添加舵机代码块

![](media/516245d08efa67088b6717bd59b4e80e.png)

在事件栏拖出Arduino启动模块

![](media/f1eca95132e1503e971e5fb42b70bfaa.png)

初始化舵机：在舵机栏拖出设置舵机模块，引脚为10，角度为90延时为500

![](media/4b45a28d13434a7c9bacbaabf154cb32.png)

在控制栏拖出重复执行模块

![](media/f378cba5a05790ec636d27bc22dd3851.png)

在舵机栏拖出设置舵机模块，引脚为10，角度为0延时为500

![](media/bd96be1d5ae150625a0037be415dc19c.png)

在舵机栏拖出设置舵机模块，引脚为10，角度为180延时为500

![](media/d77ae6b2557cd73dde4fba83ad08a341.png)

在舵机栏拖出设置舵机模块，引脚为10，角度为0延时为500

![](media/bd96be1d5ae150625a0037be415dc19c.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/07150a6747e31d3b4dd6bf57d0c80fb0.png)

在上传代码成功，我们可以看到舵机在0°到180°角度范围来回摆动。

(6)实验结果 

在上传代码成功，我们可以看到舵机在0°到180°角度范围来回摆动。





### 第5课 超声波模块项目 

（1）项目介绍： 

![](media/2a0b40b983f1aead31d43e1662c4257e.png)超声波传感器，它可以检测前方是否存在障碍物，并且检测出传感器与障碍物的详细距离。它的原理和蝙蝠飞行的原理一样，就是超声波模块发送出一种频率很高，人体无法听到的超声波信号。这些超声波的信号若是碰到障碍物，就会立刻反射回来，在接收到返回的信息之后，通过判断发射信号和接收信号的时间差，计算出传感器和障碍物的距离。

（2）超声波参数： 

![](media/db467b9bc621baabb0ebebbbe3362ca9.png)

工作电压：DC 5V

工作电流：15mA

工作频率：40khz

最大探测距离：3-4m

最小探测距离：2cm

感应角度：不大于15度

高精度：可达3mm

（3）项目组件： 

|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|keyes 草帽LED白发红模块*1|HC-SR04超声波传感器*1|
|-|-|-|-|
|![](media/8938536c9185dd1869d4a1d9345494e6.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/31fb938502d3d519813c391569d6a3f3.png)|![](media/e638a483d877052de67f1fd3f0145fcd.png)|
|HX-2.54 4P 双头 连接线*1|3Pin 双母头杜邦线*1|USB线*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/146f0fc8a39a7d767675ff130236d967.png)|![](media/07752ebfc8e8af62f1b86c4a725ea284.jpg)|![](media/5992a601c3fbee831a4f7e4228a70b25.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)|




（4）超声波模块知识： 

原理：看超声波的图可知，像是有两个眼睛，其一边是发射超声的，一边是接收超声波的，然后检测从发射遇到障碍物返回被接收到所需的时间t，再根据声音在空气中的传播速度大概是343m/s,距离 = 速度 \* 时间 ，由于超声波发射返回是两段路程了，所以需要除以2，故超声波测到的 距离 =（速度 \* 时间）/ 2

超声波模块的使用方法及时序图：

1、使用GPIO引脚给SR04的Trig引脚至少10μs的高电平信号，触发SR04模块测距功能；

2、触发后，模块会自动发送8个40KHz的超声波脉冲，并自动检测是否有信号返回。这步会由模块内部自动完成。

3、如有信号返回，Echo引脚会输出高电平，高电平持续的时间就是超声波从发射到返回的时间。

![](media/7d2dccb20acaf9b17c53063421a5faa0.png)

超声波模块的电路图

![](media/6637578e3d2c6f902ee32931532a83ca.png)

（5）接线图： 

接线注意：超声波传感器模块的VCC引脚连接至keyestudio V5 传感器扩展板的5v(V)，Trig引脚至数字12(S)，Echo引脚至数字13(S)，Gnd引脚至Gnd(G)。

![](media/82e3d601ebcc5903b9bca322f5e5a4f4.png)

（6）项目代码： 

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

先点击左下角的![](media/e882b79afa3a1666047f8928f895615b.png)添加舵机代码块

![](media/75f6fdae53ebd5d80ef1b5853557e4b1.png)

在事件栏拖出Arduino启动模块

![](media/dec1a5186bbff4fcbc40d7a57b378b72.png)

在串口栏拖出设置串口波特率模块，波特率为9600

![](media/3bad923426a89b58da89eddfc09eb905.png)

在控制栏拖出重复执行模块

![](media/b1b06138718c3f0961122ad4dd97a9fc.png)

在串口栏拖出串口打印模块，设置不换行；在超声波栏拖出设置超声波模块，设置tirg为12脚，echo为13脚，单位为CM

![](media/9e46002364bce76c7bd92134ed509067.png)

在串口栏拖出串口打印模块，设置打印内容为“CM”换行

![](media/a7222b4a0ff1765ff406f9811199e6d9.png)

在控制栏拖出延时模块，设置延时为0.25秒

![](media/0f5b19741eb2d1ab51a3b7f1da56ee22.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/7832d518e26d3cdfd6474f84dafb542a.png)

（7）项目结果： 

上传好测试代码到开发板，打开串口监视器，设置波特率为9600，我们可以看到超声波模块显示的距离，单位是厘米和英寸。用手阻挡超声波模块，我们看到显示距离的数值变小了。

(注意：上传好程序，把驱动板上的拨码开关拨到ON的位置，因为USB供电过低，超声波传感器无法正常工作)

![](media/475ece10e5176546c64360170f48407f.png)

（8）项目拓展： 

我们刚刚测出了超声波显示的距离，那我们动动脑筋，能不能用测出的距离来做一些控制呢，如果控制一个LED灯的亮和灭。我们来试一下，在D9脚接上一个LED灯模块。

![](media/3dae2bb0de4fec2635f0a2e3050eafca.png)

可以直接打开我们编写好的程序：




![](media/6ae79f62cb7c024822638a9947dd692d.png)

上传好测试代码到开发板，我们用手去靠近超声波传感器，观察LED灯是否亮了起来。



### 第6课 红外接收原理及应用

（1）项目介绍 

![](media/7a1e0d244a83bad6564a24a50be11c08.jpg)红外遥控在日常生活中随处可见，它被用来控制各种家电，如电视、音响、录影机和卫星信号接收器。红外遥控是由红外发射和红外接收系统组成的，也就是一个红外遥控器和红外接收模块和一个能解码的单片机组成的。 

![](media/7fa7afed8ee1fd21cde53a831e8bf7f2.png)红外发射的遥控器发射的38K红外载波信号是由遥控器里的编码芯片对其进行编码。它是以一段引导码，用户码，数据码，数据反码组成，利用脉冲的时间间隔来区别是0还是1信号(高电平低电平之比约为1:1时被认为是信号0)，而编码就是由这些0、1信号组成。同一个遥控器的用户码是不变的，用数据吗不同来分辨遥控器按的键不同。当按下遥控器按键时，遥控器发送出红外载波信号，红外接收器接收到信号时程序对载波信号进行解码，通过数据码的不同来判断按下的是哪个键。单片机由接收到的01信号进行解码，由此判断遥控器按下的是什么键。

红外接收我们用的是一个红外接收模块，主要由红外接收头组成，它是集接收、放大、解调一体的器件，它内部IC就已经完成了解调，能够完成从红外线接收到输出与TTL电平信号兼容的所有工作，输出的就是数字信号。他适用于红外线遥控和红外线数据传输。接收器做成的红外接收模块只有三个引脚，信号线，VCC，GND。与arduino和其他单片机连接通信非常方便。

（2）红外接收的参数： 

工作电压：3.3-5V（DC)

接口：3PIN接口

输出信号：数字信号

接收角度：90度

频率：38khz  

接收距离：3米

右图为红外接收模块的实物图和电路图

![](media/06bb7cadf8c2f3712434bde5dffe7df5.png)![](media/17b787d350e8882a03f0c31eeee3c9f2.png)

（3）项目组件： 

|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|keyes 草帽LED白发红模块*1|keyes brick 红外接收传感器*1|JMP-1 17键红外遥控*1|
|-|-|-|-|-|
|![](media/3dac772e8bce8ec064a446a79a4401b4.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/31fb938502d3d519813c391569d6a3f3.png)|![](media/a6b01539a553d69acfd8b9c5a5e1d500.png)|![](media/2a93c4291fa6f2a2c8d2cf50babbcc55.png)|
|USB线*1|3Pin 双母头杜邦线*1|XH2.54-3Pin+杜邦母双*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/758720b9c3fb5e5b46f01b9ac8926f85.png)|![](media/07752ebfc8e8af62f1b86c4a725ea284.jpg)|![](media/0815facc4222dbf87ca7e1d087d6e4ce.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)||


（4）接线图： 

接线注意：由于红外接收传感器输入的数字信号，将红外接收传感器模块的“-”、“+”和S引脚分别用导线连接到keyestudio传感器扩展板G（GND）、V（VCC）、A1，模拟口在数字口不够的情况下，模拟口也可以当数字口使用，模拟口A0相当于数字口14，A1相当于数字口15，以此类推。

![](media/5a1c5851d4752c958d1080b7b585bfdc.png)

（5）项目代码： 

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

添加红外接收代码块

![](media/b4c027c15847466fa3b5491b8bb63513.png)

在事件栏拖出Arduino启动模块

![](media/39dc20150c52ef64b93fb6afa611e9de.png)

在串口栏拖出设置串口波特率模块，设置波特率为9600

![](media/269bf4d22ea3e75e9bd54c0215e10364.png)

在红外接收栏拖出初始化红外接收模块，设置引脚为A1

![](media/7cf505c3e28995adcd27d2da5c324000.png)

在控制栏拖出重复执行模块

![](media/fe8b19acbca84dc416d1c00318f4443d.png)

在控制栏拖出判断模块，并在红外接收栏拖出红外接收遥控器数据模块，加在判断条件上

![](media/9ec71cc1a2990ca78b9aaa7503acc073.png)

在串口栏拖出串口打印模块，并在红外接收栏拖出读取红外数据模块，加在打印模块上，换行打印

![](media/e1055bc1bfcbdf5c5f2bb05579fc7434.png)

在红外接收栏拖出刷新红外接收数据模块

![](media/07ed10e146e85357dc344bbb93be7726.png)

在控制栏拖出延时模块，设置延时为0.1秒

![](media/89d1ccbe4f2cc97ff69d90c1a3af0ac1.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/98936147c3b6916f7835a63dc955e1da.png)

（6）项目结果： 

上传好测试代码，打开串口监视器，设置波特率为9600，拿出遥控器，对准红外接收传感器发送信号，即可看相应按键的键值，如果按键时间过长，容易出现乱码。

![](media/3b99a42c7391580b7fc3e92937dfd8db.png)

我们通过测试得出的数值，做了一个遥控器按键值表，方便以后使用。

![](media/e7946515345fdf65e1b3d58893f9a207.png)

（7）项目拓展： 

我们刚刚解码了红外遥控器的按键值，那我们能不能用测出的按键值来做一些控制呢，如果控制一个LED灯的亮和灭。我们来试一下，在9脚接上一个LED灯模块。红外接收器的脚位不变,当有遥控器的按键按下时,接在数字引脚9上的发光LED就会点亮，再按一下按键，led熄灭，接线图如下：

![](media/5fd6f13b75f48c1890cb96fd1b98870f.png)

上传代码带开发板,当遥控器按下OK按键时,LED就会亮，再按一下LED就会灭,同时电脑的串口会出现按键的命令编码.

可以直接打开我们编写好的程序：


![](media/1b46c3cb97a5b215bc708680301b472d.png)

上传代码带开发板,当遥控器按下OK按键时,LED就会亮，再按一下LED就会灭,同时电脑的串口会出现按键的命令编码.



### 第7课 蓝牙遥控的原理及应用

![](media/3920253c86188ac64cf9b82c0df6c941.png)（1)项目介绍：

蓝牙是一种无线数据传输方法。蓝牙技术是一种无线标准技术，可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换，DX--BT24 5. 1蓝牙模块采用英国 DAILOG公司14531芯片，配置256Kb 空间，遵循V5.1 BLE蓝牙规范。支持AT指令，用户可根据需要更改串口波特率、设备名称等参数，使用灵活。.本模块支持UART接口,并支持蓝牙串口透传，具有成本低、体积小、功耗低、收发灵敏性高等优点，只需配备少许的外围元件就能实现其强大功能。

蓝牙参数：

蓝牙协议：Bluetooth Specification V5.1 BLE

工作距离：在开放环境中，实现40m超远距离通讯

工作频率：2.4GHz ISM频段

通信接口：UART

蓝牙认证：符合FCC CE ROHS REACH认证标准

串口参数：9600、8数据位、1停止位、无效位、无流控

电源：5V DC

工作温度：–10至+65摄氏度

（2）项目组件：


|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|keyes 草帽LED白发红模块*1|DX-BT24 V5. 1 BLE蓝牙模块|
|-|-|-|-|
|![](media/7e6033f5186ac031c68dc5faae56384d.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/31fb938502d3d519813c391569d6a3f3.png)|![](media/2187584e5a5072fab415d8d5d1008d4e.png)|
|3Pin 双母头杜邦线*1|USB线*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/07752ebfc8e8af62f1b86c4a725ea284.jpg)|![](media/94d987c3d1e02646486949dce8715dd6.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)|


（3）接线图：

1.STATE：状态测试引脚，连接到内部LED，通常保持其未连接。

2.RXD：串行接口，接收终端。

3.TXD：串行接口，传输终端。

4.GND：接地。

5.VCC：电源的正极。

6.EN/BRK：断开连接，表示断开蓝牙连接，一般情况下，保持断开连接。![](media/99fab40965f356da3cf658aed24556bc.png)

蓝牙是直接插在电机驱动扩展板上的，注意一下方向，而且在上传代码之前不要插上蓝牙。

实验程序：

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

在事件栏拖出Arduino启动

![](media/8b5eb8fe0ce0a54d47726e3afad21815.png)

在串口栏拖出设置串口波特率模块，设置波特率为9600

![](media/b2676f0d6687651b5998d1ed98c3ef84.png)

在控制栏拖出重复执行模块

![](media/7970a54f8875c423a696ecdca0f2772d.png)

在控制栏拖出判断模块

![](media/c5b4f649d7011e812bd65ead55b7e32d.png)

在算数栏拖出大于模块，并在串口栏拖出拖出串口可读取字节数模块，设置串口可读取字节数大于0

![](media/2d95c801dda538d6cb8040f2acb35338.png)

在串口栏拖出串口打印模块，并添加串口读取数据在串口打印模块里

![](media/937496e1034588ac0c7f46006a57506e.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/082131357bad7e9a30cf6d7331c445b2.png)

（上传代码之前不要连接蓝牙模块，因为代码的上传也是用的串口通信，跟蓝牙的串口通信会有冲突，导致代码上传不成功）

上传代码到开发板，然后再插上蓝牙模块，等待手机发出的指令。

这是读取到abcABC的ASCII码值

![](media/ec85c82dfaf4e939f0c82eef683236ea.png)

ASCII码对照表：

![](media/1a07a9bdabb77822c8d41071a0659ebc.png)

（4）下载蓝牙测试APP：

安卓系统手机APP

1.  点击下载链接进行下载：https://xiazai.keyesrobot.cn/APP/Turtle%20Car.apk

2.  下载后安装，安装成功，显示图标如下。

![](media/314f9ec725e460dcc23872fe68bbb742.png)

3.点击上图图标，进入APP，显示如下图。

![](media/529cafe00a4f88a2ff202a2b901a04a2.jpg)

4.REV4板上传代码成功后，连接蓝牙，上电后，蓝牙模块上LED闪烁。点击APP![](media/7fdbb0d28b66d7e6508d4f47f2b74351.png)图标，搜索到蓝牙，显示如下图。

![](media/2a9146fe4a9381affe94bb9e8a3aef5a.jpg)

5.点击连接，蓝牙连接成功，显示如下图，蓝牙模块上LED变为常亮。

![](media/3d2a8f444a008b9bd4abfd347df6ee63.jpg)

苹果系统手机APP

1.点击下载链接跳转到App Store进行下载，下载链接为：https://apps.apple.com/cn/app/keyes-bt-car/id1455282913

![](media/7e6e1a042d748926b209a71c62f37048.png)

2.下载完成后打开keyes BT car。

![](media/3c0249b480b0453172eb46c29d44078a.png)

3.开启手机蓝牙，点击左上角的connect按钮，进行蓝牙搜索和连接。

![](media/5e92657dcaeaebeccbe0ef212daf04ec.png)

4.点击桌面小车的![](media/a9fe77eb0c84aeabb22e382343d2058f.png)图片按钮，进入控制桌面小车的界面

![](media/529cafe00a4f88a2ff202a2b901a04a2.jpg)

（5）项目拓展：

上面的项目，我们讲解了蓝牙接收到手机发送的信号并且在开发板的串口显示出来，比如我们按下![](media/a263d58a0bdc94580ed1fc821e0f0a42.png)，然后我们就会接收到‘B’，当我们松开的时候又接收到‘S’。那接下来我们就要想一下了，我们可以利用接收到的信号去做一些事情吗，答案是肯定的，我们这里就利用手机发送的命令去打开或者关闭一个LED灯。看接线图，在D9脚接了一个LED。

![](media/d9f6429c64e1929ec1df181e33082bb7.png)

可以直接打开我们编写好的程序：




![](media/254fc980ffbb0ad6adf7a14060d110ae.png)

上传代码完成后，点击手机APP上![](media/bd85947380dfa7249ea4ecab47f1b3de.png)以控制LED。当您按下发送\`\`B''时，LED将打开，而当您松开发送\`\`S''时，LED将关闭。



### 第8课 电机的驱动和调速 

（1）项目介绍： 

驱动电机的方法有很多，我们这个智能车用到的是最常用的L298P这个方案，
L298P是ST意法半导体公司出品的优秀大功率电机专用驱动芯片，可直接驱动直流电机、二相、四相步进电机，驱动电流达2A，电机输出端采用8只高速肖特基二极管作为保护。

我们根据L298P的电路设计了一款扩展板，叠层的设计可直接插接到开发板上使用，降低了用户使用和驱动电机的技术难度。我们来看一下这个板子的电路图和示意图：

![](media/991bfe4ef7264a6b83455ac668ecc10b.png)

![](media/756a3ab7381980285a3fd4764b6ff9b9.png)![](media/3672f4baeb83269d24bbcf1786336a04.jpg)
为了调节小车上的4个电机，使得电机电机的驱动方向与后续的课程代码描述一致。驱动板上自带8个跳线帽，也可用于控制电机转向，例如当MA电机接口前方2个跳线帽由横向连接改为纵向连接时，MA电机的转动方向就和原来的转动方向相反。

（2）规格参数： 

逻辑部分输入电压：DC 5V

驱动部分输入电压：DC 7-12V

逻辑部分工作电流：\<36mA

驱动部分工作电流：\<2A

最大耗散功率：25W（T=75℃）

控制信号输入电平：高电平2.3V\<Vin\<5V  ，低电平-0.3V\<Vin\<1.5V  

工作温度：-25＋130℃

（3）驱动小车运行原理： 

根据上面电机驱动板的电路图和示意图，我们让A电机的方向引脚在D2,调速引脚在D6,B电机的方向引脚在D4，调速引脚在D5，按照以下表格的运动逻辑，我们就可以知道如何通过控制数字口，PWM口控制2个电机转动，从而实现智能小车的行走。其中PWM值范围为0-255，设置数字越大，电机转动越快。（左边A电机，右边B电机）

||D2|D6（PWM）|电机（A）|D4|D5（PWM）|电机（B）|
|-|-|-|-|-|-|-|
|前进|LOW|200|正转|LOW|200|正转|
|后退|HIGH|200|反转|HIGH|200|反转|
|右旋转|LOW|200|正转|HIGH|200|反转|
|左旋转|HIGH|200|反转|LOW|200|正转|
|停止|/|0|停止|/|0|停止|


（4）项目组件：


|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|Keyes quick connectors 12FN20电机连接板A*1|Keyes quick connectors 12FN20电机连接板B*1|
|-|-|-|-|
|![](media/6b6a479fe7dd9fabbf65acf1ba5f630e.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/4bf5ba713f8a31c23209ab5b1c4bc84a.png)|![](media/4bf5ba713f8a31c23209ab5b1c4bc84a.png)|
|双头JST-PH2.0MM-2P*2|USB线|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/b260f2794e7e44b309ed4e3fdb73d493.jpg)![](media/b260f2794e7e44b309ed4e3fdb73d493.jpg)|![](media/bfc1238e298927106f1f94c390698afd.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)||


（5）接线图： 

![](media/06aca627415121b6331d3793effc62e0.png)

（6）项目代码： 

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

在事件栏拖出Arduino启动模块

![](media/38c5822cd7adfb00459fe2127c618755.png)

在控制栏拖出重复循环模块

![](media/1663a78bb03740d63b73e1a4ce1a8147.png)

在引脚栏拖出两个设置引脚高低电平，设置4，2脚为高电平；两个设置引脚PWM，设置5，6脚PWM值为255；在拖出一个延时模块延时1秒（前进代码）

![](media/95619ac25e25ea3b1762437fb48cb4b4.png)

在引脚栏拖出两个设置引脚高低电平，设置4，2脚为低电平；两个设置引脚PWM，设置5，6脚PWM值为255；在拖出一个延时模块延时1秒（后退代码）

![](media/a47f517b669b4566c5f74c38cefb8430.png)

在引脚栏拖出两个设置引脚高低电平，设置4脚为低电平，2脚为高电平；两个设置引脚PWM，设置5，6脚PWM值为255；在拖出一个延时模块延时1秒（左转代码）

![](media/37ba3ada95f4b21610dfbe4e5c6ab89e.png)

在引脚栏拖出两个设置引脚高低电平，设置4脚为高电平，2脚为低电平；两个设置引脚PWM，设置5，6脚PWM值为255；在拖出一个延时模块延时1秒（右转代码）

![](media/30449ca04a91efab253b5afa7eeebc44.png)

![](media/dc7a885b506d85ea01f7a840e65e3891.png)

（7）项目结果： 

上传代码成功，上电后，智能车前进1秒，后退1秒，左转1秒，右转1秒，停止1秒，循环。

（注意：程序上传成功后驱动板的拨码开关拨到NO位置，USB供电过低电机无法正常工作）

（8）项目拓展： 

![](media/38cfd3c19891de3e12c01049fdea0f86.png)

我们来通过调整PWM控制电机的速度，PWM调节150，接线不变，上传代码成功，可以看到电机转动的速度慢了许多



### 第9课 点亮8\*8点阵屏 

（1）项目介绍： 

![](media/09ae6a37d36a084a1b8e4049e6f37429.png)

制作小型显示器的一个有趣方法是使用8x8矩阵或4位7段显示器。像这样的矩阵是“多路复用的”——要控制64个LED，需要16个引脚。这需要很多引脚，还有像MAX7219这样的驱动芯片，可以为您控制矩阵，但是需要设置很多布线，它们占用了大量空间。毕竟，如果你能在没有大量布线的情况下控制一个矩阵，那不是很棒吗？这就是这些可爱的LED矩阵背包的用武之地。

在8X8点阵模块中，我们用HT16K33芯片来驱动点阵，有了它，我们只需要利用一个I2C通信接口（A4 SDA和A5 SCL）就可以控制一个8X8点阵了，不但方便了接线，而且节约可单片机资源。

（2）项目组件： 


|keyes UNO Plus 开发板*1|Keyes brick L298P 电机驱动扩展板 V1*1|Keyes brick 乌龟车用8X8点阵模块*1|
|-|-|-|
|![](media/0a1da6dc83adabf705cf2b59a5f86204.png)|![](media/3dca1bdd1d1420c1d12b16cbf52fee00.png)|![](media/9f0d17d64f75bbb5be1aa867f74414f4.png)|
|USB线*1|HX-2.54 4P 双头 26AWG*1|18650双节电池盒*1|18650电池*2 （电池自配）|
|![](media/a00c84de5496114ecda85c6b88bd1ed6.png)|![](media/fce1ec13e4b2ed9596e4c6c6685a8c9c.png)|![](media/c5bf59a8e5cdded95c02334369ab6fdd.png)|

（3）8\*8点阵屏介绍 ：

LED点阵屏由LED发光二极管组成，通过控制LED亮灭来显示文字、图片、动画、视频等，被广泛应用于公共场合做信息展示，如广告屏、公告牌等。![](media/69cd041993f2f212e2bcd0cebd606c5b.jpg)

LED点阵屏按照LED发光颜色可分为单色、双色、三色灯等，可显示红、黄、绿甚至是真彩色。根据LED的数量又分为4×4、8×8、16×16等不同类型。这里我们通过单色8×8点阵屏来了解其原理。

不同点阵屏封装不同，8×8点阵屏由8行8列共64个LED灯组成，其内部结构如下图：

![](media/3c0c561e13d0b6c7f7c0639a416bac14.jpg)

每个LED放置在行线和列线的交叉点上，当对应的某一行电平拉高，某一列电拉低，则对应交叉点的LED就会点亮。8×8点阵屏有16个管脚，将有丝印的一边朝下，逆时针编号为1.8，9.16。

![](media/6576aff8e8a7fb35335629c2f60de29b.jpg)

其对应内部管脚定义如下如所示：

![](media/17ab19262588f5078c2b7c74d93e3216.jpg)

比如我们要点亮第一行第一列LED灯，则对应将点阵屏的第9脚拉高，第13脚拉低，其他LED控制以此类推即可。

（4）HT16K33 8X8点阵驱动模块 

上面介绍了8\*8点阵的原理，想控制8\*8点阵需要多达16个单片机的引脚。这样既浪费资源也浪费时间。我们这里用了一个驱动点阵屏的芯片：HT16K33。THT16K33是一款内存映射和多功能LED控制器驱动器。该设备的最大显示段数为128个模式（16个段和8个公共区），带有13\*3（最大）矩阵键扫描电路。HT16K33的软件配置功能使其适用于多个LED应用，包括LED模块和显示子系统。HT16K33与大多数微控制器兼容，并通过双线双向I2C总线进行通信。下图是HT16K33
芯片工作原理图。

![](media/eff1e6fd953bfc0c639ede88b18787ce.png)

我们基于以上原理设计了一个8X8点阵驱动模块，从上图我们可以看出，我们只要通过I2C通讯利用单片机的2个引脚就可以很好的控制点阵显示。

（5）8X8点阵模块的参数 

工作电压: 5V    

额定输入频率: 400KHZ 

功率: 2.5W  

工作电流: 500mA  

（6）接线图： 

![](media/f5398148941e337bbef87f67efb6bccc.png)

接线注意：点阵屏模块的G、V、SDA、SCL引脚分别用导线连接到堆叠在keyes UNO Plus板上的电机驱动扩展板上的G、5V、A4、A5，电源接到BAT接口。

（7）实验程序： 

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

先点击左下角的![](media/a6c970a1290ba168a1f1eed0ee8c2ccf.png)添加点8\*8阵模块

![](media/37ffe736036fa00bf060a4be22f6bd0e.png)

在事件栏拖出Arduino启动模块

![](media/5a28517268a58994f812af087febea57.png)

在点阵栏拖出初始化点阵模块和清屏模块

![](media/417353336bcdfe12a9d87f1faae44666.png)

在控制栏拖出重复执行模块

![](media/29ea90519c66baede6b42a5a17fc236b.png)

在点阵栏拖出点阵显示模块和刷新显示模块，并设置显示图案为微笑

![](media/339e6c87c730464e7d71c0456ec6637b.png)

\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*完整的代码如下\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

![](media/ff251236f91b1ab78368f1c02471a972.png)

（8）测试结果 

上传代码成功，上电后，拨码开关拨打到“ON”端，8X8点阵显示笑脸图案。

（9）项目拓展： 

我们利用刚刚学到的知识,让点阵循环显示心型、前进图案，后退图案，左转图案，右转图案然后清除图案，时间间隔为1秒。

![](media/5cedb239e2373775db3d90285a8aa8dd.png)

![](media/d2ebdfbf8afd5a15ad9a3d9e46cc5079.png)





### 第10课 画地为牢小乌龟 

（1）项目介绍：

前面我们详细的介绍了智能车上各个传感器、模块、扩展板的使用方法。在这里我们可以结合前面课程中知识制作一个循迹小乌龟智能车。实验中，我们通过循迹传感器检测智能车底部是否存在黑线，然后根据检测结果控制两个电机的转动，从而把智能车关在黑线圈中即画地为牢。

（2）流程图：

画地为牢智能车具体逻辑如下表格。


|检测|中循迹传感器|检测到黑线：高电平|
|-|-|-|
|检测|中循迹传感器|检测到白线：低电平|
|检测|左循迹传感器|检测到黑线：高电平|
|检测|左循迹传感器|检测到白线：低电平|
|检测|右循迹传感器|检测到黑线：高电平|
|检测||检测到白线：低电平|
|条件|状态||
|左循迹传感器没检测到黑线 且中循迹传感器没检测到黑线且右循迹传感器没检测到黑线|前进（PWM设为200）|
|左循迹传感器检测到黑线 或者中循迹传感器检测到黑线 或者右循迹传感器检测到黑线|后退（PWM设为200） 然后左旋转（PWM设为200）|


按照前面思路设计好智能车后，我们就需要按照设计思路开始制作智能车。我们需要设计对应的接线，测试代码，然后接线上传代码，运行，确保智能车能够实现理想中的功能。

（3）接线图：

![](media/22abbbdde9ab9c9b9dc084bc9c8ef324.png)

接线注意：用导线把循迹模块连接到电机驱动扩展板上P1接口的G、V、D11、D7、D8；A、B两电机分别对应的连接到电机驱动扩展板上的接口A和接口B，电源接到BAT接口。

（4）测试代码：

可以直接打开我们编写好的程序，也可以自己拖动功能块编写程序：

在事件栏拖出Arduino启动

![](media/b638318eafab837df9c41ade16cbacbb.png)

在变量类型栏拖出设置变量模块，分别设置L_val、M_val、R_val三个变量

![](media/195f18331177afd2ea7f6b7abc8dece8.png)

在控制栏拖出重复执行模块

![](media/82327e6d0560067bda416fc3b1965829.png)

设置三个变量L_val、M_val、R_val分别赋值11、7、8脚读取的值

![](media/92f61254359ed9500361824d1e251e5a.png)

设置条件L_val == 0或 M_val == 0 或 R_val == 0时执行前进代码

![](media/587179e4cfbb1f1ed9cfcec00bce5637.png)

否则执行后退代码500ms；在执行左转代码800ms

![](media/d45bf76c11f4a2284396e55035519f81.png)

（在上传程序代码前，需要把蓝牙模块取下，否则代码会上传失败。）

完整代码：

![](media/1900c22e4e12a37fa008565fcc933943.png)

(5)测试结果：

当小车行驶过程中检测到黑线立即撤退，然后左转继续行驶。



### 第11课 循线小乌龟智能车 

（1）项目介绍： 

前面我们详细的介绍了画地为牢智能车的实现方法。在这里我们可以结合前面课程中知识制作一个循迹智能车。实验中，我们还是通过循迹传感器检测智能车底部是否存在黑线，然后根据检测结果控制两个电机的转动，从而控制智能车沿着黑线行走。

（2）流程图： 

循迹智能车具体逻辑如下表格。

|检测|中循迹传感器|检测到黑线：高电平|
|-|-|-|
|检测|中循迹传感器|检测到白线：低电平|
|检测|左循迹传感器|检测到黑线：高电平|
|检测|左循迹传感器|检测到白线：低电平|
|检测|右循迹传感器|检测到黑线：高电平|
|检测|右循迹传感器|检测到白线：低电平|
|条件|状态||
|中循迹传感器检测到黑线|左循迹传感器检测到黑线并且 右循迹传感器检测到白线|左旋转（PWM设为200）|
|中循迹传感器检测到黑线|左循迹传感器检测到白线并且 右循迹传感器检测到黑线|右旋转（PWM设为200）|
|中循迹传感器检测到黑线|左循迹传感器检测到白线并且 右循迹传感器检测到白线|前进|
|中循迹传感器检测到黑线|左循迹传感器检测到黑线并且 右循迹传感器检测到黑线|前进|
|中循迹传感器检测到白线|左循迹传感器检测到黑线并且 右循迹传感器检测到白线|左旋转（PWM设为200）|
|中循迹传感器检测到白线|左循迹传感器检测到白线并且 右循迹传感器检测到黑线|右旋转（PWM设为200）|
|中循迹传感器检测到白线|左循迹传感器检测到白线并且 右循迹传感器检测到白线|停止|
|中循迹传感器检测到白线|左循迹传感器检测到黑线并且右循迹传感器检测到黑线|停止|


按照前面思路设计好智能车后，我们就需要按照设计思路开始制作智能车。我们需要设计对应的接线，测试代码，然后接线上传代码，运行，确保智能车能够实现理想中的功能。

（3）接线图： 

![](media/f6e7625c37ce5e2c0e99ecdab014d325.png)

接线注意：用导线把循迹模块连接到电机驱动扩展板上P1接口的G、V、D11、D7、D8；A、B两电机分别对应的连接到电机驱动扩展板上的接口A和接口B，电源接到BAT接口。

（4）测试代码： 

可以直接打开我们编写好的程序，也可以自己拖动功能块编写程序：

在事件栏拖出Arduino启动

![](media/b638318eafab837df9c41ade16cbacbb.png)

在变量类型栏拖出设置变量模块，分别设置L_val、M_val、R_val三个变量

![](media/195f18331177afd2ea7f6b7abc8dece8.png)

在控制栏拖出重复执行模块

![](media/82327e6d0560067bda416fc3b1965829.png)

设置三个变量L_val、M_val、R_val分别赋值11、7、8脚读取的值

![](media/92f61254359ed9500361824d1e251e5a.png)

在控制栏拖出如果...否则模块，并判断M_val是否等于1

![](media/b5c7236b24909a2d053ba75da3d0c23e.png)

在控制栏拖出如果...否则模块，并判断L_val是否等于1且R_val是否等于0，满足条件则执行左转代码

![](media/7c1e68931086240a56aaf1ff26b2f575.png)

在控制栏拖出如果...否则模块，并判断L_val是否等于0且R_val是否等于1，满足条件则执行右转代码，不满足条件执行前进代码

![](media/424f059ffe9af2f8881ce1f0329e3729.png)

在控制栏拖出如果...否则模块，并判断L_val是否等于1且R_val是否等于0，满足条件则执行左转代码

![](media/0715348291709eade7e2d82ac0156c91.png)

在控制栏拖出如果...否则模块，并判断L_val是否等于0且R_val是否等于1，满足条件则执行右转代码，不满足条件执行停止代码

![](media/51be1eebe01de2f705494621ce54b0ec.png)

完整代码：

![](media/97928d219b6c95b5a168f6a4072225be.png)

![](media/618d3d67c177b069ef84bd6ecc3a1f29.png)

（5）测试结果： 

将驱动扩展板堆叠在UNO Plus板上，上传好代码，按照接线图接线，将拨码开关拨至ON端后，智能车能够沿着黑线行走。


### 第12课 超声波跟随小乌龟 

（1）项目介绍：

实验中，我们通过避障传感器检测智能车左右两方是否存在障碍物，检测智能车和前方障碍物的距离，然后根据这三个数据控制两个电机的转动，从而控制智能车的运动状态。

（2）流程图：

跟随智能车具体逻辑如下表格。


|检测|超声波测试前方物体距离|distance（单位：cm）|
|-|-|-|
|条件|distance<8||
|状态|后退（PWM设为100）||
|条件|8＜distance≤13||
|状态|停止||
|条件|13≤distance≤35并且l_val=1并且r_val=1||
|状态|前进（PWM设为100）||
|条件|distance＞35||
|状态|停止||


按照前面思路设计好智能车后，我们就需要按照设计思路开始制作智能车。我们需要设计对应的接线，测试代码，然后接线上传代码，运行，确保智能车能够实现理想中的功能。

（3）接线图：超声波模块+电机+点阵+舵机

接线注意：A、B两电机分别对应的连接电机驱动扩展板上的接口A和接口B；超声波传感器模块的V引脚至V，T（Trig）引脚至数字12(S)，E（Echo）引脚至数字13(S)，舵机接D10，电源接到BAT接口。

![](media/f14f1e06612690aa7684a88b8ed79743.png)

（4）测试代码：

可以直接打开我们编写好的程序，也可以自己拖动功能块编写程序：

添加超声波传感器的代码块和舵机的代码块

![](media/c82d78fc5556a1fd083c42b13cfb3864.png)

在事件栏拖出Arduino启动模块

![](media/30659b170b6abb8abc425b726a840a21.png)  
在舵机栏拖出设置舵机模块，并设置引脚为10，角度为90度，延时为200ms

![](media/07a0ca78085a49bb74660d4dc9342980.png)

声明一个全局变量，整形，变量名为distance，赋值为0

![](media/8f532e45d429cd9f405fe2ce15694560.png)

在控制栏拖出重复执行语句

![](media/3e8a89a8e85668424ccbf0633eb5beac.png)

将超声波感应的距离赋值给变量distance，超声波trig脚为12，echo为13

![](media/2c0097725cb2581726b277b08e835629.png)

使用如果否则模块，单端distance是否大于13且小于35，如果是则执行前进代码

![](media/8dfb5bdf1d285b487f7f3fb27fbe5e46.png)

使用如果否则模块，单端distance是否大于8且小于13，如果是则执行停止代码

![](media/aa6ac4fbbe494e306c08fb1725efcd9a.png)

使用如果否则模块，单端distance小于8，如果是则执行后退代码，如果不是则执行停止代码

![](media/9c547b2cda605038a5af5b10b1c0e574.png)

完整代码：

![](media/47338d55a3d4435d4c975ec4cda0f170.png)

![](media/6ddbe3f19a6b4b78c93c08d45e48c66e.png)

好了，桌面迷你蓝牙智能车跟随功能效果的代码全部编写好了，上传程序，看看精彩的效果！（在上传程序前，需要把蓝牙模块取下，否则代码会上传失败。需要上传程序成功后，再连接蓝牙模块。）

（5）测试结果：

将驱动扩展板堆叠在UNO Plus板上，上传好代码，按照接线图接线，将拨码开关拨至ON端后，智能车能够随着前方障碍物的移动而移动。



### 第13课 走迷宫智能车 

（1）项目介绍： 

在上课程中，我们制作了一个跟随智能车。实际上，利用同样的电子元件，同样的接线方法，我们只需要更改一个测试代码就可以将跟随智能车变为避障智能车。

（2）流程图： 

避障智能车具体逻辑如下表格。


|检测|左边障碍物距离|distance_l（单位：cm）|
|-|-|-|
|右边障碍物距离|distance_r（单位：cm）||
|中间障碍物距离|distance（单位：cm）||
|条件|状态||
|0<distance<10|distance_l > distance_r 如果左边大于右边|向左转|
|distance_l<=distance_r 如果左边不大于右边|向右转||
|distance>=20|前进||

使用的电子元件，接线方法和课程四一样，更换测试代码，运行，确保智能车能够实现理想中的功能。

（3）接线图：超声波模块+电机+舵机+点阵 

接线注意：A、B两电机分别对应的连接电机驱动扩展板上的接口A和接口B；超声波传感器模块的V引脚至V，T（Trig）引脚至数字13(S)，E（Echo）引脚至数字12(S)，G引脚至G；舵机接D10；电源接到BAT接口。

![](media/f14f1e06612690aa7684a88b8ed79743.png)

（4）测试程序 ：


可以直接打开我们编写好的程序，也可以自己拖动功能块编写程序：

先添加点阵、超声波、8\*8点阵

![](media/b1764e7f0f472e36c13014274b56ef25.png)

在事件栏拖出Arduino启动模块

![](media/ac92b717450efcfa2ed71422a9af2f2b.png)

在变量类型栏拖出声明全局变量模块定义distance、distance_R、distance_L三个变量

![](media/70b7e93d71de42c3a7615e932b080ab2.png)

设置舵机初始化为90度

![](media/f2fdc0d81b9b8a92e7ba7b8e778c6592.png)

在点阵栏中拖出初始化点阵和显示心型

![](media/1da5be0f94d7433e1b59c1b251e49405.png)

在控制栏拖出重复执行模块

![](media/4eab7a25262ab92f42f159f2cca7cbb5.png)

将超声波的值赋值给distance

![](media/b7466c2b0a1b248c2af81bf2ce56f0b5.png)

在控制栏拖出如果...否则模块，判断distance是否大于0且小于20

![](media/a17caeaf92b0b5899b9aa61c71cfc0c2.png)

小车停止，延时100ms

![](media/23b212a64d096a7767625d4ed0ea7ac1.png)

舵机转向180度，延时500ms，然后将超声波的值赋值给distance_L,延时100ms

![](media/aa597e63df4efebfac4304fe90448d3a.png)

舵机转向0度，延时500ms，然后将超声波的值赋值给distance_R,延时100ms

![](media/738cf3877116cf92ad50ff42ea6a9767.png)

在控制栏拖出如果...否则模块，判断distance_L是否大于distance_R，如果是则执行左转代码，延时300ms，舵机转回90度，

![](media/fd3bfad3be5fb99b0a9d07f6d5c56c93.png)

如果distance_L不大于distance_R那么执行右转代码，延时300ms，舵机转回90度

![](media/7f815384646afee8df18985e544c8863.png)

如果以上条件都不满足则执行前进代码，点阵显示向前箭头

![](media/24ca8b3d048bf7e0ab53b30085cc7037.png)

完整程序：

![](media/4c31389754c6fef0604463eb4f553398.png)

![](media/1594f64c5efd1702986a04cbd2636697.png)

![](media/392af0ab6bf48d5d9e826dac9adaa0f9.png)

（5）测试结果 

将驱动扩展板堆叠在UNO Plus板上，上传好代码，按照课程接线图接线，将拨码开关拨至ON端后，智能车能够自动避开障碍物行走。



### 第14课 红外遥控智能车

（1）项目介绍： 

前面的学习中我们详细的介绍了智能车上各个传感器、模块、扩展板的使用方法。在这里我们可以再结合前面课程中知识制作一个红外控制智能车。在传感器项目第四课中，我们已经测试出红外遥控器各个按键对应的键值。实验中，我们可以通过代码设置（键值），让对应的按键控制智能车对应的运动状态。

（2）流程图： 

循迹智能车具体逻辑如下表格：

|按键：![](media/b11dc5ffa6cccebc6088e5d557d76daf.png)|键值：FF629D|状态：前进|
|-|-|-|
|按键：![](media/ae8110034aacb083151cfd882ee599ba.png)|键值：FFA857|状态：后退|
|按键：![](media/bce9cba2c6d2465fbcce570ad4210eba.png)|键值：FF22DD|状态：左转|
|按键：![](media/ad907a618af86f30d52986bbbd57ba76.png)|键值：FFC23D|状态：右转|
|按键：![](media/9716a4ed61a4064d2f47a7b73eccaf87.png)|键值：FF02FD|状态：停止|


按照前面思路设计好智能车后，我们就需要按照设计思路开始制作智能车。我们需要设计对应的接线，测试代码，然后接线上传代码，运行，确保智能车能够实现理想中的功能。

（3）接线图：电机+红外接收模块+点阵 

接线注意：由于红外接收传感器输入的数字信号，将红外接收传感器模块用导线连接到电机驱动扩展板上的G、V、A1，A、B两电机分别对应的连接到堆叠在UNO Plus板上的电机驱动扩展板上的接口A和接口B，点阵接IIC（A4、A5）接口，电源接到BAT接口。

![](media/922e29c7d57d030faaf5992938bcb185.png)

（4）实验程序： 

可以直接打开我们编写好的程序，也可以自己通过拖动代码块来编写代码程序，操作步骤如下：

先添加红外接收模块和点阵模块:

![](media/d40356368665a8e476c2c4308e83a474.png)

在事件栏拖出Arduino启动模块

![](media/9da504d3cba575900c8e6c2bef308c71.png)

在红外栏拖出舒适化红外接收模块，设置引脚为A1并通过串口打印出来，然后刷新接收数据。

![](media/fbab45011d859ecd32d38764827df2b7.png)

初始化点阵并显示心型

![](media/f654cd257fdb875b9f8a87e515750938.png)

在控制栏拖出重复执行模块

![](media/6893a6abb13ad4b3cf3b2bbf7cd72f57.png)

在控制栏拖出判断模块，判断是否有接收到红外遥控的数据

![](media/2d0703c18d2932e956dd6f3c80618299.png)

在控制栏拖出判断模块，并判断“读取红外数据”是否等于“16736925”如果是则执行小车前进代码，点阵显示前进箭头

![](media/0342a5ced1818f1645d0b56ca61441b9.png)

在控制栏拖出判断模块，并判断“读取红外数据”是否等于“16754775”如果是则执行小车后退代码，点阵显示后退箭头

![](media/e05e561c47d7873003f8af713517093d.png)

在控制栏拖出判断模块，并判断“读取红外数据”是否等于“16720605”如果是则执行小车左转代码，点阵显示左转箭头（由于左右箭头的代码块是按照点阵面向自己的方向做的，所以左右箭头在指示小车状态的时候刚好相反）

![](media/8a9354e63943c5a7c5dd5e83a0e42729.png)

在控制栏拖出判断模块，并判断“读取红外数据”是否等于“16761405”如果是则执行小车右转代码，点阵显示右转箭头（由于左右箭头的代码块是按照点阵面向自己的方向做的，所以左右箭头在指示小车状态的时候刚好相反）

![](media/648952eaf808f619c53a84bd7872765e.png)

在控制栏拖出判断模块，并判断“读取红外数据”是否等于“16712445”如果是则执行小车停止代码，点阵显示“心型”

![](media/3b128c77c9088f1a5f7bbb29fda2f0be.png)



完整程序

![](media/5a70b01830178d138407eacefb264c9d.png)

![](media/8abaa643b535e1580046bc845677fb1f.png)

![](media/7f057cb9cd614b213433418fc42b5b44.png)

好了，上传程序，红外遥控器对准红外接收器，按下红外遥控器对应按键，看看效果吧！（注意：在上传测试代码前，需要把蓝牙模块取下，否则测试代码会上传失败。需要上传代码成功后，再连接蓝牙模块。）

（5）测试结果： 

将驱动扩展板堆叠在UNO Plus板上，上传好代码，按照接线图接线，将拨码开关拨至ON端后，我们就能用红外遥控控制智能车运动了。

|按键：![](media/b11dc5ffa6cccebc6088e5d557d76daf.png)|键值：FF629D|状态：前进|
|-|-|-|
|按键：![](media/ae8110034aacb083151cfd882ee599ba.png)|键值：FFA857|状态：后退|
|按键：![](media/bce9cba2c6d2465fbcce570ad4210eba.png)|键值：FF22DD|状态：左转|
|按键：![](media/ad907a618af86f30d52986bbbd57ba76.png)|键值：FFC23D|状态：右转|
|按键：![](media/9716a4ed61a4064d2f47a7b73eccaf87.png)|键值：FF02FD|状态：停止|



### 第15课 蓝牙遥控智能车 

（1）项目介绍： 

前面课程中，我们利用红外控制智能车运动，在这课程中我们可以做一个蓝牙控制智能车。既然是控制智能车，那就有一个控制端和被控制端。课程中我们把手机当做控制端（主机），BT-24蓝牙模块（从机）连接的智能车当做被控制端。使用时，我们需要在手机上安装一个APP，然后连接BT-24蓝牙模块，然后我们利用蓝牙APP上各个按钮，控制智能车实现各种运动状态。

（2）流程图： 

先取下蓝牙模块，程序代码上传后，再连接蓝牙模块和打开串口监视器，设置波特率为9600。对准蓝牙模块按下手机APP按钮，我们可以看到APP按钮对应的控制字符，如下图。

![](media/790d75eeecb57da117e2649d4a087eac.png)

经过测试，我们得出了手机APP上各个按钮对应的控制字符和各个按钮对应的功能，这里我们整理了一个表格如下：

|按钮:![](media/b5f4f9dedaac74e6f4b688b055db62b6.png)|功能：配对连接BT24蓝牙模块||
|-|-|-|
|按钮:![](media/523ba772f8a746e4b590b28231a0e32e.png)|功能：进入蓝牙控制界面||
|按钮:![](media/90dea390d6c7439aa89ba974c0823ee7.png)|功能：断开蓝牙连接||
|按钮:![](media/6d9779682575f01441c9dfd99803a6c4.png)|控制字符：按下：F；松开：S|功能：按下，小车前进；松开就停止|
|按钮:![](media/a7d6cc969d5b1cf1c762e0138236fc9d.png)|控制字符：按下：B；松开：S|功能：按下，小车后退；松开就停止|
|按钮:![](media/c77a6bd9c2758c66907ef33431f60aa4.png)|控制字符：按下：L；松开：S|功能：按下，小车左旋转；松开就停止|
|按钮:![](media/f8b0464c48e59b4966df682653f809d3.png)|控制字符：按下：R；松开：S|功能：按下，小车右旋转；松开就停止|
|按钮:![](media/fe16d67488720517263083f7a5ef0ba8.png)|控制字符： 点击发送：S|功能：小车停止，停止所有功能|
|按钮:![](media/264400690bd56590a04ed1767f65fb4a.png)|控制字符：|功能：点击一下开启手机方向感应控制，再点击一下退出方向感应控制|
|按钮:![](media/64d07fc3e4d81f0b55a1a553cea2e7a0.png)|控制字符： 点击发送：U|功能：开启避障功能，点击![](media/b18f031bad095b7ca6c6060e1bc2537a.png)退出|
|按钮:![](media/3759f3cebe4a714ed69c6f86e95abb5b.png)|控制字符： 点击发送：X|功能：开启循线功能，点击![](media/b18f031bad095b7ca6c6060e1bc2537a.png)退出|
|按钮:![](media/bcc82f147073258d9d304961a4c50b8c.png)|控制字符： 点击发送：Y|功能：开启超声波跟随功能，点击![](media/b18f031bad095b7ca6c6060e1bc2537a.png)退出|


（3）接线图：蓝牙+电机+点阵 

接线注意：
蓝牙模块的RXD、TXD、GND、VCC分别对应的接到电机驱动扩展板上的TX、RX、-（GND）、+（VCC），而蓝牙模块的STATE和BRK两引脚不需要接，电源接到BAT接口。

1.  B两电机分别对应的连接到电机驱动扩展板上的接口A和接口B；蓝牙模块的RXD、TXD、GND、VCC分别对应的接到电机驱动扩展板上的TX、RX、-（GND）、+（VCC），而蓝牙模块的STATE和BRK两引脚不需要接，点阵接IIC（A4、A5）接口，电源接到BAT接口。

![](media/fd044131930a28b554cd59589f5786c6.png)

（4）实验代码： 


在事件栏拖出Arduino启动模块

![](media/c7800df722e2941b48169c9bfdfe717d.png)

在串口栏拖出设置串口波特率为9600

![](media/3dece0a3aee5a541ed13fc3b5143b8c3.png)

在变量类型栏拖出声明全局变量，整形，变量名为bluetooth_val，赋值0

![](media/d1e19335208d22ef846dbcdec6d95a64.png)

在点阵栏中拖出初始化点阵并显示 “笑脸”

![](media/8ccef38e3b10457af8c1ea29e894cfda.png)

在控制栏拖出重复执行模块

![](media/3edcdbbed1c4d1b6150c2784f1582b93.png)

在控制栏拖出判断模块，判断可读取字节数大于0

![](media/29eca93f33886da4fd95e16a31ef6a39.png)

将串口读取数字赋给bluetooth_val

![](media/3a63df099fec399b5ab5c6956c02ef17.png)

在控制栏拖出判断语句，判断“Bluetooth_val”是否等于“70”如果是则执行前进代码

![](media/34362db8c1b86a94956892e9e3aec738.png)

在控制栏拖出判断语句，判断“Bluetooth_val”是否等于“66”如果是则执行后退代码

![](media/f65f775ab2f9e39df88058afa84dbf30.png)

在控制栏拖出判断语句，判断“Bluetooth_val”是否等于“76”如果是则执行左转代码

![](media/416c45be29008f14c2e3608ad4d752c9.png)

在控制栏拖出判断语句，判断“Bluetooth_val”是否等于“82”如果是则执行右转代码

![](media/c783ba14da23b4f4e4980380286ccb7f.png)

在控制栏拖出判断语句，判断“Bluetooth_val”是否等于“83”如果是则执行停止代码

![](media/cf2a3dad17e1b1535c8a8f3989e61c9f.png)



完整程序：

![](media/81b99cc9b75b9bd3373439492588ef7e.png)

![](media/51f70a73bc5fc1644cb56c46b53b8195.png)

![](media/2373ba1429ca51f4f46408596261ba24.png)

好了，按住蓝牙APP的前进、后退、左转弯、右转弯、停止、左旋转、右旋转的按钮控制桌面迷你蓝牙智能车分别前进、后退、左转弯、右转弯、停止、左旋转、右旋转的程序代码全编写完了。上传程序，看看效果。（在上传测试代码前，需要把蓝牙模块取下，否则代码会上传失败。需要上传代码成功后，再连接蓝牙模块。）

（5）测试结果： 

将驱动扩展板堆叠在UNO Plus板上，上传好代码，按照接线图接线，将拨码开关拨至ON端后，手机APP连接蓝牙成功后，我们就能用手机APP控制智能车运动了。

按下![](media/6810d318ff5e8a934d52b077ab2bb6bf.png)按钮，小车前进；按下![](media/b5215e50b96b5c830577cfa2c2b1d37e.png)按钮，小车后退；按下![](media/57ec77caa6548877aa00f561202af39e.png)按钮，小车左旋转；按下![](media/4e91a8b6eb33bccb0d57955e77107634.png)按钮，小车右旋转；点击![](media/7f164338dacb4246e062ea184340567f.png)按钮，小车停止；点击一下![](media/39cbc30f9d336c4cfd578b17ed962e33.png)按钮，开启手机方向感应控制，再点击一下![](media/39cbc30f9d336c4cfd578b17ed962e33.png)按钮，退出方向感应控制。



### 第16课 多功能乌龟小车 

（1）项目介绍： 

在前面课程中，我们只是让智能车实现单个功能，那我们能不能把所有功能合在一起呢？能，在这一课程中，我们利用一个代码测试智能车，智能车包含前面课程中讲到的所有功能，我们利用手机蓝牙APP上按钮自动切换各种功能,简单方便。

（2）流程图： 

按照前面思路设计好智能车后，我们就需要按照设计思路开始制作智能车。我们需要设计对应的接线，测试代码，然后接线上传代码，运行，确保智能车能够实现理想中的功能。

（3）接线图： 

接线注意：

循迹模块连接到电机驱动扩展板上P1接口的G、V、D11、D7、D8；

超声波传感器模块的VCC引脚连接至连接到电机驱动扩展板上，V引脚至V，T（Trig）引脚至数字12(S)，E（Echo）引脚至数字13(S)，G引脚至G；

舵机连接到电机驱动扩展板上的接口（G、V、D10），

红外接收传感器模块用导线连接到电机驱动扩展板上的G、V、A1；A、B两电机分别对应的连接到电机驱动扩展板上的接口A和接口B；

LED点阵模块G、V、CDA、SCL引脚分别对应的连接到电机驱动扩展板上的G（GND）、5V、A4、A5（S）；

蓝牙模块的RXD、TXD、GND、VCC分别对应的接到电机驱动扩展板上的TX、RX、-（GND）、+（VCC），而蓝牙模块的STATE和BRK两引脚不需要接，电源接到BAT接口。

![](media/c4bb29826904180e78a383d6d9160b7e.png)

（4）实验程序： 

实验程序较长这里就不做说明了，可以直接打开我们的编写好的程序：




![](media/58e735d856a2e536cb15cfa42694c965.png)

![](media/aea02357038aee1e9868baa0bd71e3e2.png)

![](media/f36e6d75252eb7bda3a0830cc2ecc7e5.png)

![](media/9ac1f1a1c29c48718734115566e3b448.png)

![](media/2093bc3194af9e67bae211b1556a09e8.png)

好了，蓝牙多功能控制智能车的程序都已经编写好了，上传程序，实际操作下看看效果。（在上传程序代码前，需要把蓝牙模块取下，否则代码会上传失败。需要上传代码成功后，再连接蓝牙模块。）

（5）测试结果： 

将驱动扩展板堆叠在UNO Plus板上，上传好代码，按照接线图接线，将拨码开关拨至ON端后，手机APP连接蓝牙成功后，我们就能用手机APP控制智能车运动了。我们可以通过按下对应按钮实现对应功能，通过停止钮来停止功能,点击![](media/8d3717d69d5cf62323c4f2af167fef97.png)会退出APP。

|按钮:![](media/b5f4f9dedaac74e6f4b688b055db62b6.png)|功能：配对连接BT-24蓝牙模块||
|-|-|-|
|按钮:![](media/523ba772f8a746e4b590b28231a0e32e.png)|功能：进入蓝牙控制界面||
|按钮:![](media/90dea390d6c7439aa89ba974c0823ee7.png)|功能：断开蓝牙连接||
|按钮:![](media/6d9779682575f01441c9dfd99803a6c4.png)|控制字符：按下：F；松开：S|功能：按下，小车前进；松开就停止|
|按钮:![](media/a7d6cc969d5b1cf1c762e0138236fc9d.png)|控制字符：按下：B；松开：S|功能：按下，小车后退；松开就停止|
|按钮:![](media/c77a6bd9c2758c66907ef33431f60aa4.png)|控制字符：按下：L；松开：S|功能：按下，小车左旋转；松开就停止|
|按钮:![](media/f8b0464c48e59b4966df682653f809d3.png)|控制字符：按下：R；松开：S|功能：按下，小车右旋转；松开就停止|
|按钮:![](media/fe16d67488720517263083f7a5ef0ba8.png)|控制字符： 点击发送：S|功能：小车停止，停止所有功能|
|按钮:![](media/264400690bd56590a04ed1767f65fb4a.png)|控制字符：|功能：点击一下开启手机方向感应控制，再点击一下退出方向感应控制|
|按钮:![](media/64d07fc3e4d81f0b55a1a553cea2e7a0.png)|控制字符： 点击发送：U|功能：开启避障功能，点击![](media/b18f031bad095b7ca6c6060e1bc2537a.png)退出|
|按钮:![](media/3759f3cebe4a714ed69c6f86e95abb5b.png)|控制字符： 点击发送：X|功能：开启循线功能，点击![](media/b18f031bad095b7ca6c6060e1bc2537a.png)退出|
|按钮:![](media/bcc82f147073258d9d304961a4c50b8c.png)|控制字符： 点击发送：Y|功能：开启超声波跟随功能，点击![](media/b18f031bad095b7ca6c6060e1bc2537a.png)退出|







