wie "definiere" ich Stepper & Pins zu einem späteren Zeitpunkt?

Hallo allerseits,

mich quält seit ein paar Tagen ein Problem, für das ich einfach keine Lösung finde. Jetzt wollte ich fragen, ob es überhaupt zu lösen ist. ::slight_smile:

Untenstehender Code ist aus den Beispielen und dient lediglich zur besseren Beschreibung meines Problems. (Vielleicht konnte ich auch keinen Lösungsansatz finden, weil ich nicht wusste wonach ich suchen muss)

Zu meinem Problem:
Ich möchte, bevor ich einen/mehrere Stepper mit der Zeile "Stepper myStepper(stepsPerRevolution, 8,9,10,11); " erstelle zuerst über den SerialMonitor die Anzahl und die zu verwendenden Pins für die Schrittmotoren angeben.
(Wie mennt man eine solche Definition, die ja anscheinend leider vor setup() und loop() erfolgen muss?)

Definiere ich die Stepper in einer extra Funktion, sind sie ja leider nicht mehr in der loop() ansprechbar
und ein unschönes goto funktioniert außerhalb von Funktionen auch nicht.
Wie auch eine switch oder if-Abfrage, musste ich feststellen.
Wie könnte ich sonst, falls ersteres Problem überhaupt lösbar ist, die x-fache Stepper-Dingens-Erzeugung anhand des Ints in ‘AnzahlStepper’ realisieren?

Schon mal besten Dank für eure Hilfe.

#include <Stepper.h>

const int stepsPerRevolution = 200;
int AnzahlStepper = 0;
int stp1_1 = 0;
int stp1_2 = 0;
int stp1_3 = 0;
int stp1_4 = 0;

//Stepper myStepper(stepsPerRevolution, 8,9,10,11);
Stepper myStepper(stepsPerRevolution, stp1_1, stp1_2, stp1_3, stp1_4);

void setup() {
  myStepper.setSpeed(60);    // set the speed at 60 rpm
  Serial.begin(9600);
// ab hier kann ich ja erst die Anzahl und Pins der Stepper vom PC erfahren/eingeben ... hmmpf
// zB.
AnzahlStepper = 1;
int stp1_1 = 9;
int stp1_2 = 10;
int stp1_3 = 11;
int stp1_4 = 12;

}

void loop() {
   Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);
  
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500); 
}

Gruß,
Neod

Hallo,

ich weiß nicht so recht ob ich das verstanden habe.
Ein Blick in die Stepper-Lib "Stepper.h" zeigt, dass die Stepper-Lib keine nachträgliche Initialisierung der Pins zulässt und dieses nur im Konstruktor geschehen muss.
Die entsprechenden Variablen sind alle im Privat-Bereich der Klasse.

So wie es aussieht, musst du die Klasse umbauen oder erweitern. Also z.B. entweder die vier privaten Pin-Variablen in den Public Bereich ziehen (unschön) oder im Public-Bereich setter-Funktionen für diese Variablen anlegen.
Und dann benötigst du wohl noch erstmal einen Standard-Konstruktor um deine Stepper-Variable erstmal nur zu deklarieren um dann deinem Stepper-Objekt die vier Pin-Variablen später zuweisen zu können.

Du kannst prinzipiell*) Objekte auch zur Laufzeit erzeugen.

Bräuchtest dann global erstmal nur ein Array von Zeigern auf eventuelle Stepper Instanzen.

#include <Stepper.h>
#define MAX_ANZAHL_STEPPER 5
Stepper * mySteppers[MAX_ANZAHL_STEPPER];

void setup()
{
    Serial.begin(9600);
    Serial.print( "Stepper - Anzahl": )
    while (! Serial.available() ) {}  // auf Antwort warten
    byte anz = Serial.read() - '0';
    if (anz <= MAX_ANZAHL_STEPPER)
    {
     for ( byte s = 0; s < anz; s++ )
        {
             CreateStepper(s);
        }
     Serial.prinln();
     Serial.print(anz); Serial.println(" Stepper Objekte erzeugt");
    }
    else Serial.println("\nFalsche Eingabe. Start ohne Stepper");
}

void loop()
{
   for (byte s = 0; mySteppers[s] != NULL; s++)
      doWork(*mySteppers[s], s);
}


void doWork(Stepper& stepper, byte s)
{
   // arbeitet mit einem Stepper namens stepper, 
   // s ( 0 ... anz-1 )  verrät, welcher es ist.
}

Und hier der “Trick”, im Prinzip:

void CreateStepper(byte s)
{
   // erzeugt ein Stepper Objekt mit den Pins s*4 +2 ... s*5 + 5
   // der erste also Pins 2 .. 5
   // der zweite dann Pins 6 .. 9

   mySteppers[s] = new Stepper(200, s*4+2, s*4+3, s*4+4, s*4+5);
}

*) auch “ich weiß nicht so recht ob ich das verstanden habe” was du willst.
Ist übrigens ungetestet und nur so hingeschrieben. :wink:

Ich verstehe nicht wieso Du eine SW brauchst, bei der nicht klar ist, welche HW Du hast.

  1. ich sehe kein Problem die größtmögliche Anzahl von Stepper zu definieren. Natürlich bist Du da in der Auswahl der Pins limitirert und mußt von vorherein bestimmen welche Pingruppen für welchen Schrittmotor zuständig sind.
  2. Du machst das ohne Bibliothek bzw ohne Klassen

Grüße Uwe

Hallo und Danke für eure Antworten.

@phthalo & michael_x: Ihr habts verstanden. :wink:

Eine Klasse umzubauen oder zu erweitern übersteigt vermutlich mein bisheriges Können, aber hey, man lernt ja nie aus.
Michael_x Ansatz werde ich wohl mal versuchen zu verfolgen. Das sieht vielversprechend in meinen Laienaugen aus. ^^

@Uwe: Ganz so ist es nicht, "brauchen" ist ja relativ. Ich möchte den Controller für verschiedene kleinere Projekte benutzen, aber nicht jedes mal einen Sketch hochladen (müssen). Und da ich PC-seitig am Schreiben einer SW bin (die ich für verschiedenste Projekte benutzen kann), wollte ich gleich das Laden von verschiedenen Konfigurationen (mit einer unterschiedlichen Anzahl an Steppern, Tastern, ICs, etc) realisieren.

Ich werde über Fortschritte (oder Misserfolge) hier weiter berichten.

Gruß,
Neod