搜索代码

第92课:控制多个伺服电机,每个配有电位器 | Arduino 逐步课程

第92课:控制多个伺服电机,每个配有电位器 | Arduino 逐步课程

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

这个设置非常多功能。以下是一些您可以使用它的实用方法:

  • 机器人技术:控制相机云台的平移和俯仰,或小型机器人的基座和臂关节。
  • 动画机械人:通过独立控制木偶或动画角色的头部和眼睛,创造逼真的动作。
  • 模型控制:为遥控车辆或模型飞机构建一个自定义控制器,以精确调整襟翼和副翼。
  • 自动化:为太阳跟踪器或多轴定位夹具创建手动覆盖站。

所需硬件

  • Arduino Uno(或任何兼容板)
  • 2个伺服电机(这里使用的是标准180度伺服电机)
  • 2个电位器(10kΩ是常见选择)
  • 面包板和跳线
  • 外部5V电源(推荐用于多个舵机)

接线指南

该项目比单伺服设置需要更多的布线,主要是因为您需要将电源和接地分配到多个组件。关键是使用面包板的电源轨来创建一个公共的5V和GND总线。布线图对这个构建至关重要。

Two_or_more_Servo_pot_bb

让我们来分析一下连接,如视频中所解释的(在视频的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] 现场演示与调试

图像

Multiple servo, one pot: Main setup
Multiple Servo one pot.: Main setup
Multiple servo, one pot: Main setup, top view
Multiple Servo one pot.: Main setup top view
Multiple servo one-pot: Creating extra 5V from an Arduino on a breadboard
Multiple Servo one pot.: Creating extra 5V from Arduino on breadboard
SG90 Mini Servo Motor
SG90 Mini Servo Motor
Two_or_more_Servo_pot_bb
Two_or_more_Servo_pot_bb
sg90_servo
sg90_servo
888-Lesson 92: Controlling Multiple servo motors
语言: C++
/*
 * 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

|||您可能需要的东西

资源与参考

尚无可用资源。

文件📁

其他文件