使用包装器和继承时 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);
}
我正在构建一个相当复杂的机器人手臂,所以我写了一个 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);
}