Schrittmotor mit encoder über arduino motor shield ansteuern

hallo leute,
kann mir jemand einen code nennen damit ich meinen schrittmotor über einen encoder ansteuern kann?
ich benutze ein arduino leonardo mit dem arduino motor shield r3.
den encoder habe ich in pin2 und pin3. das dritte kabel ist in ground. mein motor zuckt nur hin und her und bewegt sich nicht so wie ich das möchte.
wenn jemand die selbe hardware hat würde ich mich sehr über einen fertigen code freuen :slight_smile:

Was bezeichnest Du als Encoder?
Ein Encoder an einen Schrittmotor angeflanscht ist sehr unüblich weil ein Schrittmotor schon per Definition Schritte macht und darum durch die Ansteuerung der Weg definiert ist.
also:
Das Arduino motor schield ist nicht für Schrittmotore geeignet. Es hat ein EX-OR Gatter das die Steuersignale für die Ansteuerung von Gleichstrommotore verarbeitet. Mit dem Schaltbild und manueller ansteuerung ist eine rudimentäre ansteuerung möglich aber ein L298 Treiber kann mehr.

Welchen Schrittmotor hast Du;

Grüße Uwe

Er meint wahrscheinlich eine Drehimpuls/Inkremental-Geber um die Schritte vorzugeben. Deshalb der Anschluss an die externen Interrupts.

Wobei es da meist besser ist den Encoder in einer Timer ISR alle paar ms zu pollen anstatt bei jedem Impuls das Programm zu unterbrechen.

Also dass das Arduino Motor Shield für meinen Schrittmotor geeignet ist weiss ich. Habe diesen code benutzt und es hat funktioniert.

#include <Stepper.h>

int pinPWM_A = 3;
int pinPWM_B = 11;
int pinDir_A = 12;
int pinDir_B = 13;

//360 geteilt durch den Schrittwinkel
int schritte_def = 48;

Stepper motor(schritte_def, pinDir_A, pinDir_B);


void setup()
{ 
 motor.setSpeed(50);
 digitalWrite(pinPWM_A,HIGH);
 digitalWrite(pinPWM_B,HIGH);
}
void loop()
{
motor.step(48);
delay(1000);
motor.step(-48);
delay(1000);
}

Jetzt habe ich bei youtube ein Video gesehen wo jemand mit Hilfe eines mit EasyDrivers und eines Encoders den Schrittmotor manuell steuern kann. Ich dachte mir, dass dies vielleicht auch mit meinem Shield geht. Ob das sinnvoll ist die Schritte manuell über drehen vorzugeben sei mal dahin gestellt.

Hier das Video:

Hier der Code den ich versucht hab:

#include <Encoder.h>

int pinE2 = 2;
int pinE3 = 3;

Encoder myEnc(pinE2, pinE3);

int pinDir = 11;
int pinStep = 12;

void setup()
{
  pinMode(pinDir, OUTPUT);
  pinMode(pinStep, OUTPUT);
}
void loop()
{
  //den Wert einlesen
  int encoderWert = myEnc.read();
  //grösser 0
  if(encoderWert > 0)
  {
    //Motor drehen, Grösse der Schritte und Tempofrei wählbar
    drehen(-100,150);
  }
  //kleiner 0
  else if(encoderWert < 0)
  {
    //Motor drehen, Grösse der Schritte und Tempofrei wählbar
    drehen(100,150);
  }
    delay(5);
    //Wert des Encoders wieder auf 0 stellen
    myEnc.write(0);
    delay(5);

  }
  //Drehfunktion für Schrittmotor
  void drehen(int schritte, int tempo)
  {

   
    if(schritte > 0)
    digitalWrite(pinDir,HIGH);
    else
    digitalWrite(pinDir,LOW);
    
    schritte = abs(schritte);
    
    for(int i=0; i < schritte; i++)
    {
      digitalWrite(pinStep, HIGH);
      delay(tempo);
      digitalWrite(pinStep, LOW);
      delay(tempo);
    }
  }

Ich habe diesen Schrittmotor:
Schrittmotor PSM35BYG104, 1,8°
Kompakter, bipolarer Schrittmotor mit Kugellager und 1,8° Schrittwinkel.

Technische Daten:

Schrittwinkel 1,8° (200 Schritte)
Strangspannung 10,8 V-
Strangwiderstand 27 ?
Strangstrom 0,4 A
Halte-Moment 0,07 Nm
4 Anschlusslitzen
Welle (øxL): 5x18 mm
Motormaße ohne Welle (BxHxT): 35x35x22 mm

Jetzt habe ich bei youtube ein Video gesehen wo jemand mit Hilfe eines mit EasyDrivers und eines Encoders den Schrittmotor manuell steuern kann.

Das ergibt endlich Sinn.

Mit dem Motorsield kannst Du so nur Vollschritte (full Step) wo immer 2 Spule stromdurchflossen sind machen aber keine Halbschritte oder Wave drive machen. Ein L298 könnte alle 3 Ansteuerungsmodi.

Definiere eine Positionsvariable und eine Sollvariable in denen Du die Schritte abspeicherst. Die Sollvariable änderst Du mit dem Encoder. Den Motor bewegst Du um die Differenz von Positionsvariable zu Sollvariable. Bei jedem Schritt des Schrittmotor korrigierst Du die Positionsvariable um den gemachten schritt.

Grüße Uwe

Auf dem Motor Shield ist doch ein L298 verbaut oder?
Ich glaube als Neuling auf dem Gebiet kann ich mit deiner Hilfe wenig anfangen. Auch wenn es sehr nett ist. Wie würde denn der Code aussehen mit diesen Variablen?

Ich habe mir auch mal diese Seite angeschaut wo jemand sich seine eigene Schrittmotorsteuerung zusammen baut.
http://www.strippenstrolch.de/4-0-5-schrittmotortreiber-erkunden.html
Wäre das eine Alternative für mich, wenn ich rein nur Schrittmotoren antreiben möchte? Die Bauteile dafür sind sicherlich nicht sehr teuer.
Sind 12 Volt und 2 Ampere Motoren dafür okay?

Gruß Daniel

MotorShield_R3_Front_450px.jpg

userdan:
Auf dem Motor Shield ist doch ein L298 verbaut oder?
Ich glaube als Neuling auf dem Gebiet kann ich mit deiner Hilfe wenig anfangen. Auch wenn es sehr nett ist. Wie würde denn der Code aussehen mit diesen Variablen?

Es ist schon der gleiche L298 aber diesen Signale werden von einem CD4077 konditioniert.

userdan:
Ich habe mir auch mal diese Seite angeschaut wo jemand sich seine eigene Schrittmotorsteuerung zusammen baut.
Der Strippenstrolch - Schrittmotortreiber erkunden
Wäre das eine Alternative für mich, wenn ich rein nur Schrittmotoren antreiben möchte? Die Bauteile dafür sind sicherlich nicht sehr teuer.
Sind 12 Volt und 2 Ampere Motoren dafür okay?

Gruß Daniel

Mit dem L297 kann man einen Stromsteuerung bauen. Wenn man eine Spannungsansteuerung des Schrittmotors will dann braucht man keinen L297, Das macht die Stepper-Bibliothek. Für eine Stromansteueung ist aber der Motor zu hochohmig/ zu hohe Nennspannung.

Also ein L298 alleine machts.
Grüße Uwe