Schrittmotorsteuerung für Drehscheibe

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

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Man kann den Strom von Schrittmotoren nicht so einfach messen, weil die ja mit Impulsen angesteuert werden. Also habe ich gerade mal einen Test gemacht. Der Stromverbrauch der am Netzteil angezeigt wurde, war 0,9 bis 1 Ampere. Es ist klar, dass der angezeigte Strom kleiner ist als der tatsächlich benötigte Strom. Also habe ich jetzt mal das Labornetzteil auf 1 Ampere begrenzt, und siehe einer an, der Motor macht damit keinen Schritt. Dann bin ich auf 1,5 Ampere gegangen, der Motor lief damit wunderbar. Dann in kleinen Schritten hinterm Komma runter bis 1,05 Ampere, da war wieder Schluss mit lustig. Also wieder hoch auf 1,1 Ampere, und der Motor machte was er soll, ohne sichtbare Schrittverluste. Da ist natürlich noch zu bedenken, dass das ohne jede Last war. Also 2 Ampere sollte man ihm schon gönnen, wenn die Drehscheibe mit der Lock sauber drehen soll. :)

Franz

Ich habe jetzt gerade mal den Treiber beim Strom eine Stufe höher gestellt. Also wir haben den Treiber für deinen Motor auf 1,5 / 1,7 Ampere eingestellt. Ich habe meinen jetzt mal auf 2,0 / 2,2 Ampere eingestellt, mit dem selben Motor wie du in hast. Dann habe ich den Strom am Labornetzteil auf 1,5 Ampere begrenzt. Das ging Einwandfrei. Das selbe mit 1,4 Ampere Strombegrenzung, auch Einwandfrei. Bei 1,3 Ampere Strombegrenzung war dann Schluss. Also auf der Stufe fährt der Motor auch noch weit unter 1,7 Ampere, eben mit 1,4 Ampere, aber natürlich ohne Last. Vielleicht gehe ich mal noch eine Stufe hoch, denn der Motor soll ja für 1,7 Ampere sein.

Soooo, ich war jetzt nochmal eine Stufe höher, auf 2,5 / 2,7 Ampere. Da fährt der Motor dann wirklich mit mehr als 2,5 Ampere gemessen. Da wird er also etwa 2,6 bis 2,7 Ampere bekommen haben. Das habe ich nicht mehr weiter ausgemessen, weil ich da auf jeden Fall weit über den, für den Motor zulässigen Strom komme. Also das ist eindeutig zu hoch. Aber die eine Stufe, 2,0 / 2,2 Ampere, das wäre wohl noch locker drinn, wenn er zu wenig Leistung bringt, was aber bei deiner Drehscheibe nicht zu befürchten ist. Du kannst also bestimmt auf der Stufe 1,5 / 1,7 Ampere bleiben. Da zieht er die Drehscheibe locker vom Hocker :)
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 »

Servos Franz,

Danke für Deine ausführliche Beschreibung und Test für die Stromversorgung.
Ich werde den Stepper aus einem 12V, 2,5A Steckernetzteil versorgen, dann habe ich noch etwas Reserve.
Durch die zu klein dimensionierte Stromversorgung entsteht eine Merkwürdigkeit: Beim Einschalten zuckt der Stepper kurz und fährt ca. 4 Schritte aus der Startposition. Das werde ich mal mit dem tollen Netzgerät, welches Du mir freundlicherweise überlassen hast - mit ca. 2A ausprobieren. Ergebnis wird gepostet.

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

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ja, das kann passieren wenn der Strom unterdimensioniert ist. Das hatte ich auch, dass der Motor ein paar Zuckungen macht und dann aufgibt :)
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,

