Schrittmotorsteuerung für Drehscheibe

Fertige Geräte mit Bilden, Schaltungen, Programmen vorstellen.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

e69-fan hat geschrieben: Mo 25. Jan 2021, 16:47 Danke für Deine pdf, ich war der falschen Meinung, dass die 3 Pins per Software geschaltet werden.
Ja, das geht natürlich auch. Wenn man in einem Programm so verschiedene Geschwindigkeiten braucht, dann kann man das schon machen. Dann braucht man dafür eben zusätzliche Pin´s vom Arduino. Möglich ist alles.

Wünsche gut zu schlafen, Servus
Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von e69-fan »

Hallo Franz,

das wäre mein aktueller Stand - schau mal Bitte "zwischen die Zeilen"

Code: Alles auswählen

////////// Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////
//  Drehscheibe_Franz54_

/*  Beispiel für die Ansteuerung eines bipolaren Steppers über Taster und ein Poti
    ( für die Geschwindigkeit )
    In diesem Beispiel werden neben der Stepperklasse (MoToStepper), auch die MoToButtons
    und der MoToTimebase genutzt.
    Der Spulenstrom wird abgeschaltet, wenn der Stepper nicht läuft.
    Die Taster müssen gegen Gnd schalten, es sind keine Widerstände notwendig


*/

#define MAX8BUTTONS                 // (saves RAM)
#include <MobaTools.h>

// individuelle Definationen

const byte dirPin       = 5;
const byte stepPin      = 6;
const byte enaPin       = 7;

const byte LinksPin     = 8;
const byte RechtsPin    = 9;
const byte RefPin       = 10;

const byte button4Pin   = 11;

const byte potPin       = A0;       // Analog Poti Eingang

int Umdrehungen         = 0;
int Umdrehung_Schritte  = 800;      // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe               = 200;

const int STEPS_REVOLUTION = 3200;  // Schritte Auftrag orginal 6400
//Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );  // 6400 Steps bei 800 pro Umdrehung

// Taster einrichten
enum { Button1 = 0, Button2, Button3, Button4 } ;                         // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, button4Pin };    // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
// the speed pot ist read only every 'speedintervall' ms

int vspeed = 0;                 //Steppergeschwindigkeit in U/min*10

void setup()
{
  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;

  //-----Stepper
  myStepper.attach( stepPin, dirPin );
  myStepper.attachEnable( enaPin, 10, LOW );  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 200 );                  // 20 Umdrehungen je Minute
  myStepper.setRampLen( Rampe );              // Rampenlänge 300 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );          // 100ms Tickerzeit
}

void loop() {
  button.processButtons();       // Taster einlesen und bearbeiten

  // Speed alle 100ms neu einlesen und setzen
  if ( speedIntervall.tick() ) {      // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )

    vspeed = map((analogRead(potPin)), 0, 1023, 20, 240);  //Poti mappen auf 2 ... 240 Umdr/Min


    myStepper.setSpeed( vspeed );     // min speed =2 and max speed =180 rpm
  }

  // ---------- Referenzpunkt setzen ----------------------------- //

  if (button.pressed(Button1) ) {     //Taster Links gedrückt
    myStepper.doSteps( 4 );           // Stepper dreht 1x links
  }
  if ( button.released(Button1) ) {   // Taster links losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button2) ) {     // Taster Rechts gedrückt
    myStepper.doSteps( -4 );          // Stepper dreht 1x rechts
  }
  if ( button.released(Button2) ) {   // Taster Rechts losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button3) ) {     // Taster Ref gedrückt
    myStepper.setZero();              // Referenzpunkt gesetzt
  }

  // --------------------------------------------------------------  //

  if (button.pressed(Button4) ) {     // Taster4 wurde gedrückt
    myStepper.doSteps(3200);          // 1x Umdrehung = 360 Grad
  }
}


Ist das richtig
enum { Button1 = 0, Button2, Button3, Button4 } ; und was bedeutet Button1 = 0
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

