第92课:控制多个伺服电机,每个配有电位器 | Arduino 逐步课程
在这个项目中,您将学习如何使用 Arduino Uno 和两个电位器构建一个独立的多通道伺服控制器。与一个伺服电机跟随一个旋钮不同,本指南将向您展示如何为每个伺服电机提供独立的模拟输入,使您能够独立且同时控制两个至六个伺服电机。这是任何需要精确手动控制多个运动部件的项目的基本构建模块。

这个设置非常多功能。以下是一些您可以使用它的实用方法:
- 机器人技术:控制相机云台的平移和俯仰,或小型机器人的基座和臂关节。
- 动画机械人:通过独立控制木偶或动画角色的头部和眼睛,创造逼真的动作。
- 模型控制:为遥控车辆或模型飞机构建一个自定义控制器,以精确调整襟翼和副翼。
- 自动化:为太阳跟踪器或多轴定位夹具创建手动覆盖站。
所需硬件
- Arduino Uno(或任何兼容板)
- 2个伺服电机(这里使用的是标准180度伺服电机)
- 2个电位器(10kΩ是常见选择)
- 面包板和跳线
- 外部5V电源(推荐用于多个舵机)
接线指南
该项目比单伺服设置需要更多的布线,主要是因为您需要将电源和接地分配到多个组件。关键是使用面包板的电源轨来创建一个公共的5V和GND总线。布线图对这个构建至关重要。

让我们来分析一下连接,如视频中所解释的(在视频的02:23处)。首先,设置电源轨:连接Arduino的5V将其固定到面包板的正极轨道上,和GND接到负极轨道。这使您可以轻松为所有组件提供电源。
电位计:每个电位器都充当电压分压器。将每个电位器的右脚连接到5V轨道和左侧插销到GND轨道。中间的引脚是“刮水器”,提供可变电压。将第一个电位器的中间引脚连接到模拟输入A0和第二个的中间插销到A1(视频中在03:22)。
伺服电机:每个伺服电机有三根线。将深色线(通常是黑色或棕色)连接到GND轨道。将中间的电线(通常是红色)连接到5伏轨道。最后,将信号线(通常是橙色或黄色)连接到Arduino上的PWM启用引脚。第一个伺服电机的信号线连接到引脚3,第二个伺服的信号线接到引脚5(视频中的04:01)。请记住,您必须使用支持PWM的引脚(在Uno上用波浪线“~”标记)来控制伺服器。
代码解释
该代码基于Arduino IDE中的标准“旋钮”示例,但经过修改以处理两个伺服电机。逻辑很简单:读取电位器的模拟值,将其映射到一个角度,并指令伺服电机移动到该角度。代码顶部的配置部分是您进行所有调整的地方。
这是用户可配置的部分,用于定义引脚并创建伺服对象:
#include <Servo.h>
//**** servo 1 settings
Servo servo1;
const int servo1PotPin = A0;
const int servo1Pin = 3;// Must use PWM enabled pin
int servo1Value;
//**** servo 1 settings END
//**** servo 2 settings
Servo servo2;
const int servo2PotPin = A1;
const int servo2Pin = 5;// Must use PWM enabled pin
int servo2Value;
//**** servo 1 settings END
这是配置的核心。要添加一个第三个伺服器,您需要复制“伺服器 2 设置”块,将所有的“2”改为“3”,分配一个新的模拟引脚(例如,A2) 和一个新的 PWM 引脚(例如,9). TheServo这个类内置于Arduino IDE中,因此不需要额外的库。
在setup()函数,theservo.attach(pin)命令告诉Arduino每个舵机的信号线连接到哪个引脚。您必须为每个使用的舵机有一行。
void setup() {
//Robojax.com multiple servo
servo1.attach(servo1Pin);
servo2.attach(servo2Pin);
}
在这loop(), 代码读取电位器值,将其映射到 0-180 度范围,并将该角度写入舵机。delay(5)在最后是一个调节参数。如视频中所示,将此值从 15 毫秒降至 5 毫秒使伺服运动更加平滑,并消除了振动(视频在 12:00)。
现场项目演示
一旦您将电路连接好并上传了代码,演示将立即进行。当您给Arduino供电时,每个伺服电机将移动到其相应电位器当前设置所决定的位置。当您旋转旋钮时,伺服电机将平滑地跟随运动。视频演示了两个伺服电机完全独立操作,允许复杂的同时运动。如果您注意到任何抖动或震动,调整delay()循环中的值是第一件要尝试的事情。
章节
- [00:00] 介绍和项目概述
- 理解伺服电机
- [02:23] 两个伺服电机和电位器的接线图
- [04:15] 详细接线说明
- [06:49] 代码说明:配置和设置
- [09:15] 代码说明:控制逻辑和映射
- [11:15] 现场演示与调试
/*
* Control two or more servo motors
* using potentiometers.
* Modified by Ahmad Shamshiri on Oct 17, 2019 at 20:13
* in Ajax, Ontario, Canada . www.Robojax.com
* This code on robojax https://robojax.com/RJT766
*
* Original code from Arduino IDE: File->Examples->Servo->knob
*
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
* Get this code and other Arduino codes from Robojax.com
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Servo.h>
//**** servo 1 settings
Servo servo1;
const int servo1PotPin =A0;
const int servo1Pin = 3;// Must use PWM enabled pin
int servo1Value;
//**** servo 1 settings END
//**** servo 2 settings
Servo servo2;
const int servo2PotPin =A1;
const int servo2Pin = 5;// Must use PWM enabled pin
int servo2Value;
//**** servo 1 settings END
void setup() {
//Robojax.com multiple servo
servo1.attach(servo1Pin);
servo2.attach(servo2Pin);
}
void loop() {
//Robojax.com multiple servo
servo1Value = analogRead(servo1PotPin);
servo1Value = map(servo1Value, 0, 1023, 0, 180);
servo1.write(servo1Value);
servo2Value = analogRead(servo2PotPin);
servo2Value = map(servo2Value, 0, 1023, 0, 180);
servo2.write(servo2Value);
delay(5);
//Robojax.com multiple servo
}// loop end
|||您可能需要的东西
-
亚马逊
-
亚马逊
-
易趣
-
全球速卖通从AliExpress购买SG90伺服电机180或360。s.click.aliexpress.com
资源与参考
尚无可用资源。
文件📁
其他文件
-
SG90 Seroo 电机数据表
robojax-servo-SG90_datasheet.pdf0.12 MB