我正在一个学生项目上创建一对机器人,这些机器人使用Arduino(包括Arduino IDE)通过上下移动来显示时间。该项目的一部分包括一个简单的ML AI,它将自动调整机器人的速度,以确保其以正确的速度到达顶部。我已经制作了一个库,以提供执行此任务所需的变量和函数。
在该库的早期版本中(编译得很好),只有一个构造函数使用数组存储数据,因此数组长度始终是特定长度。在下一版本中,由于Arduino IDE不允许使用向量库,因此将构造另一个构造函数以允许在构造时指定数组长度。但是,当尝试使用设置和循环功能编译源代码时,将使用对构造函数的未定义引用错误。忽略无关的代码,我的代码库看起来像
#include "libraries/SpeedCorrector/SpeedCorrector.h"
const uint8_t MAX_HOURS = 12; //12 hour clock
const uint32_t CORRECT_TIME = MAX_HOURS*60*60*1000; //Num of milliseconds in 12 hours
const uint16_t INITIAL_PWM = 300; //dummy initial PWM value for testing
uint32_t climbTime;
uint16_t currentPwm;
uint16_t tempPwm;
bool photoInterruptMet = false;
SpeedCorrector speedCorrector(INITIAL_PWM, CORRECT_TIME);
#ifndef SpeedCorrector_h
#define SpeedCorrector_h
#include "Arduino.h"
class SpeedCorrector {
public:
const static uint8_t MAX_NUM_OF_PWM = 10; //default value
const static uint16_t MOTOR_SLIP_CORRECTION = 10; //default value
SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime);
SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime, uint8_t inMaxNumOfPwm, uint8_t inMotorSlipCorrection);
private:
uint8_t pwmIndex;
uint8_t maxNumOfPwms;
bool correctedPwmsFull;
uint32_t correctTime;
uint8_t motorSlipCorrection;
};
#endif
#include "Arduino.h"
#include "SpeedCorrector.h"
SpeedCorrector::SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime) {
pwmIndex = 0;
maxNumOfPwms = MAX_NUM_OF_PWMS;
uint16_t correctedPwms[maxNumOfPwms];
correctedPwmsFull = false;
correctedPwms[0] = initialPwm;
correctTime = inCorrectTime;
motorSlipCorrection = MOTOR_SLIP_CORRECTION;
}
SpeedCorrector::SpeedCorrector(uint16_t initialPwm, uint32_t inCorrectTime,
uint8_t inMaxNumOfPwms, uint8_t inMotorSlipCorrection) {
pwmIndex = 0;
maxNumOfPwms = inMaxNumOfPwms
uint16_t correctedPwms[maxNumOfPwms];
correctedPwmsFull = false;
correctedPwms[0] = initialPwm;
correctTime = inCorrectTime;
motorSlipCorrection = inMotorSlipCorrection;
}
不幸的是,我不得不在构造函数中声明数组,以允许在构造时指定长度。
我试图注释掉数组,以查看是否收到不同的错误消息,但无济于事。我还将库移到了另一个目录,但出现了no such file or directory
错误,因此它肯定是在检测库。
该错误抱怨主程序中SpeedCorrector的构造,说明
undefined reference to `SpeedCorrector::SpeedCorrector(unsigned int, unsigned long)'
我从https://www.arduino.cc/en/Hacking/LibraryTutorial得到了有关如何制作库的说明
答案 0 :(得分:1)
根据arduino IDE中的“文件/首选项”,默认的SketchBook位置为/home/user_name/Arduino
。
因此,SpeedCorrector.h
和SpeedCorrector.cpp
文件应放置在/home/user_name/Arduino/libraries/SpeedCorrector
中,而不是放在主程序(.ino
)所在的子目录中。
如Juraj在评论中所述,主程序(.ino
)应该使用#include <SpeedCorrector.h>
,而没有头文件的完整路径。