e69-fan hat geschrieben: Di 26. Jan 2021, 15:57 Ist das richtig
Ich denke mal ja. Ich kann jetzt nicht jede Zeile genau bestimmen. Besser ist, du testest dein Programm, und siehst es dann am Erfolg / Misserfolg
Und der Compiler zeigt dir ja Probleme an, wenn du es Übersetzen lässt. Wenn du es am Arduino hochladen kannst und es tut was du willst, ist wohl alles klar :) Ansonsten mault der der Compiler ja die fehler Zeile an.
e69-fan hat geschrieben: Di 26. Jan 2021, 15:57 enum { Button1 = 0, Button2, Button3, Button4 } ; und was bedeutet Button1 = 0
Das heißt nur dass der Button1 im MobaTools.h intern die Taste 0 ist, und die weiteren hochzählen. Also Button2 = 1, Button3 = 2, Button4 = 3.

Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von e69-fan »

Servus Franz,
aktueller Stand der Drehscheibe - läuft prima.

Frage: Ich möchte noch ein Blinklicht ( vorerst BlinkLED an Pin13 ) einbinden, welches nur während der Schrittmotorbewegung leuchtet.
"(Achtung! Drehbühne in Betrieb ... )". Idealerweise nur im Programmteil "Bühnendrehung". Bei "Referenzpunkt setzen" macht es keinen Sinn.
Vielleicht muss man myStepper.rotate(0); auswerten ? Bei mir hat bis jetzt nichts funktionert.

Code: Alles auswählen

//////////  Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////
//          Drehscheibe_Franz54_


#define MAX8BUTTONS                 // (saves RAM)
#include <MobaTools.h>

// individuelle Definitionen

const byte BlinkLED     = 13;
const byte RefLED       = 12;
const byte dirPin       = 5;
const byte stepPin      = 6;
const byte enaPin       = 7;

const byte LinksPin     = A1;
const byte RechtsPin    = A2;
const byte RefPin       = A3;

const byte WendePin     = 8;
const byte SchuppenPin  = 9;
const byte Gleis_1bPin  = 10;
const byte AusfahrtPin  = 11;

const byte potPin       = A0;       // Analog Poti Eingang

int Umdrehungen         = 0;
int Umdrehung_Schritte  = 800;      // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe               = 200;


// -----  Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )-------------------------------------------  //
const int STEPS_REVOLUTION = 3200;                                  // Schritte Auftrag orginal 6400

MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );                 // 6400 Steps bei 800 pro Umdrehung

// -----  Taster einrichten  ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7 } ;                            // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, WendePin, SchuppenPin, Gleis_1bPin, AusfahrtPin };    // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

//  -----  speedPoti einrichten  --------------------------------------------------------------------------------------//
MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
int vspeed = 0;                 // Steppergeschwindigkeit in U/min*10

//   -----  Gleisabgänge einrichten ------------------------------  //

#define Wendung     0
#define Schuppen    1
#define Gleis_1B    2
#define Ausfahrt    3

byte Drehung = 0;

void setup() {
  
  pinMode(RefLED, OUTPUT);
  digitalWrite(RefLED, LOW);

  pinMode (BlinkLED, OUTPUT);

  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;

  //-----  Stepper  -------------------------------------------------------------------- //
  myStepper.attach( stepPin, dirPin );
  myStepper.attachEnable( enaPin, 10, LOW );  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 200 );                  // 20 Umdrehungen je Minute
  myStepper.setRampLen( Rampe );              // Rampenlänge 300 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );          // 100ms Tickerzeit
}