für die Geräuschdämpfung des Stepper habe ich jetzt folgende Teile verbaut, welche ein wesentliche Verbesserung bringen. Preis -,70€ / :) Stück
Gummipuffer Silentblock Typ A M3 Ø 8  H 5.jpeg
Gummipuffer Silentblock Typ A M3 Ø 8 H 5.jpeg (14.24 KiB) 1167 mal betrachtet
schönen Abend
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Hast du im Arduino Forum mitgelesen :(V):
Das Thema mit den 7 Schrittmotoren :oo:

Ja, so ein Dämpfer ist schon was schönes. Eine feste Verbindung überträgt die Motorvibrationen schon sehr stark.

Bei meinem Testaufbau mit den drei Motoren ist das ja ok. Da darf / soll man deutlich hören, wie laut der Motor läuft.

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,

ich habe noch eine weitere Positon " > Ausfahrt 1B" auf Button8 hinzugefügt.

Code: Alles auswählen

  if (button.pressed(Button8) ) {                 // Taster8 gedrückt:
  //   fahrt = 4;
  //  disp();
  //  stopp = 4;
    
    myStepper.write( -330 );                      // dreht zur Ausfahrt Gleis1B - rückwärts
  }


Alternativ und vielleicht besser wäre:

Zeile 1: Dateinamen
Zeile 2. nach Tastendruck erscheint: "Referenzpunkt gesetzt"
Zeile 3: Anzeige des ausgewählten Menüpunktes z.B " > Einfahrt 1A oder <> Drehung 180 usw.
Zeile 4: mittig "Stopp bzw. Fahrt"

Aber langsam, so viele Wünsche werden erst an Weihnachten erfüllt. :lol: :lol: :lol:

Code: Alles auswählen

/*  Dateiname:      Drehscheibe_Franz54_final_2_3_mit_LCD    by e69-fan

    Beispiel: Stepper_03 von den MobaTools / MoToStepper - attaching a bipolar stepper with step/dir and enable
    
    StepperMotor ACT 17HS4417L20P1X2
    TB6600 Schrittmotor-Treiber-Modul
    
    16 MicroStep - 3200 Pulse/Rev -       S1 OFF  / S2 OFF  / S3 ON
    Current Control Setting:  1,5 Ampere  S4 ON   / S5 ON   / S6 OFF
    
    max. Drehwinkel 370 Grad, dann zurück
    Referenzpunkt bei Position "Einfahrt" in Einzelschritten links/rechts setzen, Bestätigung mit LED
    Blinklicht AN während der Bühnendrehung

    optionale Infoausgabe an LCD-Display 20x4   // A4 =SDA; A5 =SCL; 5V Plus; Masse

    Danke an MicroBahner und Franz54  https://www.franzls-technik-forum.de
                                      https://arduino-fan.de/
*/

#define MAX8BUTTONS
#include <MobaTools.h>

// ------------------------------------------------- Display --------------------------------------------------------------- //
#include <LiquidCrystal_I2C.h>      // LCD Display
LiquidCrystal_I2C lcd(0x27,20,4);   // set the LCD address to 0x27 for a 20 chars and 4 line display
                                    // A4 = SDA, grün; A5 = SCL, blau; +5V, rot; Ground, schwarz;
byte stopp = 4;
byte fahrt = 4;

// ------------------------------------------------- Deklaration Blinklicht ------------------------------------------------ //
int LED_PIN = 2;                // Blink-LED auf D2
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 dirPin             = 5;      //  orange
const byte stepPin            = 6;      //  lila
const byte enaPin             = 7;      //  grau

const byte LinksPin           = A1;     //  rot  / 4 steps nach links
const byte RechtsPin          = A2;     //  grün / 4 steps nach rechts
const byte RefPin             = A3;     //  grau / RefPunkt setzen - RefLED leuchtet
const byte RefLED             = 13;     //  gelb

