如何使两个伺服机构向相反方向移动?

时间:2017-02-22 03:31:06

标签: arduino-uno robotics servo

我正在尝试使用 Arduino 为项目制作一个肌肉系统模型,但为了实现这一点,我需要 bicep 三头肌< / em>向相反方向移动。

我目前正在尝试使用电位计并试图让两个servos向相反的方向移动,但不知怎的,代码似乎没有像我预期的那样工作,因为它们继续向同一个方向移动

我的电源是我的笔记本电脑,我还没有使用过电池组。至于具体问题,舵机没有响应电位器而只是抖动

#include <Servo.h>

Servo Bicep;
Servo Tricep;
Servo Extensor;
Servo Flexor;

int pos = 0;
int biceppin = 3;
const int triceppin = 4;
const int extensorpin = 5;
const int flexorpin = 6;
int potpin = 8;
int potval = 0;
int potval2;

void setup() {
  Bicep.attach(biceppin);
  Tricep.attach(triceppin);
  Extensor.attach(extensorpin);
  Flexor.attach(flexorpin);
 }

void loop() {
 potval = analogRead(potpin);
 potval = map(potval, 0, 1023, 0, 180);
 potval2 = 180 - potval;
 Bicep.write(potval);  
 Tricep.write(potval2);
 delay(15);
}
  • 你能告诉我代码有什么问题吗?
  • 是否有更有效的方法来执行相同的任务?

2 个答案:

答案 0 :(得分:2)

您设置了potpin = 8,但analogRead()仅适用于模拟输入 A0-A5,并且在大多数主板上都包含已标记的 Arduino Uno 板,引脚8数字引脚

  

relevant quote:

     

[...]你不能使用analogRead()来读取数字引脚。数字引脚不能表现为模拟,因为它没有连接到ADC(模数转换器)。

您可以使用https://www.arduino.cc/en/Reference/AnalogRead

的示例对此进行测试

答案 1 :(得分:1)

我认为那里存在不止一个问题。

假设程序是正确的(可能不是这种情况,因为正如在@BOC的回答中所解释的那样,在Arduino Uno板中使用引脚8作为模拟输入时,该引脚只是数字的),如果伺服器抖动,作为问题根源的好候选者是你的电源:

  1. 您说(在评论中,但我编辑了您的问题以指明这一点,因为它很重要)您的电源是您的笔记本电脑。大多数USB端口限制为500 mA。

  2. 虽然您没有解释有关您的特定伺服系统及其规格的任何信息,但大多数都使用至少250 mA(例如,Futaba S3003)。但是低成本/低质量的伺服系统通常需要更多,以及更大的伺服系统。但即使你的伺服电机每个都使用250 mA(最好的情况),你也在为你的Arduino Uno电路板供电(他的线性稳压器效率不高),因此你达到USB的极限港口。根据我自己的经验,大多数(非迷你型)舵机的确不会超过250毫安。

  3. 可能的解决方案

    作为一项快速测试,如果您缺乏良好的电源,我会做以下工作,当您在项目中混合代码和电子设备时,这通常是一个很好的做法:

    1. 只连接一个伺服器(让我们说二头肌),加上电位器。
    2. 运行程序并测试伺服的动作。
    3. 如果有效,请断开伺服并连接另一个。
    4. 跑步和测试,特别指示。
    5. 如果它们仍然抖动,请尝试使用更好的电源的一个配置伺服。 注意:大多数伺服电机需要4.8V作为输入电压,因此不要超过该电压,因为它可能会损坏它们或显着缩短它们的使用寿命
    6. 如果您对电位器本身有疑问,您也可以尝试不带电位器的一个伺服配置,只需在servo.write()方法中硬编码值;像这样的东西:

      void loop() {
       delay(500);
       Bicep.write(50);  
       delay(500);
       Bicep.write(100);  
      }
      
    7. 这样可以将任何潜在的问题减少到仅限软件的问题,因为根据您的描述,现在还不清楚您是否面临电子配置问题或软件错误。