Kugelbahn-Maschine

Hallo zusammen, ich bin auch wiedermal hier. :wink:

Für mein neues "Gebilde" brauch ich wiedermal einen Schrittmotor. Im letzten Projekt (Akkorduhr. Akkorduhr) hatte ich unter anderem diesen Schrittmotor verwendet: SY35ST26-0604A. Ich hatte ihn mit 12V betrieben. Im Datenblatt steht Voltage/phase: 3.24
Da ich den gleichen Schrittmotor verwenden möchte frag ich mich, das ist demnach die Spannung pro Spule und dann sind die 12V Spannung in Ordnung, oder?
Danke für euer Feedback und schöne Ostern

:warning:
Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

Du brauchst wieder einen Stromtreiber für den Stepper. Und da ist die Spulenspannung letztendlich egal. Da geht es nur um den Spulenstrom, der am Treiber richtig eingestellt werden muss. Aber das hatten wir doch bei der Akkorduhr genauso.

1 Like

Ja, stimmt das war bei der Akkorduhr genau so. Ich war mir aber plötzlich nicht mehr ganz sicher, ob mir dort evtl. ein Fehler mit der Betriebsspannung des Steppers unterlaufen ist. Alles klar, danke MicroBahner, dann mach ich mal weiter und tauche sicher mit der einten oder anderen Frage betreffend dieses Projektes auf. :wink:

Danke!

Und schon bin ich hier mit Fragen :grinning:
Guten Morgen allerseits.

Ich habe nun meinen Sketch für die Kugelbahn angelegt.
Einfach gesagt geht es bei der Kugelbahn um eine Maschine, welche eine Kugel mittels eines Magneten an einer Kette hochziehen (Lift) oben angekommen mit einem Arm hinüber auf die Schienen schwenkt und abstreift (wie bei einem Stiefelknecht)

Nun muss ich die beiden Schrittmotor (der für den Lift und den für den Arm) analog der Farbuhr (Counter und Schrittmotor) referenzierten. Alles natürlich wieder mit den tollen Mobatools :wink:

Wo ich nun erstmal stecken bleibe, ist das anlegen der Schrittkette. Die Schrittkettenglieder habe ich erst mal nur provisorisch angedeutet

In etwa hatte ich die eigentliche Referenzierung der Farbuhr mit den Schrittketten verstanden nur, wie die genau angelegt wird war mir nie so ganz klar.

Ok, hier mal was ich bis jetzt schon habe und ja ich weiss da fehlt noch einiges.


#include <MobaTools.h>

constexpr uint16_t NULLPOSLIFT = 200; // Abstand Referenzpunkt ( LS ) zum Nullpunkt
constexpr uint16_t NULLPOSARM = 200;

const byte stepPin = 6;
const byte dirPin = 5;
const byte enaPin = 4 ;
const byte inPins[] = { A0, A1 };
const byte pinAnzahl = sizeof( inPins );
const int stepsPerRevLift = 2000;
const int stepsPerRevArm = 2000;
int buttonState = 0;

enum : byte { refLift, refArm };
enum class Schritt : byte {REF_CHK_LIFT, REF_FREI_LIFT, REF_LIFT, REF_CHL_ARM, REF_FREI_ARM, REF_ARM};


MoToStepper stepLift( stepsPerRevLift, STEPDIR );  // Schritmotor Lift
MoToStepper stepArm( stepsPerRevArm, STEPDIR );  // Schrittmotor Arm
MoToButtons Taster ( inPins, pinAnzahl, 20, 2000 );  // Einrichten der Tasterverwaltung



void setup() {



  //stepLift.attachEnable(enaPin, LOW);                 // Stepperspulen Lift anschalten
  stepLift.attach( stepPin, dirPin );
  stepLift.setSpeed( 800 );
  stepLift.setRampLen( 100);  // Rampenlänge

  stepArm.attach(8, 9, 10, 11);                 // Nr. der Pins für den Stepper
  stepArm.setSpeed(60);                         // Geschwindigkeit in RPM*10
}

