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 »

Also den TB6600 habe ich hier auch an meinen Nema 17 am laufen. Die sind schön im Strom einzustellen. Alles gut.

Ja, das Gespann läuft wunderbar. Da kannst du auch die Schritte je Umdrehung ganz Easy einstellen, von 200 bis 6400 Schritte. Das Zeug läuft recht gut.

Servus
Franz
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 mal wieder ein bischen weiter gesponnen. Ich habe hier wieder mein Display dran, und sehe immer wenn ich einen Knopf drücke, dass die Bühne gerade zur Ausfahrt Gleis B fährt, und wenn das Ziel erreicht ist, zeigt es an dass die Bühne bei Ausfahrt Gleis B steht. Ist nur ein Spass, ob du das brauchen kannst, weiß ich nicht. Kannst du nutzen oder nicht :)

Franz

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;

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

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);

  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("180 Grad Wende"));
  lcd.setCursor (0, 1);
  lcd.print (F("Abf. Lockschu."));
  lcd.setCursor (0, 2);
  lcd.print (F("Ausf. Gleis 1B"));
  lcd.setCursor (0, 3);
  lcd.print (F("Einf. Gleis 1A"));
  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 (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( -180 );          // wendet die Bühne um 180 Grad
  }

  if ((button.pressed(Button5)) && (fahrt == 4)) {  // Taster5 gedrückt
    fahrt = 1;
    disp();
    stopp = 1;
    myStepper.write( -250 );          // dreht zur Abfahrt: Lokschuppen
  }

  if ((button.pressed(Button6)) && (fahrt == 4)) {  // Taster6 gedrückt:
    fahrt = 2;
    disp();
    stopp = 2;
    myStepper.write( -330 );          // dreht zur Ausfahrt Gleis1B
  }

  if ((button.pressed(Button7)) && (fahrt == 4)) {  // Taster7 gedrückt:
    fahrt = 3;
    disp();
    stopp = 3;
    myStepper.write( 0 );             // dreht zurück zur Einfahrt Gleis1A
  }
}
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, (fahrt));
  lcd.print (F("Fahrt"));
  fahrt = 4;
}
Hier habe ich ein paar Bilder dazu:
http://bilder.franz-koehler.de/DSC01327.JPG
http://bilder.franz-koehler.de/DSC01328.JPG
http://bilder.franz-koehler.de/DSC01329.JPG
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 ist doch keine Spinnerei sondern Kreativität auf hohem Niveau.

Ich habe noch folgendes Display

https://www.az-delivery.de/products/azd ... 602-keypad

Bei meiner Schiebebühne ist so eins montiert. Da kann ich als erstes die Referenzfahrt durchführen und dann über verschiedene Menüpunkte die einzelnen Gleise anfahren.

Klar, Mann muss die Entwicklungskosten usw. einkalkulieren, aber weitere 200.- € wären mir zu teuer. Ich kann aber auch mit Taster leben obwohl ......
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 »

Ich habe mir heute mal den Endlos Servo MG995 richtig vorgenommen. Ich habe mir dafür mal schnell ein Programm bischen angepasst. Das sieht jetzt wie folgt aus:

Code: Alles auswählen

/*
  ||
  ||von 1 bis 180 auf den Servo Pin. 22 aus.
  ||Angepasst auf 80 - 102 für Test vom MG995
*/

#include <OneWire.h>
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <Servo.h>
Servo myservo1; // erstellt ein Servo-Objekt um einen Servomotor zu steuern
int val; // Variable um den Wert des Analogen Pin zwischen zu speichern
int i = 79;
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  myservo1.attach(22); // verknüpft den Servomotor an Pin 22 mit dem Servo-Objekt
}
//------------------------------------------------------------------------------
void loop() {

  if (i < 121) {
    i++;
    val = i;
  }
  lcd.setCursor (0, 0);
  lcd.print ("Der Wert: > ");
  lcd.print (val);
  lcd.print (" <");
  myservo1.write(val);// überträgt die Zielposition an den Servomotor
  delay(5000);
  if (i == 102)
  {
    i = 79;
  }
  if (i == 87)
  {
    i = 95;
  }
}
Der Servo läuft von 1 - 81 rechts Vollgas
von 82 - 85 wird er langsammer
86 - 96 läuft er nicht
ab 97 läuft er links langsam
bis 101 wird er schneller
über 101 ändert sich wieder nichts mehr.
Auf Position laufen geht nicht.

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,

auf so was ähnliches bin ich auch gekommen. Diese Servos sind eigentlich für laufende Umdrehungen gedacht und nicht zum positionieren.
Also die selbe Bewegung wie ein Elektromotor. Endlosdrehende Servos verwendet man im RC-Modellbau in Verbindung mit einer Funkfernsteuerung.
Servos sind dort leichter anzusteuern als E.Motoren.

Meine Überlegungen für einen Programablauf sind wie folgt:

1. Halte/ Stop - Punkt definieren - "digital.write 90 o.ä. "
2. Geschwindigkeit für beide Seiten ( links- rechtsrum ) festlegen
3. Zeit festlegen, wie lange der Servo in die jeweilige Richtung dreht - dann Stop

Anwendung: z.B. ein Kran mit einem Seil ( das Seil könnte man durch eine Gabellichtschranke führen und bei einer Markierung stoppen )

Aber das ganze ist nur ne Spielerei für ganz langweilige Corona-Tage. ;)

PS. Der Steppertreiber soll am Montag kommen und ich melde mich dann.

Servus - 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 »

O.K. schönen Abend noch.

Bis demnächst, Gruß
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 den Treiberbaustein bekommen.

Frage: Bei ENA, DIR PUL gibt es eine positive und negative Anschlussmöglichkeit. Wir ziehen doch den jeweiligen PIN am Arduino auf LOW - also müssten doch die PINs mit ENA - , DIR -, und PUL - , verbunden werden.
Ich habe aber noch nichts verdrahtet. Wie schaut es bei Dir zeitmäßig aus?

Ich wünsche Dir einen schönen Tag.
Wolfgang
P3090109.JPG
P3090109.JPG (99.32 KiB) 1081 mal betrachtet
P3090108.JPG
P3090108.JPG (93.5 KiB) 1081 mal betrachtet
P3090107.JPG
P3090107.JPG (94.67 KiB) 1081 mal betrachtet
P3090106.JPG
P3090106.JPG (113.99 KiB) 1081 mal betrachtet
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 »

Für PUL, DIR und ENA gilt. Du musst bei den Treibern immer Plus und Minus ansteuern. Wenn du mit Plus steuerst, also mit HIGH, musst du den Gegenpol fest auf LOW legen. Willst du mit LOW steuern, nimmst du den Minus Anschluss zum steuern, und legst den Gegenpol fest auf Plus.

Ich habe Morgen noch Vormittag und Nachmittag was vor. Aber Donnerstag und Freitag bin ich noch frei :) möglichst Nachmittags, weil ich vormittag gerne meine Ruhe habe.
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 »

Wäre Freitag 15:00 Uhr in Ordnung ?

Servus - Wolfgang
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 »

OK. Wunderbar - Alles klar. :(V):

Servus
Franz
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast