首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用arduino Mega实现伺服电机的速度控制

如何用arduino Mega实现伺服电机的速度控制
EN

Stack Overflow用户
提问于 2013-03-22 21:35:07
回答 5查看 21.4K关注 0票数 0

我正在做一个项目,在这个项目中我需要改变伺服电机的速度。我使用的硬件是Arduino Mega 2560板,我使用Servo.h库来控制伺服。伺服从0度旋转到180度。我在项目中使用12个伺服电机,并必须同时控制它们。有什么办法吗?

EN

回答 5

Stack Overflow用户

发布于 2013-03-22 21:40:30

可以在while或for循环中使用delay()函数

示例:

代码语言:javascript
复制
Servo s;
s.attach(9);
for(int i=0 ; i<180 ; i++)
{
    s.write(i);
    delay(10); //10 milisecond
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-26 07:38:34

如果它们都是相同的学位,请尝试下面的代码。

在最上面的(而不是在任何“{}”之间)

代码语言:javascript
复制
#include <Servo.h> 
Servo S1;
Servo S2;
Servo S3;
Servo S4;
Servo S5;
Servo S6;
Servo S7;
Servo S8;
Servo S9;
Servo S10;
Servo S11;
Servo S12;

将此放入 Setup

代码语言:javascript
复制
S1.attach(1);
S2.attach(2);
S3.attach(3);
S4.attach(4);
S5.attach(5);
S6.attach(6);
S7.attach(7);
S8.attach(8);
S9.attach(9);
S10.attach(10);
S11.attach(11);
S12.attach(12);

您需要更改pin号。

只是把它放在任何地方(而不是在任何“{}”之间)

代码语言:javascript
复制
void TurnServos(int toDegree){
  servosAt = S1.read;
  if(servosAt == toDegree){

  }
  if(servosAt > toDegree){
    while(S1.read > toDegree){
      int currentToDegree = S1.read - 1;
      S1.write(currentToDegree);
      S2.write(currentToDegree);
      S3.write(currentToDegree);
      S4.write(currentToDegree);
      S5.write(currentToDegree);
      S6.write(currentToDegree);
      S7.write(currentToDegree);
      S8.write(currentToDegree);
      S9.write(currentToDegree);
      S10.write(currentToDegree);
      S11.write(currentToDegree);
      S12.write(currentToDegree);
      delay(10);         //Adjust this to make it faster or slower.
    }
  }
  if(servosAt < toDegree){
    while(S1.read < toDegree){
      int currentToDegree = S1.read + 1;
      S1.write(currentToDegree);
      S2.write(currentToDegree);
      S3.write(currentToDegree);
      S4.write(currentToDegree);
      S5.write(currentToDegree);
      S6.write(currentToDegree);
      S7.write(currentToDegree);
      S8.write(currentToDegree);
      S9.write(currentToDegree);
      S10.write(currentToDegree);
      S11.write(currentToDegree);
      S12.write(currentToDegree);
      delay(10);         //Adjust this to make it faster or slower.
    }
  }
}
void ClearServos(){
  int startDegree = 90;   //Change this number to anything you want.
  S1.write(startDegree);
  S2.write(startDegree);
  S3.write(startDegree);
  S4.write(startDegree);
  S5.write(startDegree);
  S6.write(startDegree);
  S7.write(startDegree);
  S8.write(startDegree);
  S9.write(startDegree);
  S10.write(startDegree);
  S11.write(startDegree);
  S12.write(startDegree);
}

如何使用这个: In setup 在你对伺服系统做任何事情之前,但是在我告诉你放入setup的部分之后,使用ClearServos();来准备要使用的伺服系统。(这可能不是必须的,但我不知道当你使用S1.read而不改变它时会发生什么,如果伺服在不同的位置,它会解决问题。如果它不会引起问题,它是可以避免的,但我认为如果可以的话,您应该使用它。)它们都会转到90度。(可以使用void ClearServos中的变量startDegree更改90度。)

要转换它们,请使用TurnServos(90);.90度是你想要它转到的度。

我没有测试这个,因为我没有Mega或12个伺服系统。如果你注意到任何错误,请评论,因为这是巨大的。我花了很多时间在这上面,所以我希望我能帮上忙。:)

票数 0
EN

Stack Overflow用户

发布于 2013-12-02 03:47:27

也许你可以在你的伺服电机之前,将一些电阻串联到你的伺服电机的VCC引脚上,以降低其电压,从而减慢它的速度。然而,这将导致您的伺服是“恒定”的速度。

另一种选择是在伺服VCC连接之间放置一个晶体管,并在基脚上设置PWM来调节电流(以调节速度),但如果您在两者之间不使用多路复用器,则每个伺服需要额外的引脚;而且可能会使您的设计稍微复杂一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15571707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档