### 4.3.5 舵机模块

#### 4.3.5.1 简介

本教程将为您详细介绍舵机模块的使用方法和应用技巧。舵机是一种能够精确控制角度的电机，广泛应用于机器人、遥控模型和自动化设备中。教程内容包括舵机的工作原理、引脚功能、电路连接方法以及如何通过微控制器（如ESP32）控制舵机的转动角度。您将学习如何编写代码来实现舵机的精确位置控制、平滑运动以及多舵机协同工作。无论您是电子初学者还是有经验的开发者，本教程都将帮助您掌握舵机模块的应用，为您的项目增添灵活的机械控制功能。

#### 4.3.5.2 元件知识

![Img](../media/servo.png)

**控制原理**：舵机的转动的角度是通过调节PWM（脉冲宽度调制）信号的占空比来实现的，标准PWM（脉冲宽度调制）信号的周期固定为20ms（50Hz)，理论上脉宽分布应在1ms到2ms 之间，但是，事实上脉宽可由0.5ms 到2.5ms 之间，脉宽和舵机的转角0°～180°相对应。有一点值得注意的地方，由于舵机牌子不同，对于同一信号，不同牌子的舵机旋转的角度也会有所不同。

**引脚介绍：**

![j119](../media/j119.png)

**GND：** 一个接地的引脚，棕色

**VCC：** 一个连接到+5V电源的引脚，红色

**S：** 信号端的引脚，PWM信号控制，橙色

**内部结构图：**

![Img](../media/cou61.png)

- 信号线：接收来自微控制器的控制信号；

- 电位器：可以测量输出轴的位置量，属于整个舵机机构的反馈部分；

- 内部控制器：处理来自外部控制的信号，驱动电机以及处理反馈的位置信号，是整个伺服机构的核心；

- 直流电机：作为执行机构，输出多少转速，转矩，位置；

- 传动机构/舵机系统：该机构根据一定传动比，将电机输出的行程缩放到最终输出的角度上。

**驱动舵机：**

通过向舵机的信号信号线发送PWM信号来控制舵机的输出量，**PWM脉冲的占空比直接决定了输出轴的位置。**

**例如（这里以180°舵机为例）：**

- 当我们向180°舵机发送脉冲宽度为1.5毫秒（ms）的信号时，舵机的输出轴将移至中间位置（90度）；

- 脉冲宽度为`0.5ms`时，舵机的输出轴将移至最小的位置（0度）；

- 脉冲宽度为`2.5ms`时，舵机的输出轴将移至最大的位置（180度）。

![img](../media/cou62.png)

舵机的周期通常为20毫秒，希望以`50Hz`的频率产生脉冲，但是许多伺服器在40至200 Hz的范围内也都能正常工作。

**注:** 不同类型和品牌的舵机之间最大位置和最小位置的角度可能会不同。许多舵机仅旋转约170度(或者只有90度)，但宽度为1.5ms的伺服脉冲通常会将伺服设置为中间位置(通常是指定全范围的一半)。

#### 4.3.5.3 接线图

- **舵机的黄色线连接到io26**

⚠️ **特别注意：智慧农场已经组装好了，这里不需要把舵机拆下来又重新组装和接线，这里再次提供接线图，是为了方便您编写代码！**

![Img](../media/couj61.png)

#### 4.3.5.4 实验代码

⚠️ **特别注意：** 上传代码前要添加库文件，库文件存放在`Arduino_库文件`文件夹中名为`ESP32Servo.zip`。

代码文件在`Arduino_代码`文件夹中，代码文件为`4_3_5_Servo`，如下图所示：

![Img](../media/couj05.png)

鼠标双击`4_3_5_Servo.ino`即可在Arduino IDE中打开。

```c++
/*
 * 文件名 : Servo
 * 功能   : 舵机转动
 * 编译IDE：ARDUINO 2.3.6
 * 作者   : https://www.keyesrobot.cn/
*/

#include <ESP32Servo.h>  //需要导入ESP32开发板的舵机库

Servo myservo;  // 创建舵机对象来控制舵机,在ESP32上可以创建16个舵机对象
                
int pos = 0;    // 定义变量存储舵机位置
// ESP32上推荐的PWM GPIO引脚包括2、4、12-19、21-23、25-27、32-33

int servoPin = 26;
                
void setup() {
  myservo.attach(servoPin);   // 将引脚26上的舵机连接到舵机对象上
  myservo.write(180);
  delay(1000);
}

void loop() {
  for (pos = 180; pos >= 80; pos -= 1) { // 从180度到80度
    myservo.write(pos);              // 告诉舵机到变量“pos”的位置
    delay(15);                       // 每次等待15ms让舵机到达对应的位置
  }
  for (pos = 80; pos <= 180; pos += 1) { // 从80度到180度
    // 每次15度
    myservo.write(pos);              //告诉舵机到变量“pos”的位置
    delay(15);                       // 每次等待15ms让舵机到达对应的位置
  }
}
```
#### 4.3.5.5 实验结果

按照接线图接好线，外接电源，选择好正确的开发板板型（ESP32 Dev Module）和 适当的串口端口（COMxx），然后单击按钮![Img](../media/cou0.png)上传代码。上传代码成功后可以看到饲料盒在慢慢打开，慢慢关闭，实现可控制的。  

**注意：SG90舵机是180度，在套件中的饲料盒较小，SG90舵机只需旋转100度，就能完全关闭饲料盒。**

- 80度：完全打开。
- 120度：打开一半。
- 180度：关闭。

![Img](../media/cou63.gif)

⚠️ **注意：请勿将手指伸入到饲料盒中，谨防夹伤！请勿将其他物体堵住饲料盒盖，以免弄坏舵机。**