war erstmal eine allgemeine Frage. Gerne poste ich mein Code.
Es geht einfach darum eine Schrittmotor zu bewegen. Dieser soll dann ein Ikea Rollo bewegen. Dazu verwende ich die Stepper.h lib. Ich habe eine Klasse angefertigt, mit methoden um die position des Motors zu bestimmen.
Mein programm:
#include "mymotor.h"
// number of steps in one revolution of your motor
#define STEPS 2048
//#define STOP 7
// set the speed in rpm
#define MOTOR_RPM 12
void setup()
{
Serial.begin(115200);
//pinMode(STOP,INPUT_PULLUP);
//attachInterrupt(0,intfunktunterbrechung,RISING);
Stepper stepper(STEPS,8, 9,10, 11);
Schrittmotor Motor(stepper,STEPS);
//Motor.kalibrieren(MOTOR_RPM,true);
//Motor.init(20,100,50.0);
//Motor.start(47.425,MOTOR_RPM);
Motor.aktdaten();
Serial.print("\n");
}
void loop()
{
}
Meine headerdatei:
#ifndef _mymotor_H
#define _mymotor_H
#include <Stepper.h>
#include <string.h>
#include "Arduino.h"
extern int intunterbrechung_stop;
void intfunktunterbrechung();
class Schrittmotor
{
private:
//Motor aus der Stepper.h lib einbinden
const Stepper& Motor;
int Stepps_Motor; // Anzahl der Schritte des Motors
int round_speed; // Geschwindigkeit, wieviele umdrehung in der Minute
//Richtungsweisend
int richtung; //Für die richtung in der Stepschleife
bool invertieren; // Richtung invertieren
char *direktion;
//umdrehungsweisend
double soll_umdrehung;
int soll_teilumdrehung;
int ganzeUmdrehung;
double teilUmdrehung;
//positionsweisend
double min_pos;
double max_pos;
double ist_position;
//Zählschelife Schritte
int zaehler; // für die Stepschleife
bool einrichten=false;
void setrichtung(char *direktion);
void umw_to_steps(void);
void aktuellposition(void);
void sollumdreh(double sollpos);
public:
Schrittmotor(void);
Schrittmotor(Stepper Engine,int anzschritte);
void aktdaten(void);
void Motorfahren (bool init=false);
void Init(double minpos,double maxpos,double eingabepos=0);
void kalibrieren(int drehgeschw=6,bool invertieren=false); //Einrichtung der Endpunkte(Endschalter) !!!!
void Start(double sollposition, int drehgeschw);
};
die methode defination:
#include "mymotor.h"
int intunterbrechung_stop=0;
void intfunktunterbrechung()
{
intunterbrechung_stop=1;
}
void Schrittmotor :: setrichtung(char *direktion)
{
int r=0;
this->direktion=direktion;
if(strcmp(direktion,"up")==0)
{
r=1;
if(invertieren==true)
r=-1;
}
else if (strcmp(direktion,"down")==0)
{
r=-1;
if(invertieren==true)
r=1;
}
richtung=r;
Serial.print("Richtung:");
Serial.print(direktion);
Serial.print("\n");
Serial.print("Richtung_r:");
Serial.print(richtung);
Serial.print("\n");
}
void Schrittmotor :: umw_to_steps()
{
ganzeUmdrehung=(int)soll_umdrehung;
teilUmdrehung=(double)(soll_umdrehung-ganzeUmdrehung);
soll_teilumdrehung=(int)(teilUmdrehung*Stepps_Motor);
}
void Schrittmotor :: aktuellposition()
{
if(direktion=="up")
ist_position=ist_position-((double)zaehler/Stepps_Motor);
else if(direktion=="down")
ist_position=ist_position+((double)zaehler/Stepps_Motor);
}
void Schrittmotor :: sollumdreh(double sollpos)
{
int durchlauf=0;
Serial.print("\n");
Serial.print("\n");
do{
if(sollpos>max_pos)
{
Serial.print("Die Sollposition geht über die Endposition hinaus!");
soll_umdrehung=0;
break;
}
if(sollpos<min_pos)
{
Serial.print("Die Sollposition geht über die Endposition hinaus!");
soll_umdrehung=0;
break;
}
if(sollpos>ist_position)
{
soll_umdrehung=sollpos-ist_position;
setrichtung("down");
break;
}
if(sollpos<ist_position)
{
soll_umdrehung=ist_position-sollpos;
setrichtung("up");
break;
}
Serial.print("Schleife");
Serial.print("\n");
}while(durchlauf ==0);
}
Schrittmotor :: Schrittmotor(void)
{
Serial.print("Fehler beim Motor Initaliesierung");
}
Schrittmotor :: Schrittmotor(Stepper Engine,int anzschritte)
{
Motor=Engine;
Stepps_Motor=anzschritte;
}
void Schrittmotor :: aktdaten()
{
Serial.print(ist_position);
Serial.print("\n");
Serial.print(min_pos);
Serial.print("\n");
Serial.print(max_pos);
}
void Schrittmotor :: Motorfahren (bool init=false)
{
Motor.setSpeed(round_speed);
int ii=1; // für die Schleifenverlass bedingung
int schritte=0;
umw_to_steps();
do{
zaehler=0; // Zählerstand wieder auf Null eine umdrehung durchlaufen
if(init==false) // Bei 0 wird bis zu Sollposition gefahren
{
// Volle Umdrehungen und Teil umdrehungen
if(ganzeUmdrehung>=1)
{
schritte=Stepps_Motor;
ganzeUmdrehung--;
}
else if (ganzeUmdrehung==0)
{
schritte=soll_teilumdrehung;
ii=0;
}
} //////
else if(init==true)
{
schritte=Stepps_Motor;
Serial.print("\n");
Serial.print("test");
}
//Motor bewegung
do{
Motor.step(richtung);
if(intunterbrechung_stop==1) //Motor Anhalten Notfall, oder für die init einrichtung!!
{
ii=0;
break;
}
++zaehler;
///Serial.print(zaehler);
//Serial.print("\n");
}while(zaehler<=schritte);
/////////
aktuellposition();
///////////
}while(ii!=0);
}
void Schrittmotor :: Init(double minpos,double maxpos,double eingabepos=0)
{
min_pos=minpos;
max_pos=maxpos;
ist_position=eingabepos;
Serial.print("\n");
Serial.print("Einagebe INIT");
Serial.print("\n");
}
void Schrittmotor :: kalibrieren(int drehgeschw=6,bool invertieren=false) //Einrichtung der Endpunkte(Endschalter) !!!!
{
einrichten=true;
min_pos=0;
max_pos=0;
ist_position=0;
round_speed=drehgeschw;
this->invertieren=invertieren; //Motor dreht rechtsherum bei false, für programm richtung up
Serial.print("\n");
Serial.print("Richtungs entscheidung");
Serial.print("\n");
Serial.print("Motor soll in richtung Oberen Anschlag fahren");
Serial.print("\n");
setrichtung("up");
Motorfahren(einrichten);
min_pos=0;
ist_position=0;
delay(4000); //Noch millis ändern
intunterbrechung_stop=0;
setrichtung("down");
Motorfahren(einrichten);
intunterbrechung_stop=0;
max_pos=ist_position;
einrichten=false;
}
void Schrittmotor :: Start(double sollposition, int drehgeschw)
{
round_speed=drehgeschw;
sollumdreh(sollposition);
Serial.print("\n");
Serial.print(soll_umdrehung);
Serial.print("\n");
Motorfahren();
}
Die Fehler :
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: In member function 'void Schrittmotor::aktuellposition()':
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:62:20: warning: comparison with string literal results in unspecified behaviour [-Waddress]
if(direktion=="up")
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:64:25: warning: comparison with string literal results in unspecified behaviour [-Waddress]
else if(direktion=="down")
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: In member function 'void Schrittmotor::sollumdreh(double)':
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:96:38: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
setrichtung("down");
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:103:39: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
setrichtung("up");
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: In constructor 'Schrittmotor::Schrittmotor()':
mymotor.cpp:116:3: error: uninitialized reference member 'Schrittmotor::Motor' [-fpermissive]
Schrittmotor :: Schrittmotor(void)
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: In constructor 'Schrittmotor::Schrittmotor(Stepper, int)':
mymotor.cpp:121:2: error: uninitialized reference member 'Schrittmotor::Motor' [-fpermissive]
Schrittmotor :: Schrittmotor(Stepper Engine,int anzschritte)
^
mymotor.cpp:124:14: error: passing 'const Stepper' as 'this' argument of 'Stepper& Stepper::operator=(const Stepper&)' discards qualifiers [-fpermissive]
Motor=Engine;
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: At global scope:
mymotor.cpp:142:51: error: default argument given for parameter 1 of 'void Schrittmotor::Motorfahren(bool)' [-fpermissive]
void Schrittmotor :: Motorfahren (bool init=false)
^
In file included from C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:1:0:
mymotor.h:70:23: error: after previous specification in 'void Schrittmotor::Motorfahren(bool)' [-fpermissive]
void Motorfahren (bool init=false);
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: In member function 'void Schrittmotor::Motorfahren(bool)':
mymotor.cpp:144:33: error: passing 'const Stepper' as 'this' argument of 'void Stepper::setSpeed(long int)' discards qualifiers [-fpermissive]
Motor.setSpeed(round_speed);
^
mymotor.cpp:181:47: error: passing 'const Stepper' as 'this' argument of 'void Stepper::step(int)' discards qualifiers [-fpermissive]
Motor.step(richtung);
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: At global scope:
mymotor.cpp:205:75: error: default argument given for parameter 3 of 'void Schrittmotor::Init(double, double, double)' [-fpermissive]
void Schrittmotor :: Init(double minpos,double maxpos,double eingabepos=0)
^
In file included from C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:1:0:
mymotor.h:72:23: error: after previous specification in 'void Schrittmotor::Init(double, double, double)' [-fpermissive]
void Init(double minpos,double maxpos,double eingabepos=0);
^
mymotor.cpp:218:74: error: default argument given for parameter 1 of 'void Schrittmotor::kalibrieren(int, bool)' [-fpermissive]
void Schrittmotor :: kalibrieren(int drehgeschw=6,bool invertieren=false) //Einrichtung der Endpunkte(Endschalter) !!!!
^
In file included from C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:1:0:
mymotor.h:74:23: error: after previous specification in 'void Schrittmotor::kalibrieren(int, bool)' [-fpermissive]
void kalibrieren(int drehgeschw=6,bool invertieren=false); //Einrichtung der Endpunkte(Endschalter) !!!!
^
mymotor.cpp:218:74: error: default argument given for parameter 2 of 'void Schrittmotor::kalibrieren(int, bool)' [-fpermissive]
void Schrittmotor :: kalibrieren(int drehgeschw=6,bool invertieren=false) //Einrichtung der Endpunkte(Endschalter) !!!!
^
In file included from C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:1:0:
mymotor.h:74:23: error: after previous specification in 'void Schrittmotor::kalibrieren(int, bool)' [-fpermissive]
void kalibrieren(int drehgeschw=6,bool invertieren=false); //Einrichtung der Endpunkte(Endschalter) !!!!
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp: In member function 'void Schrittmotor::kalibrieren(int, bool)':
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:234:23: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
setrichtung("up");
^
C:\Users\Tobias\AppData\Local\Temp\arduino_build_37258\sketch\mymotor.cpp:245:22: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
setrichtung("down");
^
Bibliothek Stepper in Version 1.1.3 im Ordner: C:\Program Files (x86)\Arduino\libraries\Stepper wird verwendet
exit status 1
uninitialized reference member 'Schrittmotor::Motor' [-fpermissive]