const byte EinfahrtPin        = 8 ;     //  grün   / Einfahrt Gleis1A - Lok steht vorwärts
const byte V_Ausfahrt_1bPin   = 9 ;     //  gelb   / Ausfahrt Gleis1B - Lok steht vorwärts
const byte WendePin           = 10;     //  blau   / Wendung 180 Grad - Lok steht 
const byte SchuppenPin        = 11;     //  grau   / Lokschuppen      - Lok steht
const byte R_Ausfahrt_1bPin   = 12;     //  orange / Ausfahrt Gleis1B - Lok steht rückwärts

const byte potPin             = A0;     //  gelb - Analog Poti Eingang - für Geschwindigkeitsregulierung Steppermotor

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,     Button8          } ;    // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin,     RechtsPin,  RefPin,   EinfahrtPin,  V_Ausfahrt_1bPin, WendePin, SchuppenPin, R_Ausfahrt_1bPin } ;    // 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

// ------------------------------------------------- setup ------------------------------------------------------------------ //
void setup() 
{
  lcd.init();                      // initialize the lcd-display
  // Ausgabe am LCD-Display
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F(">  Einfahrt 1A"));                        
  lcd.setCursor (0, 1);
  lcd.print (F("<  Ausfahrt 1B"));                  
  lcd.setCursor (0, 2);
  lcd.print (F("<> Drehung 180"));
  lcd.setCursor (0, 3);
  lcd.print (F(">  Lokschuppen")); 
  
  // lcd.setCursor (0, 4);
  // lcd.print (F("Taster 5"));


  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
}


  // ------------------------------------------------- loop ------------------------------------------------------------------- //
void loop() {
  BLINKIO = myStepper.stepsToDo();
  AktuellMilles = millis();
  if (AktuellMilles - VorherMilles >= delayTime) {
    VorherMilles = AktuellMilles;
    LED = !LED;
    if (BLINKIO == 0) {
      LED = 0;
      if (stopp < 4)
      {
        lcd.setCursor (15,(stopp));
        lcd.print (F("Stopp"));
        stopp = 4;
      }
    }
    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)&& (fahrt == 4)) {   // Taster4 gedrückt:
    fahrt = 0;
    disp();
    stopp = 0;
    myStepper.write( 0 );                         // dreht zurück zur Einfahrt Gleis1A
  }
  if (button.pressed(Button5) ) {                 // Taster5 gedrückt
    fahrt = 1;
    disp();
    stopp = 1;
    myStepper.write( 50 );                        // dreht  zur Ausfahrt Gleis1B - vorwärts
  }
  if (button.pressed(Button6) ) {                 // Taster6 gedrückt:
    fahrt = 2;
    disp();
    stopp = 2;
    myStepper.write( -180 );                      // wendet die Bühne um 180 Grad
  }
  if (button.pressed(Button7) ) {                 // Taster7 gedrückt:
     fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -250 );                      // dreht zur Abfahrt: Lokschuppen
  }

  if (button.pressed(Button8) ) {                 // Taster8 gedrückt:
  //   fahrt = 4;
  //  disp();
  //  stopp = 4;
    
    myStepper.write( -330 );                      // dreht zur Ausfahrt Gleis1B - rückwärts
  }
}

// ------------------------------------------------- void für Display ----------------------------------------------------- //
void disp()
{
  lcd.setCursor (15, 0);
  lcd.print (F("     "));
  
  lcd.setCursor (15, 1);
  lcd.print (F("     "));
  
  lcd.setCursor (15, 2);
  lcd.print (F("     "));
  
  lcd.setCursor (15, 3);
  lcd.print (F("     "));

  // lcd.setCursor (15, 4);
  // lcd.print (F("     "));
  
  lcd.setCursor (15, (fahrt));
  lcd.print (F("Fahrt"));
  
  fahrt = 4;
  
  // ------------------------------------------------- Ende ----------------------------------------------------------------  //
}
PS. Sind die Eistellungen für den Stepper so i.O. ??

Grüße an Deine Lieben
Wolfgang
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ja, das mit den Einstellungen haut hin.

Ich war jetzt ein bischen ausser Betrieb. Mit den Augentropfen die ich bekam, ist es egal ob ich die Brille auf habe, oder nicht. Ich habe immer genauso wenig gesehen :shock: Da hatte ich meine Frau als Blindenhund und Fahrer dabei. Am 5.Mai habe ich meine Augen OP. Dann sollte ich wieder besser sehen. Im Moment wird es zügig immer schlechter :evil:

Am 6.Mai kommt die Augenklappe dann schon wieder runter, dann sollte ich wieder sehen wie vor dem graune Staar. Da bin ich gespannt. :(oo):
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ich habe jetzt mal diese Ändern gemacht. Habe nur das fünfte Drehscheiben Ziel noch nicht ergänzt. Und das mit dem "Referenzpunkt gesetzt" sollte jetzt auch gehen.

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>

#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//-----  individuelle Definitionen  -------------------------------------------------- //

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

// ----------------------------------------------------
//TMC2209 = 5,6,7 - TB6600 = 36,35,34 - DM556 = 32,31,30
const byte RefLED       = 12;
const byte dirPin       = 36;
const byte stepPin      = 35;
const byte enaPin       = 34;

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 TreiberUm    = 24;

const byte potPin       = A0;       // Analog Poti Eingang

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


// -----  Stepper einrichten ( 3200 Schritte / Umdrehung - 1/8 Microstep )-------------------------------------------  //
const int STEPS_REVOLUTION = 3200;                   // Schritte Auftrag für TCM2208 nur 1600

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

// -----  Taster einrichten  ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 } ;                            // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, WendePin, SchuppenPin, Gleis_1bPin, AusfahrtPin, TreiberUm };    // 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);

  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("MobaStep._03_Test_3"));
  lcd.setCursor (0, 1);
  lcd.print (F("Referenzpunkt ??   "));
  lcd.setCursor (0, 2);
  lcd.print (F("Gleis ?            "));
  lcd.setCursor (0, 3);
  lcd.print (F("       -----       "));
  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;
      if (stopp < 4)
      {
        lcd.setCursor (0, stopp); // Ausgabe Position für das Wort "Stopp" übergeben
        lcd.print (F("       Stopp       "));
        stopp = 4;
      }
    }
    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);
    lcd.setCursor (0, 1);
    lcd.print (F("Referenzpunkt   OK  "));
  }

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

  if ((button.pressed(Button4)) && (fahrt == 4)) {  // Taster4 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("180 Grad Wende      "));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -180 );          // wendet die Bühne um 180 Grad
  }

  if ((button.pressed(Button5)) && (fahrt == 4)) {  // Taster5 gedrückt
    lcd.setCursor (0, 2);
    lcd.print (F("Abfahrt Lockschuppen"));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -250 );          // dreht zur Abfahrt: Lokschuppen
  }

  if ((button.pressed(Button6)) && (fahrt == 4)) {  // Taster6 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("Ausfahrt Gleis 1B   "));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -330 );          // dreht zur Ausfahrt Gleis1B -330
  }

  if ((button.pressed(Button7)) && (fahrt == 4)) {  // Taster7 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("Einfahrt Gleis 1A   "));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( 0 );             // dreht zurück zur Einfahrt Gleis1A
  }
  if ((button.pressed(Button8)) && (fahrt == 4)) {  // Taster8 gedrückt:

    tone(3, 440, 1000);
  }
}
void disp()
{
  lcd.setCursor (0, 3);
  lcd.print (F("                   "));
  lcd.setCursor (0, (fahrt));// Position (Zeile) für das Wort "Fahrt"
  lcd.print (F("       Fahrt       "));
  fahrt = 4;
}

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 »

Admin hat geschrieben: Fr 23. Apr 2021, 12:45 Ich habe jetzt mal diese Ändern gemacht. Habe nur das fünfte Drehscheiben Ziel noch nicht ergänzt. Und das mit dem "Referenzpunkt gesetzt" sollte jetzt auch gehen.

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>