void loop() {

  Taster.processButtons();

  void printStdSchritt( byte schritt ) {
    . // ?
    static const char *schrittTexte[] = {"REF_CHK_LIFT, REF_FREI_LIFT, REF_LIFT, REF_CHL_ARM, REF_FREI_ARM, REF_ARM" }; // Hier stecke ich fest
  }

  switch (schritt) {
      .     // Hier kommen dann die einzelnen Schritte für die Referenzierungen der Schrittmotore
    case Schritt:: REF_CHK_LFT:
      // digitalWrite(refLift, LOW); Stepperspulen anschalten
      if ( Taster.state(refLift ) ) {
        // Kelle aus LS ausfahren

        Stepper1.write( -159 );
        schritt = Schritt::REF_FREI_LIFT;

      } else {

        schritt = Schritt::REF_LIFT;
      }
      break;

  }

}


{




}

}

Guten Morgen,

willkommen zurück!

Das ist Text für die Fehlersuche, besser diese Zeile kopieren und mit den richtigen Namen versehen:

    enum Schritt : byte {REF_CHK_KELLE, REF_FREI_KELLE, REF_KELLE, REF_GEFUNDEN, REF_M, REF_SUCHEN, WARTEN, KELLE_RUNTER, M_ZEIT, KELLE_RAUF};
1 Like

Kannst Du das mal mit einem Bildchen unterfüttern? So ganz ist mir noch nicht klar, wie das aussehen soll. Du wirst da ja auch in irgendeiner Form Microschalter brauchen für die absoluten Positionen. Wenn ich das richtig sehe, gibt es hier ja nichts, was sich einfach im Kreis dreht wie bei der Farbuhr. Wahrscheinlich eher wie bei der Akkorduhr?

ich hoffe das Bild ist einigermassen aussagekräftig.

So in etwa. Die Spindel welche die Kette aufwickelt dreht sich jedoch im Kreise. und der Arm der dann die Kette mit der Kugel hinüber dreht macht ein kleine Drehbewegung (etwa 90 Grad)

Genau, oder evtl. auch wieder Lichtschranken.

Ok, ich hab das mal so abgeändert:

void loop() {

  Taster.processButtons();

 {
    // ?
    enum Schritt : byte = {"REF_CHK_LIFT, REF_FREI_LIFT, REF_LIFT, REF_CHL_ARM, REF_FREI_ARM, REF_ARM" }; // Hier stecke ich fest
  }

Nee, das geht syntaktisch so nicht, der Compiler wird das nicht mögen. Aber Du bist auf dem richtigen Weg :slightly_smiling_face:

Ja, der Compiler ist (einmal mehr) noch gar nicht zufrieden mit mir! :smiley:

Versuche es mal ohne Anführungszeichen.

so wäre er zufrieden:

#include <MobaTools.h>

constexpr uint16_t NULLPOSLIFT = 200; // Abstand Referenzpunkt ( LS ) zum Nullpunkt
constexpr uint16_t NULLPOSARM = 200;

const byte stepPin = 6;
const byte dirPin = 5;
const byte enaPin = 4;
const byte inPins[] = {A0, A1};
const byte pinAnzahl = sizeof(inPins);
const int stepsPerRevLift = 2000;
const int stepsPerRevArm = 2000;
int buttonState = 0;

enum : byte { refLift, refArm };
enum class Schritt : byte { REF_CHK_LIFT, REF_FREI_LIFT, REF_LIFT, REF_CHK_ARM, REF_FREI_ARM, REF_ARM };

MoToStepper stepLift(stepsPerRevLift, STEPDIR);  // Schritmotor Lift
MoToStepper stepArm(stepsPerRevArm, STEPDIR);    // Schrittmotor Arm
MoToButtons Taster(inPins, pinAnzahl, 20, 2000); // Einrichten der Tasterverwaltung

void setup() {
  stepLift.attach(stepPin, dirPin);
  stepLift.setSpeed(800);
  stepLift.setRampLen(100);

  stepArm.attach(inPins[0], inPins[1]); // Corrected pin attachment
  stepArm.setSpeed(60);
}

void loop() {
  Taster.processButtons();

  Schritt schritt; // Define the variable 'schritt' of type 'Schritt'

  switch (schritt) {
    case Schritt::REF_CHK_LIFT:
      if (Taster.state(refLift)) {
        // Kelle aus LS ausfahren
        stepLift.write(-159);
        schritt = Schritt::REF_FREI_LIFT;
      } else {
        schritt = Schritt::REF_LIFT;
      }
      break;
      
    // Add cases for other steps as needed
  }
}

Nicht ganz, mit Warnungen:

36:3: warning: 'schritt' is used uninitialized in this function [-Wuninitialized]
   switch (schritt) {
   ^~~~~~

Ich werte die Warnung als Fehler.

Ja, da fehlt noch was!

Jetzt kommen auch keine Warnungen mehr. :wink:

#include <MobaTools.h>

constexpr uint16_t NULLPOSLIFT = 200; // Abstand Referenzpunkt (LS) zum Nullpunkt
constexpr uint16_t NULLPOSARM = 200;

const byte stepPin = 6;
const byte dirPin = 5;
const byte enaPin = 4;
const byte inPins[] = {A0, A1};
const byte pinAnzahl = sizeof(inPins);
const int stepsPerRevLift = 2000;
const int stepsPerRevArm = 2000;
int buttonState = 0;

enum : byte { refLift, refArm };
enum class Schritt : byte { REF_CHK_LIFT, REF_FREI_LIFT, REF_LIFT, REF_LIFT_GEFUNDEN, REF_CHK_ARM, REF_FREI_ARM, REF_ARM, REF_ARM_GEFUNDEN };

MoToStepper stepLift(stepsPerRevLift, STEPDIR);  // Schrittmotor Lift
MoToStepper stepArm(stepsPerRevArm, STEPDIR);    // Schrittmotor Arm
MoToButtons Taster(inPins, pinAnzahl, 20, 2000); // Einrichten der Tasterverwaltung

void setup() {
  stepLift.attach(stepPin, dirPin);
  stepLift.setSpeed(800);
  stepLift.setRampLen(100);

  stepArm.attach(inPins[0], inPins[1]);
  stepArm.setSpeed(60);
}

void loop() {
  Taster.processButtons();

  // Determine the current step based on button states or other conditions
  Schritt schritt = Schritt::REF_CHK_LIFT; // For example, start with checking lift

  switch (schritt) {
    case Schritt::REF_CHK_LIFT:
      if (Taster.state(refLift)) {    // Mikroschalter (oder LS) drücken
        stepLift.write(-159);         
        schritt = Schritt::REF_FREI_LIFT;
      } else {
        schritt = Schritt::REF_LIFT;  // Refpunkt suchen
      }
      break;

    case Schritt::REF_FREI_LIFT:
      if (!stepLift.moving()) {
        if (Taster.released(refLift))
          stepLift.doSteps(-100);  // LS/Schalter frei fahren
        schritt = Schritt::REF_LIFT;
      }
      break;

    case Schritt::REF_LIFT:
      stepLift.write(200);
      schritt = Schritt::REF_LIFT_GEFUNDEN;
      break;

    case Schritt::REF_LIFT_GEFUNDEN:
      if (Taster.state(refLift)) {   // Bewegung Lift starten
        schritt = Schritt::REF_CHK_ARM;
      }
      break;

    case Schritt::REF_CHK_ARM:
      if (Taster.state(refArm)) {    // Mikroschalter (oder LS) drücken
        stepLift.write(-159);         
        schritt = Schritt::REF_FREI_ARM;
      } else {
        schritt = Schritt::REF_ARM;  // Refpunkt suchen
      }
      break;

    case Schritt::REF_FREI_ARM:
      if (!stepArm.moving()) {
        if (Taster.released(refArm))
          stepArm.doSteps(-100);  // LS/Schalter frei fahren
        schritt = Schritt::REF_ARM;
      }
      break;

    case Schritt::REF_ARM:
      stepArm.write(200);
      schritt = Schritt::REF_ARM_GEFUNDEN;
      break;

    case Schritt::REF_ARM_GEFUNDEN:
      if (Taster.state(refArm)) {   // Bewegung Arm starten
        // Hier implementieren, was als nächstes passieren soll
      }
      break;
  }
}

Ich muss zugeben, dass mir das Bild noch nicht so richtig sagt, wass sich da wie bewegen soll ... :thinking:

Das wird so nicht funktionieren ( auch wenn es keine Warnungen gibt ... ).
So wie es jetzt ist, wird bei jedem loop-Durchlauf die Variable 'schritt' neu angelegt und mit dem ersten Schrittwert initiiert. Da kommst Du dann nie weiter.

Entweder Du legst schritt als globale Variable an, oder Du musst sie hier im loop als 'static' definieren:
static Schritt schritt = Schritt::REF_CHK_LIFT; // For example, start with checking lift

P.S. Wobei ich persönlich nicht zwei Bezeichner verwenden würde, die sich nur durch Groß/Kleinschreibung unterscheiden. Das schreit nach Tipfehlern ;)