从其他类成员函数arduino调用的类成员函数

问题描述

我正在开发与nema stepper motor接口的arduino驱动程序。我创建了一个课程。我将其命名为Axis。我想为此类为每个电动机创建一个轴对象。但是,我无法从类中调用attachInterrupt中的arduino.h函数。它返回此错误

In member function 'void Axis::setReverseInt()':
paRSStep.cpp:12:77: error: invalid use of non-static member function 'void Axis::revDirection()'
   attachInterrupt(digitalPinToInterrupt(reverseDirPin),revDirection,RISING);
Axis::Axis()
{

}
Axis::~Axis()
{

}

void  Axis::setReverseInt () {
  attachInterrupt(digitalPinToInterrupt(reverseDirPin),RISING);
}
void  Axis::setStopInt () {
  //attachInterrupt(digitalPinToInterrupt(stopPin),stopMotor,RISING);
}
void Axis::revDirection()
{
  dirMode = !dirMode;
}
void Axis::stopMotor()
{
  moveMotor = !moveMotor;
}
void Axis::startMotor()
{
  moveMotor = true;
}
void Axis::moveStep(int pulseRev,byte laps,boolean dir)
{
  digitalWrite(dirPin,dir);
  int totalpulse = pulseRev * laps;
  for (int i = 0; i < totalpulse; i++)
  {
    speedValue = map((analogRead(speedPin)),1023,2000,10);
    digitalWrite(pulsePin,HIGH);
    delayMicroseconds(speedValue);
    digitalWrite(pulsePin,LOW);
    delayMicroseconds(speedValue);
  }
}

解决方法

在为自己正在从事的一个大型项目编写自己的库时,我遇到了类似的问题。在方法内部配置中断时发生在我身上。我发现了一种解决方法,尽管它看起来似乎有些复杂,但却可以解决问题。就我而言,我用它来读取旋转编码器的开关。

我使用的是一个指向ISR处理程序的指针和一个调用它的方法。在设置功能上,您可以调用ISR服务的初始化。

首先,在您的.h文件中声明以下方法(除了您自己的方法之外):

void init();

static void ISRHandler();

void setupISRHandler(uint8_t pin,void (*ISR)(void),int state); // this will configure your ISR

和一个指针:

static Axis *_ISRPointer; // can be declared as private (like in here from the '_' prefix)

然后,在您的.cpp文件中按如下方式使用它:

#include "Axis.h"

Axis *Axis::_ISRPointer = nullptr;

您将在初始化期间使用init方法初始化ISR处理程序:

void Axis::init(){

    setupISRHandler(reverseDirPin,Axis::ISRHandler,RISING);

}

设置方法如下:

void Axis::setupISRHandler(uint8_t pin,void (*ISRFunction)(void),int state){

    attachInterrupt(digitalPinToInterrupt(pin),ISRFunction,state);

}

ISRHandler负责调用ISR例程:

void Axis::ISRHandler(){

    _ISRPointer-> revDirection();

}

void Axis::revDirection(void){

    // Do not forget to disable interrupts
    cli();

    // your routine goes here
    dirMode= !dirMode;

    sei();
}

因此,您将在主.ino文件中执行以下操作:

#include "Axis.h"
#include <whateverotherlibraryyouneed.h>

Axis ax = Axis(); // your new object    

void setup(){

    ax.init();
    ax.startMotor();

}

void loop(){

    if(day == SUNNY){
        ax.moveStep(100,2,CLOCKWISE);
    } else {
        ax.stopMotor();
    }

    ax.someOtherMethodToControlTheMotor(anyArgumentYouWant);

}

我希望我的复杂解决方案对您有帮助

欢呼

博士丹尼尔

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...