#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//-----  individuelle Definitionen  -------------------------------------------------- //

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

// ----------------------------------------------------
//TMC2209 = 5,6,7 - TB6600 = 36,35,34 - DM556 = 32,31,30
const byte RefLED       = 12;
const byte dirPin       = 36;
const byte stepPin      = 35;
const byte enaPin       = 34;

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 TreiberUm    = 24;

const byte potPin       = A0;       // Analog Poti Eingang

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


// -----  Stepper einrichten ( 3200 Schritte / Umdrehung - 1/8 Microstep )-------------------------------------------  //
const int STEPS_REVOLUTION = 3200;                   // Schritte Auftrag für TCM2208 nur 1600

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

// -----  Taster einrichten  ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 } ;                            // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, WendePin, SchuppenPin, Gleis_1bPin, AusfahrtPin, TreiberUm };    // 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);

  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("MobaStep._03_Test_3"));
  lcd.setCursor (0, 1);
  lcd.print (F("Referenzpunkt ??   "));
  lcd.setCursor (0, 2);
  lcd.print (F("Gleis ?            "));
  lcd.setCursor (0, 3);
  lcd.print (F("       -----       "));
  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;
      if (stopp < 4)
      {
        lcd.setCursor (0, stopp); // Ausgabe Position für das Wort "Stopp" übergeben
        lcd.print (F("       Stopp       "));
        stopp = 4;
      }
    }
    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);
    lcd.setCursor (0, 1);
    lcd.print (F("Referenzpunkt   OK  "));
  }

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

  if ((button.pressed(Button4)) && (fahrt == 4)) {  // Taster4 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("180 Grad Wende      "));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -180 );          // wendet die Bühne um 180 Grad
  }

  if ((button.pressed(Button5)) && (fahrt == 4)) {  // Taster5 gedrückt
    lcd.setCursor (0, 2);
    lcd.print (F("Abfahrt Lockschuppen"));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -250 );          // dreht zur Abfahrt: Lokschuppen
  }

  if ((button.pressed(Button6)) && (fahrt == 4)) {  // Taster6 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("Ausfahrt Gleis 1B   "));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -330 );          // dreht zur Ausfahrt Gleis1B -330
  }

  if ((button.pressed(Button7)) && (fahrt == 4)) {  // Taster7 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("Einfahrt Gleis 1A   "));
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( 0 );             // dreht zurück zur Einfahrt Gleis1A
  }
  if ((button.pressed(Button8)) && (fahrt == 4)) {  // Taster8 gedrückt:

    tone(3, 440, 1000);
  }
}
void disp()
{
  lcd.setCursor (0, 3);
  lcd.print (F("                   "));
  lcd.setCursor (0, (fahrt));// Position (Zeile) für das Wort "Fahrt"
  lcd.print (F("       Fahrt       "));
  fahrt = 4;
}


:(V): :(V): :(V): Schulterklopfen: Das mit der Anzeige läuft super - ich habe nur noch die PinNr. angepaßt und

Code: Alles auswählen

lcd.init();
rein und ab geht die Lok.

So, und jetzt kommt der große Fahrradcheck für die Ausfahrt.

Schönen Samstag
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ja, und das noch anpassen:

Ich hatte da nur nen Bestätigungston zum Test drin.

Code: Alles auswählen

if ((button.pressed(Button8)) && (fahrt == 4)) {  // Taster8 gedrückt:

    tone(3, 440, 1000);
  }
  
Ändern auf:

Code: Alles auswählen

if ((button.pressed(Button8)) && (fahrt == 4)) {  // Taster8 gedrückt:
    lcd.setCursor (0, 2);
    lcd.print (F("Gleis ??            "));	// Hier noch der Text 20 Zeichen lang
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( -100 );             // Wohin ?? Die Schritte zum Ziel
  }
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast