一、舵机简介

舵机是一种位置(角度)伺服的驱动器,也叫伺服马达。主要由外壳、电路板、无核心马达、齿轮与位置检测器构成。

二、硬件准备

  • Arduino开发板:如Uno R3开发板 。
  • 舵机 :常见舵机外接三根线,一般棕色为接地线,红色为电源正极线,橙色为信号线,但不同品牌颜色可能有别。
  • 配套USB数据线 :用于开发板与电脑连接。

三、硬件连接

以Uno R3开发板为例,舵机红色线接开发板5V引脚,棕色线接开发板GND引脚,橙色信号线接开发板数字引脚(如数字引脚9 ,可按需选择)。若控制多个舵机,因Arduino驱动能力有限,需外接电源和专用舵机控制板。

四、软件编程

  1. 使用Servo库控制舵机(推荐)
    • 引入库:在Arduino IDE中新建Sketch(草图)后,在代码开头添加 #include <Servo.h> 引入舵机控制库。
    • 定义Servo对象:在全局变量区域使用 Servo myservo; 定义一个Servo对象(这里名为 myservo ,名字可自定义 ),用于控制舵机。
    • 设置舵机接口:在 setup() 函数中,使用 myservo.attach(9); (这里数字9是舵机信号线连接的开发板引脚,需与实际连接对应 )将定义的Servo对象与具体引脚关联。
    • 控制舵机角度:在 loop() 函数或其他函数中,使用 myservo.write(角度值); 控制舵机旋转角度,角度值范围通常0° - 180° ,如 myservo.write(90); 让舵机转到90° 。还可结合延时函数 delay(时间值); ,如 delay(1000); (单位毫秒 ),让舵机在该角度保持一段时间。完整示例代码如下:
#include <Servo.h>
Servo myservo; 
void setup() {
  myservo.attach(9); 
}
void loop() {
  myservo.write(0); 
  delay(1000); 
  myservo.write(180); 
  delay(1000); 
}

此代码让舵机在0°和180°间交替转动,每次转动后保持1秒。

五、程序上传与测试

  • 在Arduino IDE中,连接好开发板,设置好对应的端口号和开发板类型。
  • 点击“上传”按钮,将编写好的程序下载到Arduino开发板中。
  • 观察舵机是否按程序设定要求转动,若未正常工作,检查硬件连接是否正确、程序代码是否有误 。

六、进阶应用

  • 读取传感器数据控制舵机:如连接电位器、红外传感器等,根据传感器返回数值动态调整舵机角度。例如连接电位器到模拟引脚,读取电位器数值并映射到舵机角度范围来控制舵机转动。
  • 多个舵机协同控制:使用舵机控制板和外接电源,编写程序让多个舵机配合完成复杂动作,如制作机械臂等。

2 条评论

  • @ 2025-5-26 18:53:58

    下面为你提供一个使用电位器控制舵机摆动的Arduino教程,包含详细的硬件连接、代码实现和工作原理说明:

    项目目标

    通过旋转电位器(模拟旋钮),实时控制舵机在0°~180°范围内摆动,实现简单的手动角度调节。

    所需硬件

    1. Arduino开发板(如Uno)
    2. 舵机(SG90等小型舵机)
    3. 10kΩ电位器(或其他阻值)
    4. 杜邦线若干
    5. 面包板(可选,方便连线)

    硬件连接

    Arduino 电位器 说明
    5V VCC(中间脚) 为电位器供电
    GND GND(侧边脚) 接地
    A0(模拟输入) 信号脚(另一侧边脚) 读取电位器的模拟值
    Arduino 舵机 说明
    5V 红色线(电源) 为舵机供电(小型舵机可直接用Arduino 5V)
    GND 棕色线(接地) 接地
    D9(数字输出) 橙色线(信号) 控制舵机角度的PWM信号

    电路原理图

             5V ────┬───────────┬─── 5V(舵机)
                    │           │
                    ▼           ▼
             ┌───────┐      ┌───────┐
             │电位器  │      │舵机   │
             │       │      │       │
             │  ┌─┐  │      │  ┌─┐  │
             └──┴─┴──┘      └──┴─┴──┘
                │ ▲             │ ▲
                │ │             │ │
                │ └─────────────┘ │
                ▼                 ▼
             GND(电位器)      GND(舵机)
             │                 │
             └─────────────────┘
                    GND
    

    代码实现

    #include <Servo.h>  // 引入舵机控制库
    
    Servo myServo;     // 创建舵机对象
    const int POT_PIN = A0;  // 电位器连接的模拟引脚
    const int SERVO_PIN = 9;  // 舵机信号连接的数字引脚
    
    void setup() {
      myServo.attach(SERVO_PIN);  // 初始化舵机引脚
      Serial.begin(9600);  // 初始化串口通信(用于调试)
    }
    
    void loop() {
      // 读取电位器的值(0~1023)
      int potValue = analogRead(POT_PIN);
      
      // 将电位器的值映射到舵机角度(0°~180°)
      int angle = map(potValue, 0, 1023, 0, 180);
      
      // 设置舵机角度
      myServo.write(angle);
      
      // 打印调试信息(可选)
      Serial.print("电位器值: ");
      Serial.print(potValue);
      Serial.print(" -> 舵机角度: ");
      Serial.println(angle);
      
      delay(20);  // 短暂延时,稳定信号
    }
    

    代码解释

    1. 引入库#include <Servo.h>
      舵机控制需要使用Arduino的Servo库。

    2. 初始化设置

      • Servo myServo;:创建舵机对象。
      • analogRead(POT_PIN):读取电位器输入的模拟值(范围0~1023)。
      • myServo.attach(SERVO_PIN):将舵机连接到指定引脚。
    3. 映射数值

      • map(potValue, 0, 1023, 0, 180)
        将电位器的0~1023范围线性映射到舵机的0°~180°范围。
        例如:电位器旋转到最左侧(0)→ 舵机0°;
        电位器旋转到最右侧(1023)→ 舵机180°。
    4. 控制舵机

      • myServo.write(angle):根据映射后的角度值控制舵机转动。

    工作原理

    1. 电位器的工作原理
      电位器是一种可变电阻,通过旋转旋钮改变电阻值。
      Arduino通过模拟引脚(A0~A5)读取电位器的电压值,转换为0~1023的数字值。

    2. 舵机的控制原理
      舵机通过PWM(脉冲宽度调制)信号控制角度。 Servo库会自动处理PWM信号的生成,你只需设置角度值即可。

    注意事项

    1. 供电问题
      • 小型舵机(如SG90)可直接由Arduino 5V供电。
      • 大型舵机需外接电源(如5V稳压电源),避免Arduino过载。

    扩展应用

    1. 制作简易机械臂:使用多个电位器和舵机,控制机械臂的多个关节。
    2. 自动跟随系统:结合红外传感器或超声波传感器,让舵机带动传感器自动追踪目标。

    通过这个项目,你可以掌握Arduino模拟输入和舵机控制的基本方法,为更复杂的机器人项目打下基础!

    • @ 2025-5-26 18:50:18

      使用Arduino Servo库

      Arduino提供了一个内置的Servo库,简化了对舵机的控制过程,不需要手动计算和生成PWM信号。

      以下是一些基本操作:

      基本步骤:

      包含库文件:在代码顶部加入#include <Servo.h>。

      创建Servo对象:使用Servo myServo;声明一个Servo类型的变量。

      连接舵机:使用myServo.attach(pinNumber);将舵机连接到指定的数字引脚上。

      设置角度:通过myServo.write(angle);设置舵机的目标角度,参数angle的范围一般是0到180度。

      示例代码:

      #include <Servo.h>
      
      Servo myServo;  // 创建Servo对象
      int servoPin = 9;
      
      void setup() {
        myServo.attach(servoPin);  // 将舵机连接到9号引脚
      }
      
      void loop() {
        for (int i = 0; i <= 180; i++) {  // 从0度到180度循环
          myServo.write(i);
          delay(15);  // 等待15毫秒使动作平滑
        }
        for (int i = 180; i >= 0; i--) {  // 从180度回到0度
          myServo.write(i);
          delay(15);
        }
      }
      
      • 1