凌顺实验室/指南/Arduino 指南/

Arduino Uno 同时控制多路舵机

在这次实验,展示如何同时控制6个舵机,也是Arduino Uno在不使用另外的舵机驱动版的情况下,能控制的最多数量舵机。

值得注意的是,Arduino Uno能连舵机的口是需要PWM的,也就是板子上带~(波浪)的引脚。

舵机比较耗电,Arduino Uno驱动2-3个9克舵机问题不大,但为了让舵机都能稳定运行,需要增加外部电源。本实验使用的是5V舵机,可以直接把外接电源接到Arduino Uno的DC电源口。

然而外接其他电源时,必须搞清楚正负极的接法,在有经验的人的指导下进行,切记不要在不清不楚抱着侥幸心理的情况下进行接线,有可能会发生不可预计的电子伤害。

实验效果

实验中,舵机的运行分别是:
1,全部舵机同时一起从0度的位置转向179度的位置;
2,全部舵机同时一起从180度的位置转向1度的位置;
3,全部舵机同时一起快速转到90度的位置;
4,全部舵机同时一起快速转到180度的位置;
5,全部舵机同时一起快速转到90度的位置;
6,3个舵机转到0度的位置,3个舵机转到180度的位置
7,3个舵机转从0度的位置转到179度的位置,3个舵机转到180度的位置转到1度的位置
8,3个舵机转从180度的位置转到1度的位置,3个舵机转到0度的位置转到179度的位置

具体请观看视频:

元件说明

舵机(基础)
https://lingshunlab.com/book/arduino/arduino-uno-drive-servo

如果没有单独使用过以上元件,建议先分别实现一次。

BOM表

名称 数量
Arduino Uno x1
舵机 x6
5V2A电源 x1
面包板 x1
跳线(杜邦线) 若干

接线方式

Arduino Uno 引脚 <---> 舵机引脚_1
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
3 <-> 信号线(橙色)
Arduino Uno 引脚 <---> 舵机引脚_2
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
5 <-> 信号线(橙色)
Arduino Uno 引脚 <---> 舵机引脚_3
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
6 <-> 信号线(橙色)
Arduino Uno 引脚 <---> 舵机引脚_4
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
9 <-> 信号线(橙色)
Arduino Uno 引脚 <---> 舵机引脚_5
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
10 <-> 信号线(橙色)
Arduino Uno 引脚 <---> 舵机引脚_6
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
11 <-> 信号线(橙色)

程序提点

程序大体和之前的舵机基础篇的实验一样,只是更多的使用了for()循环语句。
for 循环允许您编写一个执行指定次数的循环控制结构。

然而舵机转动到目标位置,是需要时间的,所以大幅度转动的话,需要使用delay()等待一下。

程序实现

// lingshunlab.com

// 加载 舵机 库
#include <Servo.h> 

Servo servo_1; // 创建一个名为 servo_1 的 舵机实例 (名称可随你喜欢命名)
Servo servo_2;
Servo servo_3;
Servo servo_4;
Servo servo_5;
Servo servo_6;

void setup() {
  servo_1.attach(3); // 配置myservo实例的引脚为9
  servo_2.attach(5); 
  servo_3.attach(6);
  servo_4.attach(9);
  servo_5.attach(10);
  servo_6.attach(11);
}

void loop() {
  // 控制所有舵机 从 0度 到 179度 转动
  for(int i = 0; i < 180; i++) {
    servo_1.write(i);
    servo_2.write(i);
    servo_3.write(i);
    servo_4.write(i);
    servo_5.write(i);
    servo_6.write(i);
    delay(10);
  }
  delay(500);

  // 控制所有舵机 从 180度 到 1度 转动
  for(int i = 180; i > 0; i--) {
    servo_1.write(i);
    servo_2.write(i);
    servo_3.write(i);
    servo_4.write(i);
    servo_5.write(i);
    servo_6.write(i);
    delay(10);
  }
  delay(500);

  // 控制所有舵机转动至 90度 的位置
  servo_1.write(90);
  servo_2.write(90);
  servo_3.write(90);
  servo_4.write(90);
  servo_5.write(90);
  servo_6.write(90);
  delay(500);
  
  // 控制所有舵机转动至 180度 的位置
  servo_1.write(180);
  servo_2.write(180);
  servo_3.write(180);
  servo_4.write(180);
  servo_5.write(180);
  servo_6.write(180);
  delay(500);
  
  // 控制所有舵机转动至 90度 的位置
  servo_1.write(90);
  servo_2.write(90);
  servo_3.write(90);
  servo_4.write(90);
  servo_5.write(90);
  servo_6.write(90);
  delay(500);

  // 分别控制部分舵机转动至 0度 或 90度 的位置
  servo_1.write(0);
  servo_2.write(180);
  servo_3.write(0);
  servo_4.write(180);
  servo_5.write(0);
  servo_6.write(180);
  delay(500);

  // 同时分别控制 0度 位置的舵机,转向 179度 的位置
  // 同时分别控制 180度 位置的舵机,转向 1度 的位置
  for(int i = 0; i < 180; i++){
    servo_1.write(0+i);
    servo_2.write(180-i);
    servo_3.write(0+i);
    servo_4.write(180-i);
    servo_5.write(0+i);
    servo_6.write(180-i);
    delay(10);
  }
  delay(500);

  // 同时分别控制 180度 位置的舵机,转向 1度 的位置
  // 同时分别控制 0度 位置的舵机,转向 179度 的位置
  for(int i = 0; i < 180; i++){
    servo_1.write(180-i);
    servo_2.write(0+i);
    servo_3.write(180-i);
    servo_4.write(0+i);
    servo_5.write(180-i);
    servo_6.write(0+i);
    delay(10);
  }
  delay(500);
}