void loop() {
  button.processButtons();            // Taster einlesen und bearbeiten

  if ( speedIntervall.tick() ) {                            // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
                                                            // Speed alle 100ms neu einlesen und setzen
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 240);   // Poti mappen auf 2 ... 240 Umdr/Min
    myStepper.setSpeed( vspeed );                           // min speed =2 and max speed =180 rpm
  }
  
  //  --------------------------- Referenzpunkt setzen ------------------------------------------------  //
  if (button.pressed(Button1) ) {     // Taster Links gedrückt
    myStepper.doSteps( 4 );           // Stepper dreht 1x links
  }
  if ( button.released(Button1) ) {   // Taster links losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button2) ) {     // Taster Rechts gedrückt
    myStepper.doSteps( -4 );          // Stepper dreht 1x rechts
  }
  if ( button.released(Button2) ) {   // Taster Rechts losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button3) ) {     // Taster Ref gedrückt
    myStepper.setZero();              // Referenzpunkt gesetzt
    digitalWrite(RefLED, HIGH);
  }

  //  --------------------------- Bühnendrehung ------------------------------------------------  //
  switch (Drehung)   {

    case Wendung:
      if (button.pressed(Button4) ) {     //
        myStepper.write( -180 );          //
        break;
      }
    case Schuppen:
      if (button.pressed(Button5) ) {     //
        myStepper.write( -250 );          //
        break;
      }
    case Gleis_1B:
      if (button.pressed(Button6) ) {     //
        myStepper.write( -330 );          //
        break;
      }
    case Ausfahrt:
      if (button.pressed(Button7) ) {     //
        myStepper.write( 0 );             //
        break;
      }
  }
}
Einen schönen Tag ...
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Eine Blinkschaltung in den Loop einbauen, und darin einen Merker von dem es abhängt ob der Blinker an ist. Dieser Merker wird dann im Switch (Drehung) mit den Zeilen myStepper.write( -xxx ); auf HIGH gesetzt und in der Zeile myStepper.write( 0 ); wieder auf LOW gesetzt. So stelle ich es mir jedenfalls vor. :)

Ich muss mal schauen wann ich am WE Zeit habe, dann könnte ich da was dafür schreiben.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ich habe jetzt mal das hier getestet:

Code: Alles auswählen

/*
 * Ist "BLINKIO" LOW also 0,
 * dann ist auf Pin 13 (LED) immer LOW also 0
 * Ist "BLINKIO" HIGH also 1,
 * dann ist auf Pin 13 (LED) immer HIGH / LOW 300millis Blinksignal
 */
// Declarationen
int LED_PIN = 13;// "const int" ist Constante intern festlegen
byte LED = LOW;
byte BLINKIO = 1;
const int delayTime = 300;  // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;
// ------------------------------------------------------------------------
void setup() {
  // Pins als Eingang oder Ausgang festlegen
  pinMode(LED_PIN, OUTPUT);// Pin.13 zum Ausgabeport machen.
}
// ------------------------------------------------------------------------
void loop() {
  AktuellMilles = millis();
  if (AktuellMilles - VorherMilles >= delayTime) {
    VorherMilles = AktuellMilles;
    LED = !LED;
    if (BLINKIO == 0) {
      LED = 0;
    }
    digitalWrite(LED_PIN, LED);
  }

}
Das macht was es soll, der "ein/aus Schalter" ist "BLINKIO" 0/1

Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von e69-fan »

Hallo Franz,

eigenständig funktioniert die Blinklichtschaltung sehr gut.

Wie kann ich das Blinklicht im switch Drehung) aus/einschalten ?
Siehe: // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der Drehung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx //

Ich bin kläglich gescheitert, zum Glück gab es Sicherungskopien.

Code: Alles auswählen

//////////  Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////
//          Drehscheibe_Franz54_


#define MAX8BUTTONS                 // (saves RAM)
#include <MobaTools.h>

// individuelle Definitionen

const int LED_PIN       = 13;
byte LED = LOW;
byte BLINKIO = 0;                 // Bei Systemstart - Blinklicht AUS
const int delayTime = 300;        // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;

const byte RefLED       = 12;
const byte dirPin       = 5;
const byte stepPin      = 6;
const byte enaPin       = 7;

const byte LinksPin     = A1;
const byte RechtsPin    = A2;
const byte RefPin       = A3;

const byte WendePin     = 8;
const byte SchuppenPin  = 9;
const byte Gleis_1bPin  = 10;
const byte AusfahrtPin  = 11;

const byte potPin       = A0;       // Analog Poti Eingang

int Umdrehungen         = 0;
int Umdrehung_Schritte  = 800;      // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe               = 200;


// -----  Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )-------------------------------------------  //
const int STEPS_REVOLUTION = 3200;                                  // Schritte Auftrag orginal 6400

MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );                 // 6400 Steps bei 800 pro Umdrehung

// -----  Taster einrichten  ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7 } ;                            // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, WendePin, SchuppenPin, Gleis_1bPin, AusfahrtPin };    // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

//  -----  speedPoti einrichten  --------------------------------------------------------------------------------------//
MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
int vspeed = 0;                 // Steppergeschwindigkeit in U/min*10

//   -----  Gleisabgänge einrichten ------------------------------  //

