Winkel Probleme - Step Motor 28BYJ-48

Hallo Zusammen, ich bin noch ganz neu hier und wuerde mich freuen, wenn man mir weiter helfen koennte.
Ich bin seit einigen Tagen an mein Code und komme nicht voran. Egal was ich mache, scheint nicht so zu funktionieren, wie ich das möchte.
Ich benutze Arduino Uni und habe diesen mit ein Step Motor (28BYJ-48) verbunden (siehe Bild-Link: 20210218-1314542 — ImgBB ).
Mein Vorhaben ist es, dass sich der Zeiger immer dahin dreht, was eingegeben wurde. Wenn zB. 90 eingegeben wird, soll der Zeiger sich um 90Grad drehen und wenn danach 100 eingeben wird, dann soll der Zeiger auf 100Grad gehen, ohne dazu 100 Grad zu addieren.
ich habe bereits im Code die Schrittzahlen angepasst, dass wenn zb. 45(Grad) eingegeben wird, dass der 45 * 5.68888888889 berechnet, da 1 Grad = 5.68888888889 bei dem Step motor 28BYJ-48 ist.
Gibt es für sowas bereits ein Libary, womit man den Zeiger immer an die eingegebene Gradwert drehen kann? Ich stehe seit einigen Tagen leider im Schlauch und finde keine Lösung.
Mein bisherige Code ist:

#include <Stepper.h> // Include the header file
#include <CustomStepper.h> //vllt andere Lösung?

#define STEPS 28 // change this to the number of steps on your motor

Stepper stepper1(STEPS, 8, 10, 9, 11); // pins 

float val2 = 0.0;
float backToTheRoads = 0.0; 
float stepstogo = 0.0; 
float neueGrad = 0.0;
float oneDegree = 5.68888888889; 
float currentDegree = 0.0;

void setup() {
  Serial.begin(9600);
  stepper1.setSpeed(900);
}

void loop() {
   if (Serial.available()>0){
      val2 = Serial.parseInt(); //Einlesen
      stepstogo = berechneSchritte(val2); //Eingegebene Schritte Berechnung in grad
      platzhalter = stepstogo;
      platzhalter = platzhalter - platzhalter2;
      stepper1.step(platzhalter);  //die Umgerechneten Steps werden ausgeführt
      Serial.println(platzhalter); //fuer debuggen
      platzhalter2 = platzhalter;
    }

}

float berechneSchritte(float x){
 float schritte;
 schritte = x*oneDegree; //Rechnet gradanzahl zu Steps um, da 2048 = 360grad ist
 return schritte;
    }

Oder habe ich das komplett falsch angefangen? sollte ich vllt einen anderen Stepper Motor nehmen, was für so ein Vorhaben eher in Frage kommt? Ich bin für jeden Tipp dankbar.

cr0wey: (siehe Bild-Link:)

Hänge Dein Bild als attachment hier ran - das liegt bei einem bilderhoster, wo es irgendwann verschwindet und kein Mensch weiss, was Du hast.

soll der Zeiger sich um 90Grad drehen und wenn danach 100 eingeben wird, dann soll der Zeiger auf 100Grad gehen, ohne dazu 100 Grad zu addieren.

versuch mal - ungetestet.

void loop() {
  static float lastpos = 0;
  if (Serial.available() > 0) {
    val2 = Serial.parseInt(); //Einlesen
    stepstogo = berechneSchritte(val2);
    stepper1.step(stepstogo-lastpos);  //die Umgerechneten Steps werden ausgeführt
    Serial.print(F("Stepstogo / laststep: "));
    Serial.print(stepstogo); //fuer debuggen
    Serial.print("\t");
    Serial.println(lastpos);
    lastpos = stepstogo;
  }
}

Allerdings würde ich versuchen soweit möglich ohne float auszukommen.

cr0wey: Gibt es für sowas bereits ein Libary, womit man den Zeiger immer an die eingegebene Gradwert drehen kann?

Du könntest es mit meinen MobaTools probieren, die können das. Es sind auch Beispiele dabei, auch für den 28BYJ-48 . Installieren kannst Du die Lib über den Bibliotheksmanager ( MobaTools im Suchfeld eingeben ).

Hallo,

Irgendwo wird das immer Rundungsfehler geben.

Du kannst Ja auch erst mal die theoretische Schrittzahl von 2048 für eine Umdrehung ändern. lass ihn doch einfach mal 10 Umdrehungen in eine Richtung laufen , dann sollte er ja theoretisch wieder so stehen wie am Anfang. Eventuell kommt ja dann 2047 raus die er wirklich hat.

Schau dir mal einen Lib für Stepper an MobaTools oder Accelstepper die können absolute Bewegungen, allerdings muss man halt erst mal refferenzieren ( nullen). Anschliessend gibst Du nur noch die Zielposition an. Die zu fahrenden stepps berechnet die Lib dann.

Eventuell fährst Du auch zu schnell los und er verschluckt sich.

Heinz

In den Technischen Daten dieses Motors findet man verschiedene sich widersprüchliche Daten. Leider haben alle verschiedene Modelle die gleiche Modellnummer. Es gibt ihn sogar als 5 und 12V Version.

Da liest man daß der Motor 32 oder 64 Schritte pro Umdrehung hat. (weiß mal nicht ob beides mal Vollschritte gemeint sind oder einmal Vollschritte und einmal Halbschritte gemeint sind).

Dann liest man daß das Getriebe ein Übersetzungsverhältnis von 1:64,00 bzw 1:63,68395 aber auch 1:16,032 irgendwas hat. zB https://www.kollino.de/arduino/schrittmotor-28byj-48/

Auch habe ich gefunden: approximately 4076 steps per full revolution (in half step mode).

Also mußt Du selbst herausbekommen wieviele Schritte eine Umdrehung sind.

Grüße Uwe

Hallo,

hab mir noch mal deinen Sketch angesehen , der Compiler mag ihn so nicht. Ich hab mal was aus meiner Bastekiste zusammen gebastelt , bei mir läuft das so. Ist nicht schön geht aber. Der Motor den ich habe hat 2048 Imp/Umdr. Das must Du bei der stepper.lib mit angeben und mal für Deinen probieren.

Heinz

#include <Stepper.h>
const int stepUmdr = 2048;
int pos = 0;
int sollpos;

Stepper mystepper(stepUmdr, 2, 4, 3, 5);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  mystepper.setSpeed(10);  // umdr / minute viel mehr schafft der nicht
}

void loop() {
  // put your main code here, to run repeatedly:

  if (Serial.available() > 0) {
    sollpos = Serial.parseInt();    // Eingabe in Grad
    int dummy=Serial.parseInt(); // leerlesen
  
  Serial.println(sollpos);
  }
  int steptoGo = (sollpos - pos) * 2048.0 / 360;
  pos = sollpos;
  mystepper.step(steptoGo);

}

Vielen dank für die Antworten und besonders danke an @Rentner. Nun wird exakt der winkel ausgeführt, was eingegeben wird. Bisher habe ich versucht und jetzt auch mit Hilfe von @Rentner geschafft das Problem zu lösen, aber das mit ein Step Motor/Schrittmotor. Da ich ja neu in der Arduino-Szene bin und mich natuerlich weiterentwickeln möchte, habe ich erfahren, dass Servo-Motoren speziell für Winkel Vorhaben am besten geeignet sind. Ich habe vor 2 Motoren mit eine Platte zu verbinden und die Platte per Eingabe nach Winkel zu Steuern. Wäre nicht so ein Servo Motor für mein Vorhaben eher die Wahl des Motor-Typs? Ich werde als nächstes das ganze mal mit ein Micro-Servo angehen und schauen, ob man die selbe Lösung auch damit hinkriegt und berichte bald wie weit ich gekommen bin :) Vielen dank nochmal für die Antworten.

Modelbauservo machen normalerweise nur ca 180°. Wenn das reicht kannst Du auch Servos nehmen. Achtung 360° Servo sind meist solche die durchdrehen und wo die Ansteuerung nur Drehrichtung und ein bißchen Geschwindigket steuert. Grüße Uwe

Kleines Update meinerseits: Ich habe mich nun für einen Servo entschieden und mein Code mit Hilfe von @Rentner soweit verfeinert/verbessert/angepasst. Ich habe auch festgestellt, dass der “Micro Servo 9g “MS18"gegenüber dem Step Motor 28BYJ-48 einige Vorteile bei mein Vorhaben hat, wie zB. bei Stromausfall, faengt der Servo immer bei 0 an und nicht da wo er aufgehoert hat. Find ich sehr praktisch.
Was mir bisher nicht gefällt ist, dass der Abstand zwischen Wert-Wechsel ca. eine Sekunde dauert. Ich glaube das liegt an der codezeile” int dummy=Serial.parseInt(); // leerlesen”. Gibt es eine Möglichkeit wie man das flexibler gestalten kann?
Mein Code wird in ferne Zukunft durch eine Schnittstelle Bewegungen/Werte erhalten und diese live mit dem Servo ausführen.

cr0wey: ... Vorteile bei mein Vorhaben hat, wie zB. bei Stromausfall, faengt der Servo immer bei 0 an und nicht da wo er aufgehoert hat. Find ich sehr praktisch.

Es gibt auch einen Haufen Anwendungen, in denen ein solches Verhalten fatal wäre. Denk mal an eine Katzenklappe :-)

Was mir bisher nicht gefällt ist, dass der Abstand zwischen Wert-Wechsel ca. eine Sekunde dauert. Ich glaube das liegt an der codezeile" int dummy=Serial.parseInt(); // leerlesen". Gibt es eine Möglichkeit wie man das flexibler gestalten kann?

Zeig doch nochmal den aktuellen Stand. In der IDE Strg-Umschalt-C drücken und dann hier einfach per Strg-V einfügen.

Gruß

Gregor

gregorss: In der IDE Strg-Umschalt-C drücken

Vorher STRG-T. Bitte!

gregorss:
Es gibt auch einen Haufen Anwendungen, in denen ein solches Verhalten fatal wäre. Denk mal an eine Katzenklappe :slight_smile:

Das wäre wirklich fatal ja :smiley: gutes Beispiel.
Wie bereits erwähnt, mein Servo macht nun das was ich haben will, nur die Verzögerung stört mich bei Werteingabe und Zeigerbewegung. Aber gerne poste ich meinen aktuellen Stand, vielleicht gibt es ja noch einen ganz anderen Weg, wie man solche Verzögerungen vermeiden kann :slight_smile:

#include <Servo.h>

Servo myservo;
float sollpos = 0.0;
float beginn = -90.0; //Zeiger beginnt in der Mitte
float pos = 0.0;

void setup() {
  Serial.begin(9600);
  myservo.attach(9);
}

void loop() {
  if (Serial.available() > 0) {
    pos = Serial.parseInt();    // Eingabe
    // pos = 0-pos; // <---------Negieren für Servo(gegenüber) Vorerst Wayne
    float dummy = Serial.parseFloat(); // leerlesen !VERZÖGERUNG! TODO: Alternative!
    Serial.println(pos);    //Eingegebene Wert
  }
  sollpos = pos - beginn;
  myservo.write(sollpos);              // Zeiger Bewegung
}

cr0wey: einen ganz anderen Weg, wie man solche Verzögerungen vermeiden kann :)

    float dummy = Serial.parseFloat(); // leerlesen !VERZÖGERUNG! TODO: Alternative!

Schreib Dir eine Funktion:

void serialClear(){
  while(Serial.available() > 0) {
    char t = Serial.read();
  }
}

Wann nimmer Du die Schnittstelle frei haben willst, schreibst: serialClear(); an Stelle von Deinem .parsefloat().

my_xy_projekt:
Schreib Dir eine Funktion:

void serialClear(){

while(Serial.available() > 0) {
   char t = Serial.read();
 }
}



Wann nimmer Du die Schnittstelle frei haben willst, schreibst:
serialClear(); an Stelle von Deinem .parsefloat().

Perfekt! Danke dir vielmals!
Nun kann ich anfangen mein Vorhaben weiter auszubauen. Es wird noch umfangreicher alles :slight_smile: Ich möchte 5 Motoren (4 Servos, 1 Step Motor) an mein Arduino anschließen und das alles mit Bluethoots (hc-05) ansteuern (wobei ich hoffe, dass das alles nicht am ende mir um den Ohren fliegt :D). Bisher bedanke ich mich bei euch allen herzlich und kann ja bald mal berichten (evtl. auch mit video) wie es soweit ausschaut :slight_smile: