Go Down

Topic: Ein Objekt aus der Klasse Stepper (von Stepper.h) erstellen funktioniert nicht  (Read 136 times) previous topic - next topic

Patrick_123

So die ganze Nacht durchgemacht und nichts auf die Reihe gebracht.. so macht programmieren Spaß :D

Naja komm einfach nicht mehr weiter. Arduino unterstützt soweit ich verstanden habe objektorientiertes Programmieren (c++). Nun da ich mehrere Schrittmotoren gleichzeitig betreiben möchte habe ich mir gedacht, ich mach mir die mthread.h Lib zu nutze und schreib eine eigene Schrittmotor Klasse die davon erbt so dass jeder Schrittmotor seine eigene loop hat in der er läuft. Das mit den Thread funktioniert wunderbar doch leider funktioniert das erstellen von Objekten aus der Klasse Stepper überhaupt nicht :( Sobald ich im Konstruktor meiner Klasse mit new Steppe(...) ein Objekt aus der Klasse Stepper erstellen möchte wird die Kompilierung ohne konkrete Fehlerausgabe abgebrochen :(
Hab einiges versucht und nix hat geholfen: hier mal den momentanen Code:

Schrittmotor.h
Code: [Select]

#include <mthread.h>
#include <Stepper\src\Stepper.h>

class Schrittmotor : public Thread{

public:
//Schrittmotor();
Schrittmotor(int motorId, unsigned char motorSchritteFuerEineUmdrehung_Intern, float getriebeUmsetzung, unsigned char pin_IN1, unsigned char pin_IN2, unsigned char pin_IN3, unsigned char pin_IN4);
~Schrittmotor();
void motorDrehen(char richtung, short umdrehungenProMinute, float umdrehungen);
void init(int motorId, unsigned char motorSchritteFuerEineUmdrehung_Intern, float getriebeUmsetzung, unsigned char pin_IN1, unsigned char pin_IN2, unsigned char pin_IN3, unsigned char pin_IN4);

protected:
bool loop();
private:
unsigned char motorId, motorSchritteFuerEineUmdrehung_Intern, pin_IN1, pin_IN2, pin_IN3, pin_IN4;
float  motorSchritteFuerEineUmdrehung_Extern;
Stepper *schrittmotor;

};


Schrittmotor.cpp
Code: [Select]

#include "Schrittmotor.h"

Schrittmotor::Schrittmotor(int motorId, unsigned char motorSchritteFuerEineUmdrehung_Intern, float getriebeUmsetzung, unsigned char pin_IN1, unsigned char pin_IN2, unsigned char pin_IN3, unsigned char pin_IN4)
{
this->motorSchritteFuerEineUmdrehung_Extern = 32 / getriebeUmsetzung;
this->motorSchritteFuerEineUmdrehung_Intern = motorSchritteFuerEineUmdrehung_Intern;
this->schrittmotor = new Stepper((int)motorSchritteFuerEineUmdrehung_Intern, (int)pin_IN1, (int)pin_IN3, (int)pin_IN2, (int)pin_IN4); //Sequence 1-3-2-4

}

void Schrittmotor::motorDrehen(char richtung, short umdrehungenProMinute, float umdrehungen){

}

bool Schrittmotor::loop(){

if (kill_flag)
return false;
motorDrehen(1, 10, 1); //für späteren test
this->pause();
return true;
}

Schrittmotor::~Schrittmotor(){

//delete schrittmotor;

}


Sobald dieser Aufruf getätigt wird "this->schrittmotor = new Stepper(..);" ist aus und vorbei...
dann bekomme ich den mir nichts aussagenden Fehler (benutze IDE VS2013 mit dem Plugin VisualMicro):
"Schrittmotor.cpp.o:In function `Schrittmotor::init(int, unsigned char, float, unsigned char, unsigned char, unsigned char, unsigned char)'
Schrittmotor.cpp:Stepper(int, int, int, int, int)'
collect2*:error: ld returned 1 exit status
Error creating .elf"

Folgendes nennenswerte wurde schon versucht:
 -Da angeblich der Konstruktor nicht geeignet ist zum initialisieren von Attributen habe ich es über eine init() Methode versucht. Resultat selber Fehler nur dass er nun in der init() methode entsteht.
- Statt mit "new" ein Objekt aus Stepper zu erstellen habe ichs mit "this->schrittmotor = Stepper(..);" versucht. Daraufhin wurde ein Standartkonstruktor in Stepper.h erwartet den ich kurzerhand einfach mal hinzugefügt habe. Resultat: funktioniert auch nicht.
- weitere Änderungen waren ebenfalls erfolglos nur sind die weniger interessant wodurch ich sie gar nicht mehr erst nennen werde.

Extern (nicht im Konstruktor) mit "new" ein Objekt aus Stepper zu erstellen hat funktioniert.
-> Stepper* stepper1 = new Stepper(32, 6, 10, 9, 11);

Ich bin ratlos O_o




Serenifly

Das Compilieren funktioniert. Der Fehler kommt vom Linker.

Bei mir geht das aber in einfacherer Version:
Code: [Select]

#include "Stepper.h"

class MyClass
{

public:
  MyClass();
  ~MyClass();

  Stepper* stepper;
};



Code: [Select]

#include "MyClass.h"

MyClass::MyClass()
{
   stepper = new Stepper(100, 5, 6, 7, 8);
}


MyClass::~MyClass()
{
   delete stepper;
}


Code: [Select]

MyClass myobject;

void loop()
{
   myobject.stepper->setSpeed(100);
}


Ich hatte zwar Problem Stepper.h zu finden. Da kam aber der "no such file or directory" Fehler. Habe die zwei Dateien dann einfach mal ins Projektverzeichnis geschmissen

jurs

Hab einiges versucht und nix hat geholfen: hier mal den momentanen Code:
Hast Du auch in Deinen Hauptsketch alle include-Dateien eingebunden, die von Deinen Klassen verwendet werden?

Wenn Dein "Schrittmotor.h" als includes "mthread.h" und "Stepper.h" benötigt, dann reicht es nicht, diese nur in Deiner selbstgeschriebenen Klasse zu inkludieren, sondern auch in Deinem Hauptsketch müssen die includes allesamt mit drinstehen, also im .ino Sketch:

Code: [Select]

#include <mthread.h>
#include <Stepper.h>
#include <Schrittmotor.h>


Sonst kompiliert das nicht.

Patrick_123

Aha genau das hab ich nicht gemacht :S
Habe nicht alles in die .ino Datei included... nachdem ich es nun da auch eingebunden habe funktionierts endlich :)

ABER: Nun ist eine mysteriöse Eigenschaft auftaucht:
-> benutze ich in der .ino //#include <Stepper.h> dann kommt kein Kompilierfehler mehr und es funktioniert
-> benutze ich stattdessen in der .ino //#include <Stepper\src\Stepper.h> so kommt wieder mein alter Kompilierfehler. Der Kompilierfehler scheint übrigens laut Arduino IDE folgendes zu bedeuten: "Multithread_Test.ino:2:33: fatal error: Stepper\src\Stepper.h: No such file or directory"

Mein VisualMicro kann den wohl nicht erkennen und schmeißt mir die paar nichtssagenden Errorzeilen aus die ich oben gepostet habe.

Warum gibt es "Stepper\src\Stepper.h" für die .ino datei nicht? Habe in Ordner nachgeschaut und sie existiert.
In meiner eigenen Lib (in Schrittmotor.h) lässt sich der #include <Stepper\src\Stepper.h> benutzen aber eben in der .ino nicht!?

Serenifly

Das vergesse ich auch immer wieder, obwohl es mir eigentlich bekannt ist :s

Da will einem die IDE gutes tun und Sachen automatisch erledigen, aber sie versaut da durch auch Dinge und verhält sich damit anders als Standard C++. Die automatische Erzeugung der Funktionsprototypen macht da bei manchen Dingen wie templates und Default Parametern auch Ärger.

Go Up