#define Wendung     0
#define Schuppen    1
#define Gleis_1B    2
#define Ausfahrt    3

byte Drehung = 0;

void setup() {

  pinMode(RefLED, OUTPUT);
  digitalWrite(RefLED, LOW);
  pinMode(LED_PIN, OUTPUT);


  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;

  //-----  Stepper  -------------------------------------------------------------------- //
  myStepper.attach( stepPin, dirPin );
  myStepper.attachEnable( enaPin, 10, LOW );  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 200 );                  // 20 Umdrehungen je Minute
  myStepper.setRampLen( Rampe );              // Rampenlänge 300 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );          // 100ms Tickerzeit
}

void loop() {
  AktuellMilles = millis();
  if (AktuellMilles - VorherMilles >= delayTime) {
    VorherMilles = AktuellMilles;
    LED = !LED;
    if (BLINKIO == 0) {
      LED = 0;
    }
    digitalWrite(LED_PIN, LED);
  }

  button.processButtons();            // Taster einlesen und bearbeiten

  if ( speedIntervall.tick() ) {                            // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    // Speed alle 100ms neu einlesen und setzen
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 240);   // Poti mappen auf 2 ... 240 Umdr/Min
    myStepper.setSpeed( vspeed );                           // min speed =2 and max speed =180 rpm
  }

  //  --------------------------- Referenzpunkt setzen ------------------------------------------------  //
  if (button.pressed(Button1) ) {     // Taster Links gedrückt
    myStepper.doSteps( 4 );           // Stepper dreht 1x links
  }
  if ( button.released(Button1) ) {   // Taster links losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button2) ) {     // Taster Rechts gedrückt
    myStepper.doSteps( -4 );          // Stepper dreht 1x rechts
  }
  if ( button.released(Button2) ) {   // Taster Rechts losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button3) ) {     // Taster Ref gedrückt
    myStepper.setZero();              // Referenzpunkt gesetzt
    digitalWrite(RefLED, HIGH);
  }

  //  --------------------------- Bühnendrehung ------------------------------------------------  //
  switch (Drehung)   {

    case Wendung:
      if (button.pressed(Button4) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( -180 );          //

        break;
      }
    case Schuppen:
      if (button.pressed(Button5) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( -250 );          //
        break;
      }
    case Gleis_1B:
      if (button.pressed(Button6) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegungsoll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( -330 );          //
        break;
      }
    case Ausfahrt:
      if (button.pressed(Button7) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( 0 );             //
        break;
      }
  }
}
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ich dachte mir das so:

Code: Alles auswählen

//////////  Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////
//          Drehscheibe_Franz54_


#define MAX8BUTTONS                 // (saves RAM)
#include <MobaTools.h>

// individuelle Definitionen

// -----------Declarationen Blinklicht-----------------
int LED_PIN = 13;// Blink-LED auf 13
byte LED = LOW;
unsigned long BLINKIO = 0;
const int delayTime = 300;  // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;
// ----------------------------------------------------

const byte RefLED       = 12;
const byte dirPin       = 5;
const byte stepPin      = 6;
const byte enaPin       = 7;

const byte LinksPin     = A1;
const byte RechtsPin    = A2;
const byte RefPin       = A3;

const byte WendePin     = 8;
const byte SchuppenPin  = 9;
const byte Gleis_1bPin  = 10;
const byte AusfahrtPin  = 11;

const byte potPin       = A0;       // Analog Poti Eingang

int Umdrehungen         = 0;
int Umdrehung_Schritte  = 800;      // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe               = 200;


// -----  Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )-------------------------------------------  //
const int STEPS_REVOLUTION = 3200;                                  // Schritte Auftrag orginal 6400

MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );                 // 6400 Steps bei 800 pro Umdrehung

// -----  Taster einrichten  ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7 } ;                            // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, WendePin, SchuppenPin, Gleis_1bPin, AusfahrtPin };    // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

//  -----  speedPoti einrichten  --------------------------------------------------------------------------------------//
MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
int vspeed = 0;                 // Steppergeschwindigkeit in U/min*10

//   -----  Gleisabgänge einrichten ------------------------------  //

#define Wendung     0
#define Schuppen    1
#define Gleis_1B    2
#define Ausfahrt    3

