跳转至

Servo-library-Arduino

Servo.h库是一个功能强大且易于使用的、用于通过 Arduino 控制舵机的库。它能让你只需发送合适的脉宽信号,就能控制标准型、连续旋转型以及其他基于脉宽调制(PWM)的各类舵机电机。

Servo.h库的特性:

  1. 控制多个舵机:该库支持在多数 Arduino 开发板(如 Uno、Nano)上控制多达 12 个舵机,在 Arduino Mega 开发板上则可控制多达 48 个舵机。
  2. 简单的应用程序接口(API):它提供了易于使用的函数,用于连接、写入位置以及断开舵机。
  3. 脉宽调制(PWM)控制:它能生成 PWM 信号来控制所连接舵机的角度或速度。
  4. 支持模拟和数字舵机:可适用于模拟舵机和数字舵机。

基本功能:

Servo.h库通过发送 PWM 信号来控制舵机的位置或速度。脉冲的宽度决定了标准舵机的位置,或者连续旋转舵机的速度与方向。

安装 Servo 库:

Servo.h库包含在默认的 Arduino 集成开发环境(IDE)中,所以无需额外安装。不过,你仍然可以在代码中使用以下代码行手动将其包含进来:

#include <Servo.h>

Servo.h的关键函数:

  1. attach(pin);
    • 将一个舵机对象连接到指定引脚。
    • 示例:myServo.attach(9);—— 这会将舵机连接到 9 号引脚。
  2. write(angle);
    • 将舵机移动到指定角度(针对标准舵机)或者控制其速度和方向(针对连续旋转舵机)。
    • 示例:myServo.write(90);—— 将舵机移动到 90°。
  3. writeMicroseconds(pulseWidth);
    • 通过以微秒为单位指定脉冲宽度,可实现更精确的控制。
    • 示例:myServo.writeMicroseconds(1500);—— 发送一个 1500 微秒的脉冲。
  4. read();
    • 返回舵机上次写入的角度。
    • 示例:int angle = myServo.read();
  5. attached();
    • 如果舵机当前已连接到某个引脚,则返回true
    • 示例:if (myServo.attached()) { // 舵机已连接 }
  6. detach();
    • 将舵机对象从引脚上断开,停止控制。
    • 示例:myServo.detach();

PWM 如何作用于舵机:

Arduino 会生成一个由高脉冲和低脉冲组成的 PWM 信号。高脉冲的持续时间决定了舵机的位置:

  • 对于大多数舵机:
    • 大约1 毫秒(1000 微秒)*的脉冲宽度对应*
    • 大约1.5 毫秒(1500 微秒)*的脉冲宽度对应*90°
    • 大约2 毫秒(2000 微秒)*的脉冲宽度对应*180°

示例代码:控制单个舵机

以下是一个使用Servo.h库来控制标准位置型舵机、使其移动到不同角度的简单示例:

#include <Servo.h>  // 包含Servo库

Servo myServo;  // 创建一个舵机对象

void setup() {
  myServo.attach(9);  // 将舵机连接到9号引脚
}

void loop() {
  myServo.write(0);    // 移动到0度
  delay(1000);         // 等待1秒钟

  myServo.write(90);   // 移动到90度
  delay(1000);         // 等待1秒钟

  myServo.write(180);  // 移动到180度
  delay(1000);         // 等待1秒钟
}

在这个示例中:

  • 舵机被连接到9 号引脚
  • 舵机依次移动到90°*和*180°,每次移动之间有1 秒钟的延迟

连续旋转舵机示例

以下是一个使用Servo.h库控制连续旋转舵机的示例:

#include <Servo.h>

Servo myServo;  // 创建一个舵机对象

void setup() {
  myServo.attach(9);  // 将舵机连接到9号引脚
}

void loop() {
  myServo.write(0);    // 朝一个方向全速旋转
  delay(1000);         // 运行1秒钟

  myServo.write(90);   // 停止舵机
  delay(1000);         // 停止1秒钟

  myServo.write(180);  // 朝相反方向全速旋转
  delay(1000);         // 运行1秒钟
}

在这个示例中:

  • 0会发送对应朝一个方向全速旋转的脉冲宽度。
  • 90可使电机停止。
  • 180会发送对应朝相反方向全速旋转的脉冲。

多个舵机示例

要控制多个舵机,只需声明额外的Servo对象,并对每个对象使用相同的函数即可:

#include <Servo.h>

Servo servo1;  // 第一个舵机
Servo servo2;  // 第二个舵机

void setup() {
  servo1.attach(9);  // 将第一个舵机连接到9号引脚
  servo2.attach(10); // 将第二个舵机连接到10号引脚
}

void loop() {
  servo1.write(90);  // 将第一个舵机移动到90度
  servo2.write(45);  // 将第二个舵机移动到45度
  delay(1000);       // 等待1秒钟
}

为舵机供电

虽然 Arduino 能够控制舵机,但它通常无法为舵机提供足够的电力,特别是对于高扭矩舵机或者控制多个舵机时更是如此。你应当使用外部电源为舵机供电(例如,根据舵机的规格使用 5 伏或 6 伏电源),并将外部电源和 Arduino 的 ** 接地(GND)** 连接在一起,以确保正常运行。

总结:

  • Servo.h库能让你使用 Arduino 轻松控制舵机。
  • 它在多数 Arduino 开发板上支持多达 12 个舵机,在 Mega 开发板上支持 48 个舵机。
  • 该库提供了用于连接写入断开以及读取舵机的函数。
  • PWM信号控制着舵机的角度或速度。
  • 为多个或高扭矩舵机使用外部电源供电,以避免 Arduino 过载。