如何使用arduino Mega控制伺服电机的速度

时间:2013-03-22 13:35:07

标签: arduino

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

5 个答案:

答案 0 :(得分:0)

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

示例:

Servo s;
s.attach(9);
for(int i=0 ; i<180 ; i++)
{
    s.write(i);
    delay(10); //10 milisecond
}

答案 1 :(得分:0)

如果它们的度数相同,请尝试以下代码。

位于最顶端(不在任何“{}”之间)

#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

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);

您需要更改引脚编号。

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

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);
}

如何使用: 在使用舵机做任何事情之前setup ,但在我告诉您进入设置的部分之后,使用 ClearServos(); 来准备舵机用过的。 (这可能不一定,但我不知道当你使用S1.read而不改变它时会发生什么,如果舵机位于不同的位置,它将解决问题。如果它不会,它可以避免引起问题,但我认为如果可以,你应该使用它。)所有这些都将转向90度。 (可以使用startDegree中的变量void ClearServos更改90度。)

要转动它们,请使用 TurnServos(90); 。 90是你希望它转向的程度。


没有测试过,因为我没有Mega或12个伺服器。如果您发现任何错误,请发表评论,因为这是巨大的。我花了很多时间在这上面,所以我希望我帮忙。 :)

答案 2 :(得分:0)

也许您可以在伺服电机之前将一些电阻串联到伺服电机的VCC引脚上,以降低电压;从而放慢了它。但是,这将使您的伺服系统达到“恒定”的速度。

另一种方法是将晶体管置于伺服VCC连接和基极引脚上的PWM之间以调节电流(调节速度),但如果您不使用多路复用器,则每个伺服需要额外的引脚介于两者之间并且可以使你的设计更复杂一点。

答案 3 :(得分:0)

最接近90-null的delayMicroseconds(值)对于我的游戏中时光倒流装置上的平移和运输,使用机械快门点击器(迷你标准伺服)及时拍摄移动拍摄的360伺服最慢。

答案 4 :(得分:-1)

在伺服库中WriteMicroseconds(...)函数设置伺服速度。

了解更多信息,请click