1

我正在尝试创建一个控制两个伺服系统的新类。我的代码编译得很好。但是,当我运行它时,伺服系统只是一直转向一个方向。这似乎发生在我尝试实例化类时(在构造函数中,我将类中的伺服器连接到引脚)。

在我班级的头文件中,我有 [更新]

#ifndef ServoController_h
#define ServoController_h

#include "Arduino.h"
#include <Servo.h>

class ServoController
{
    public:
        ServoController(int rotateServoPin, int elevateServoPin);
        void rotate(int degrees);
        void elevate(int degrees);
    private:
        Servo rotateServo;
        Servo elevateServo;
        int elevationAngle;
        int azimuthAngle;
};

#endif

到目前为止我的课程的代码:

#include "Arduino.h"
#include "ServoController.h"

ServoController::ServoController(int rotateServoPin, int elevateServoPin)
{
    azimuthAngle = 0;
    elevationAngle = 0;
    elevateServo.attach(elevateServoPin);
    rotateServo.attach(rotateServoPin);
}


void ServoController::rotate(int degrees)
{
    //TO DO
    rotateServo.write(degrees); 
}


void ServoController::elevate(int degrees)
{
    //TO DO
    elevateServo.write(degrees);    
}

最后,到目前为止我的 arduino 草图只是:

#include <ServoController.h>
#include <Servo.h>

ServoController sc(2 , 3);

void setup()
{

}

void loop()
{
}  

我很确定我使用的电路很好,因为如果我不使用我的课程,而直接在我的 arduino 文件中使用伺服库,伺服系统会正确移动。

任何想法为什么会发生这种情况?

[更新]

我实际上得到了这个工作。在我的构造函数中,我删除了将伺服系统连接到引脚的线路。相反,我在我的类中添加了另一种方法来执行附件。

ServoController::ServoController(int rotateServoPin, int elevateServoPin)
{
    azimuthAngle = 0;
    elevationAngle = 0;
//  elevateServo.attach(elevateServoPin);
//  rotateServo.attach(rotateServoPin);
}


void ServoController::attachPins(int rotateServoPin, int elevateServoPin)
{
    azimuthAngle = 0;
    elevationAngle = 0;
    elevateServo.attach(elevateServoPin);
    rotateServo.attach(rotateServoPin);

}

然后我在我的草图的 setup() 函数中调用它:

void setup()
{
  sc.attachPins(2,3);

}

似乎如果我将伺服器附加到 setup() 函数之外,就会出现问题。

[更新 7 月 27 日晚上 9:13]

用另一个测试验证了一些东西:

我创建了一个新草图,在 setup() 之前附加了一个伺服:

#include <Servo.h>

Servo servo0;
servo0.attach(2);

void setup()
{

}


void loop() // this function runs repeatedly after setup() finishes
{
  servo0.write(90);
  delay(2000);  
  servo0.write(135);
  delay(2000);
  servo0.write(45);
  delay(2000);
}

当我尝试编译时,Arduino 抛出一个错误:

“testservotest:4:错误:预期的构造函数,析构函数,或'。'之前的类型转换 令牌”

所以出现了错误,但是从一个类调用attach方法的时候没有抛出

非常感谢

4

2 回答 2

0

调用servo0.attach()需要在设置例程中:

#include <Servo.h>

Servo servo0;

void setup(){
    servo0.attach(2);
}

正如您在 attachServo 例程中发现的那样。您不需要额外的例程,只需在设置中调用附加方法即可。

于 2013-08-26T23:11:31.320 回答
0

如果您希望在类中使用它,则必须在类中有一个方法来进行引脚分配,并在setup()(一次分配)或loop()(程序执行期间的动态分配)中调用此方法。

当使用库作为用于管理伺服输出的计时器时,无法在全局变量的构造函数中完成引脚分配Servo.h,这些计时器在创建对象和执行时间之间损坏setup()

于 2015-01-05T17:24:06.463 回答