使用包装器和继承时 Arduino 伺服器不工作

Arduino servo not working when using wrapper and inheritance

我正在构建一个相当复杂的机器人手臂,所以我写了一个 class 具有继承性来控制不同的伺服系统而无需编写太多代码。 classes 如下所示(省略了一些内容):

在servoPart.h中:

#include <Servo.h>

#ifndef SERVO_PART_H
#define SERVO_PART_H

 class ServoPart {
 protected:
      virtual void doJob() = 0;
 private:
      Servo servo;
 public:
      ServoPart(int pin, int minPWM, int maxPWM) {
           servo.attach(pin, minPWM, maxPWM);
      };

      void setAngle(int angle) {
           servo.write(angle);
      };

      int getPosition() {
          return servo.read();
      };
 }
#endif

并且在 base.h 中:

#include "servoPart.h"

#ifndef BASE_H
#define BASE_H

class Base : public ServoPart {
private:
    void doJob() {/* implementation */};
public:
    Base(int pin, int stepsize = 5) : ServoPart(pin, 771, 2193) {
    };
};
#endif

在main.cpp中:

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

#define SERVO_BASE 9

Base base(SERVO_BASE);

void setup() {
    Serial.begin(9600);
    delay(500);
    base.setAngle(80);
    Serial.println(base.getPosition());    // <-- prints 80
    delay(500);
    base.setAngle(110);
    Serial.println(base.getPosition());    // <-- prints 110
}

void loop() {

}

伺服似乎设置为80/110,但是没有任何动作。如果我在 main.cpp 中创建伺服对象并在那里使用 servo.write(),伺服会移动,这意味着问题不是伺服或 connection/circuit。难不成是我初始化base的方式有问题?在设置函数之前使用 Base base(SERVO_BASE)

找到解决方法here:在构造函数中调用servo.attach()时,变量初始化的顺序乱了。创建要在 setup() 中调用的 init() 函数可以解决此问题。

我想我会澄清的。 在 C++ 中,如果您没有指定的构造函数,成员将调用其默认构造函数。

如果没有下面的代码

ServoPart(int pin, int minPWM, int maxPWM) {
           servo.attach(pin, minPWM, maxPWM);
      }

相当于

ServoPart():servo() {}

缺少的步骤是 Servo 的默认构造函数。 允许您使用构造函数的解决方案是

ServoPart(int pin, int minPWM, int maxPWM):servo() {
           servo.attach(pin, minPWM, maxPWM);
      }