byte Drehung = 0;

void setup() {

  pinMode(RefLED, OUTPUT);
  digitalWrite(RefLED, LOW);
  pinMode(LED_PIN, OUTPUT);


  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;

  //-----  Stepper  -------------------------------------------------------------------- //
  myStepper.attach( stepPin, dirPin );
  myStepper.attachEnable( enaPin, 10, LOW );  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 200 );                  // 20 Umdrehungen je Minute
  myStepper.setRampLen( Rampe );              // Rampenlänge 300 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );          // 100ms Tickerzeit
}

void loop() {
  BLINKIO = myStepper.stepsToDo();
  AktuellMilles = millis();
  if (AktuellMilles - VorherMilles >= delayTime) {
    VorherMilles = AktuellMilles;
    LED = !LED;
    if (BLINKIO == 0) {
      LED = 0;
    }
    digitalWrite(LED_PIN, LED);
  }

  button.processButtons();            // Taster einlesen und bearbeiten

  if ( speedIntervall.tick() ) {                            // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    // Speed alle 100ms neu einlesen und setzen
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 240);   // Poti mappen auf 2 ... 240 Umdr/Min
    myStepper.setSpeed( vspeed );                           // min speed =2 and max speed =180 rpm
  }

  //  --------------------------- Referenzpunkt setzen ------------------------------------------------  //
  if (button.pressed(Button1) ) {     // Taster Links gedrückt
    myStepper.doSteps( 4 );           // Stepper dreht 1x links
  }
  if ( button.released(Button1) ) {   // Taster links losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button2) ) {     // Taster Rechts gedrückt
    myStepper.doSteps( -4 );          // Stepper dreht 1x rechts
  }
  if ( button.released(Button2) ) {   // Taster Rechts losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button3) ) {     // Taster Ref gedrückt
    myStepper.setZero();              // Referenzpunkt gesetzt
    digitalWrite(RefLED, HIGH);
  }

  //  --------------------------- Bühnendrehung ------------------------------------------------  //
  switch (Drehung)   {

    case Wendung:
      if (button.pressed(Button4) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( -180 );          //
        break;
      }
    case Schuppen:
      if (button.pressed(Button5) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( -250 ); //
        break;
      }
    case Gleis_1B:
      if (button.pressed(Button6) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegungsoll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( -330 );   //
        break;
      }
    case Ausfahrt:
      if (button.pressed(Button7) ) {     //

        // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx nur während der stepperBewegung soll Blinklicht AN xxxxxxxxxxxxxxxxxxx  //

        myStepper.write( 0 );             //
        break;
      }
  }
}

Ich habe es nochmal geändert. Schaue mal ob das so funktioniert. Ich habe deinen Aufbau nicht bei mir. Kann es daher nicht testen.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Schaue mal das Programm an. Ich habe es nochmal geändert und im Beitrag darüber nochmal ausgetauscht. :(V):
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von e69-fan »

Hallo Franz,

vielen Dank

:(V):

- das Programm läuft jetzt wie ich mir das vorgestellt habe.
( ich habe den (switch) entfernt, da er blockiert hat - warum weiß ich nicht. Hat trotzdem funktioniert weil die ( ; beim break) falsch gesetzt waren.
Ist die Einleitung mit den Hinweisen über Dich in Ordnung? nach Deinem O:K. würde ich den Sketch ev. gerne im stummiforum veröffentlichen.

Code: Alles auswählen

/*  Dateiname:      Drehscheibe_Franz54_final    by e69-fan
 *   
 *  Beispiel: Stepper_03 von den MobaTools / MoToStepper - attaching a bipolar stepper with step/dir and enable 
 *  Schrittmotor MINEBEA 17PM-K374BN01CN, 1,8°
 *  A4988 Schrittmotor-Treiber-Modul 
 *  MS1 + MS2 + MS3 an 5 Volt
 *  
 *  max. Drehwinkel 370 Grad, dann zurück
 *  Referenzpunkt gesetzt mit LED
 *  Blinklicht während der Bühnendrehung
 *   
 *  Danke an MicroBahner und Franz54  https://www.franzls-technik-forum.de
 *                                    https://arduino-fan.de/
 */
 
#define MAX8BUTTONS                 
#include <MobaTools.h>

//-----  individuelle Definitionen  -------------------------------------------------- //

// -----------Declarationen Blinklicht-----------------
int LED_PIN = 13;// Blink-LED auf 13
byte LED = LOW;
unsigned long BLINKIO = 0;
const int delayTime = 300;  // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;

// ----------------------------------------------------

const byte RefLED       = 12;
const byte dirPin       = 5;
const byte stepPin      = 6;
const byte enaPin       = 7;

const byte LinksPin     = A1;
const byte RechtsPin    = A2;
const byte RefPin       = A3;

const byte WendePin     = 8;
const byte SchuppenPin  = 9;
const byte Gleis_1bPin  = 10;
const byte AusfahrtPin  = 11;

const byte potPin       = A0;       // Analog Poti Eingang

int Umdrehungen         = 0;
int Umdrehung_Schritte  = 800;      // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe               = 200;


// -----  Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )-------------------------------------------  //
const int STEPS_REVOLUTION = 3200;                   // Schritte Auftrag 

MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );  // Steps bei xxx pro Umdrehung

