ich programmiere gerade meinen arduino, und benutze dafür die
accelstepper library. die hat einen konstruktor, der wie folgt ausschaut:
/// Alternate Constructor which will call your own functions for forward and backward steps.
/// You can have multiple simultaneous steppers, all moving
/// at different speeds and accelerations, provided you call their run()
/// functions at frequent enough intervals. Current Position is set to 0, target
/// position is set to 0. MaxSpeed and Acceleration default to 1.0.
/// Any motor initialization should happen before hand, no pins are used or initialized.
/// \param[in] forward void-returning procedure that will make a forward step
/// \param[in] backward void-returning procedure that will make a backward step
AccelStepper(void (*forward)(), void (*backward)());
der wird so aufgerufen:
AccelStepper stepper1(forwardstep1, backwardstep1);
wobei die beiden parameter folgende funktionen sind:
// you can change these to SINGLE or DOUBLE or INTERLEAVE or MICROSTEP!
// wrappers for the first motor!
void forwardstep1() {
AFstepper1->onestep(FORWARD, stepType1);
}
void backwardstep1() {
AFstepper1->onestep(BACKWARD, stepType1);
}
das funktioniert auch wunderbar, solange alles in dem main sketch liegt. jetzt habe ich mir eine klasse gebaut:
.h file
//Filter Wheel
#ifndef FILTERWHEEL_H_INCLUDED
#define FILTERWHEEL_H_INCLUDED
#endif
#include "Device.h"
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include <AccelStepper.h>
#define IICADDRESS 0x60
class FilterWheel : public Device
{
public:
//blabla
FilterWheel();
private:
//Adafruit Motor Shield object
Adafruit_MotorShield AFMS;
//Adafruit Stepper Motor object
Adafruit_StepperMotor *AFstepper;
//AccelStepper wrapper
AccelStepper stepper;
void forwardstep();
void backwardstep();
float gearRatio;
int numberOfFilters;
uint8_t stepType;
};
.cpp file:
//Filter Wheel
#include "FilterWheel.h"
//constructor
FilterWheel::FilterWheel()
{
Adafruit_MotorShield AFMS (IICADDRESS);
Adafruit_StepperMotor *AFstepper = AFMS.getStepper(200, 1); //M1 M2
AccelStepper stepper(forwardstep, backwardstep);
}
//make 1 step forward
void FilterWheel::forwardstep() {
AFstepper->onestep(FORWARD, stepType);
}
//make 1 step backward
void FilterWheel::backwardstep() {
AFstepper->onestep(BACKWARD, stepType);
}
in der .cpp file, zeile 10 wirft mit der compiler folgende fehlermeldung (egal ob die beiden funktionen public oder private sind):
FilterWheel.cpp:In constructor 'FilterWheel::FilterWheel()'
FilterWheel.cpp:10: error: no matching function for call to 'AccelStepper::AccelStepper(<unresolved overloaded function type>, <unresolved overloaded function type>)'
AccelStepper.h:AccelStepper(void (*)(), void (*)())
AccelStepper.h:AccelStepper(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, bool)
AccelStepper.h:AccelStepper(const AccelStepper&)
Error compiling
weis jemand wie ich das problem lösen kann? wenn ich die zeile auskommentiere kompiliert der code problemlos.
ersetze ich die zeile durch
AccelStepper stepper(&forwardstep, &backwardstep);
gehts auch nicht:
FilterWheel.cpp:In constructor 'FilterWheel::FilterWheel()'
FilterWheel.cpp:10: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&FilterWheel::forwardstep'
FilterWheel.cpp:10: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say '&FilterWheel::backwardstep'
FilterWheel.cpp:10: error: no matching function for call to 'AccelStepper::AccelStepper(void (FilterWheel::*)(), void (FilterWheel::*)())'
AccelStepper.h:AccelStepper(void (*)(), void (*)())
AccelStepper.h:AccelStepper(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, bool)
AccelStepper.h:AccelStepper(const AccelStepper&)
Error compiling
die klasse Device ist eine leere klasse, hat (noch) keine funktionen oder variablen.
bin für jede hilfe dankbar