// -----  Taster einrichten  ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7 } ;                            // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, WendePin, SchuppenPin, Gleis_1bPin, AusfahrtPin };    // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

//  -----  speedPoti einrichten  --------------------------------------------------------------------------------------//
MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
int vspeed = 0;                 // Steppergeschwindigkeit in U/min*10

void setup() {

  pinMode(RefLED, OUTPUT);
  digitalWrite(RefLED, LOW);
  pinMode(LED_PIN, OUTPUT);


  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;

  //-----  Stepper  -------------------------------------------------------------------- //
  myStepper.attach( stepPin, dirPin );
  myStepper.attachEnable( enaPin, 10, LOW );  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 200 );                  // 20 Umdrehungen je Minute
  myStepper.setRampLen( Rampe );              // Rampenlänge 300 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );          // 100ms Tickerzeit
}

void loop() {
  BLINKIO = myStepper.stepsToDo();
  AktuellMilles = millis();
  if (AktuellMilles - VorherMilles >= delayTime) {
    VorherMilles = AktuellMilles;
    LED = !LED;
    if (BLINKIO == 0) {
      LED = 0;
    }
    digitalWrite(LED_PIN, LED);
  }

  button.processButtons();            // Taster einlesen und bearbeiten

  if ( speedIntervall.tick() ) {                            // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    // Speed alle 100ms neu einlesen und setzen
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 240);   // Poti mappen auf 2 ... 240 Umdr/Min
    myStepper.setSpeed( vspeed );                           // min speed =2 and max speed =180 rpm
  }

  //  --------------------------- Referenzpunkt setzen ------------------------------------------------  //
  if (button.pressed(Button1) ) {     // Taster Links gedrückt
    digitalWrite(RefLED, LOW);
    myStepper.doSteps( 4 );           // Stepper dreht 1x links
  }
  if ( button.released(Button1) ) {   // Taster links losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button2) ) {     // Taster Rechts gedrückt
    digitalWrite(RefLED, LOW);
    myStepper.doSteps( -4 );          // Stepper dreht 1x rechts
  }
  if ( button.released(Button2) ) {   // Taster Rechts losgelassen
    myStepper.rotate(0);              // Stepper stoppt
  }
  if (button.pressed(Button3) ) {     // Taster Ref gedrückt
    myStepper.setZero();              // Referenzpunkt gesetzt
    digitalWrite(RefLED, HIGH);
  }

  //  --------------------------- Bühnendrehung ------------------------------------------------  //

  if (button.pressed(Button4) ) {     // Taster4 gedrückt:
    myStepper.write( -180 );          // wendet die Bühne um 180 Grad 
  }

  if (button.pressed(Button5) ) {     // Taster5 gedrückt
    myStepper.write( -250 );          // dreht zur Abfahrt: Lokschuppen
  }

  if (button.pressed(Button6) ) {     // Taster6 gedrückt:
    myStepper.write( -330 );          // dreht zur Ausfahrt Gleis1B
  }

  if (button.pressed(Button7) ) {     // Taster7 gedrückt:
    myStepper.write( 0 );             // dreht zurück zur Einfahrt Gleis1A
  }
}

Grüße aus der Heimat der E69
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste