Schrittmotorsteuerung für Drehscheibe

Fertige Geräte mit Bilden, Schaltungen, Programmen vorstellen.
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Schrittmotorsteuerung für Drehscheibe

Beitrag von e69-fan »

Hallo Franz,
ich hab hier mal einen Sketch für meine Drehscheibe zusammengestellt. Da Ergebnis ist eher mittelprächtig. Der Billigstepper und die Treiberplatine sollten ausgetauscht werden. Die MobaTools sind nicht unbedingt Bedingung und könnten durchaus ersetzt werden.

Frage: Wie soll ich weiter vorgehen um die Drehscheibe einsetzen zu können?

Bitte um Hilfe.

Code: Alles auswählen

/*  Drehscheibensteuerung für Feldbahn H0e Rev0
    2020 /e69-fan
    Drehbühnenstellung kann per Taster links/rechts bei jeder Position justiert werden
    Positionen der Drehbühne: Pos2 / 360 Grad gedreht-Gleis 1a
                              Pos3 / vorwärts-Lokschuppen
                              Pos4 / vorwärts-Richtung Gleis 1b
                              Pos0 / 0 Grad Einfahrt Gleis 1a

    Steppermotor und Treiber sollen durch NEMA17 https://www.pollin.de/p/schrittmotor-minebea-17pm-k374bn01cn-1-80-310690 ersetzt werden.
    geeigneter Motortreiber muß noch definiert werden.

    es müßten noch die Taster entprellt werden. - aber wie ???
*/

#include <MobaTools.h>

const int DownPin     = 10;      // weiß    - Justiertaster - Down
const int UpPin       = 11;      // violet  - Justiertaster - UP
const int ReferenzPin = 12;      // gelb    - Referenzpunkt setzen

const int Pos0        = A1;      // grün     0 Grad   Einfahrt von Gleis 1a
const int Pos1        = A2;      // blau     360 Grad gedreht nach Gleis 1a
const int Pos2        = A3;      // braun             Lokschuppen, vorwärts
const int Pos3        = A4;      // grau              Ausfahrt von Gleis 1b


int tasterStatusDown, tasterStatusUp, tasterStatusRef, tasterStatusPos0, tasterStatusPos1, tasterStatusPos2, tasterStatusPos3;

MoToStepper stepper(4096);            // Anzahl der Schritte des Motor´s ( 28BYJ-48 ) 2048
MoToTimer   delayTime;

void setup() {
  stepper.attach (  4, 5, 6, 7 );      // Nr. der Pins für den Stepper
  pinMode(DownPin,     INPUT_PULLUP);  // Schrittschalter schaltet nach Gnd
  pinMode(UpPin,       INPUT_PULLUP);  // Schrittschalter schaltet nach Gnd
  pinMode(ReferenzPin, INPUT_PULLUP);  // RefernzPin schaltet nach Gnd

  pinMode(Pos0,        INPUT_PULLUP);  // 0 Grad   Einfahrt von Gleis 1a
  pinMode(Pos1,        INPUT_PULLUP);  // 360 Grad gedreht nach Gleis 1a
  pinMode(Pos2,        INPUT_PULLUP);  //          Lokschuppen, vorwärts
  pinMode(Pos3,        INPUT_PULLUP);  //          Ausfahrt von Gleis 1b
  
  stepper.setSpeed(15);                // Betrieb-Geschwindigkeit in Rpm * 10
  stepper.setRampLen(100);             // Sanftes Anfahren und Anhalten
}

void loop() {
  tasterStatusDown = digitalRead(DownPin);
  tasterStatusUp   = digitalRead(UpPin);
  tasterStatusRef  = digitalRead(ReferenzPin);
  
  tasterStatusPos0 = digitalRead(Pos0);
  tasterStatusPos1 = digitalRead(Pos1);
  tasterStatusPos2 = digitalRead(Pos2);
  tasterStatusPos3 = digitalRead(Pos3);

  stepper.setSpeed(15);                // Betrieb-Geschwindigkeit in Rpm * 10
  stepper.setRampLen(100);             // Sanftes Anfahren und Anhalten

  // ------------------------------------  Justieren ----------------------------------- //

  if (tasterStatusDown == LOW) {
    stepper.setSpeed(10);
    stepper.doSteps(1);                // rot - 5 Steps nach links justieren
  }

  if (tasterStatusUp  == LOW) {
    stepper.setSpeed(20);
    stepper.doSteps(-1);               // grün - 5 Steps nach rechts justieren
  }

  if (tasterStatusRef  == LOW) {       // schwarz - Justage in Ordnung - Refernezpunkt setzen
    digitalWrite(LED_BUILTIN, HIGH);
    stepper.setZero();
    delayTime.setTime(20);
    digitalWrite(LED_BUILTIN, LOW);
  }

  // ------------------------------------  Betrieb ------------------------------------- //

  if (tasterStatusPos0 == LOW && !delayTime.running() ) {
    stepper.write(0);            // 0 Grad   Einfahrt von Gleis 1a
    delayTime.setTime(10);
  }
  
  if (tasterStatusPos1 == LOW && !delayTime.running() ) {
    stepper.write(-176);         // 360 Grad gedreht nach Gleis 1a
    delayTime.setTime(10);
  }

  if (tasterStatusPos2 == LOW && !delayTime.running() ) {
    stepper.write(-40);         // Lokschuppen, Vorwärts
    delayTime.setTime(10);
  }
  if (tasterStatusPos3 == LOW && !delayTime.running() ) {
    stepper.write(-150);         // Ausfahrt von Gleis 1b
    delayTime.setTime(10);
  }

  


  // --------------------------------------------------------------------------------------------------- //
}
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ich habe jetzt mal ein Testprogramm von MobaTools auf einen Mega geladen und zwei Tasten und einen Nema17 angeschlossen. Die MobaTools fragen hier die Tasten ab, und steuern den Motor. Das läuft wunderbar. Ist natürlich mal ein Testprogramm, um zu sehen was hier wie funktioniert.

Hier das Programm:

Code: Alles auswählen

////////// Example 3 for MoToStepper - attaching a bipolar stepper with step/dir and enable ////////////
/*  Beispiel für die Ansteuerung eines bipolaren Steppers über 4 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
    Button1:  Dreht rechts, solange Taster gedrückt
    Button2:  Dreht links, solange Taster gedrückt
    Button3:  1 Umdrehung rechts
    Button4:  1 Umdrehung links
*/

#define MAX8BUTTONS // spart Speicher, da nur 4 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
#include <LiquidCrystal_I2C.h> // LCD Display
// -------------LCD Display Acresse 0x3F oder 0x27----------------
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Pindefinitions - change to your needs
const byte dirPin       = 5;
const byte stepPin      = 6;
const byte enaPin       = 7;
const byte button1Pin   = 8;
const byte button2Pin   = 9;
const byte button3Pin   = 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 = 300;

const int STEPS_REVOLUTION = 6400; //Schritte Auftrag
//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[] = { button1Pin, button2Pin, button3Pin, 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()
{
  //-----Display
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print (F("    MOBA Stepper"));
  lcd.setCursor (0, 1);
  lcd.print (F("--------------------"));
  lcd.setCursor (0, 2);
  lcd.print (F("Umdrehungen"));
  lcd.setCursor (0, 3);
  lcd.print (F("Ramp"));
  lcd.setCursor (10, 3);
  lcd.print (F("Speed"));

  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;
  lcd.setCursor (13, 2);
  lcd.print (F("    "));
  lcd.setCursor (13, 2);
  lcd.print (Umdrehungen);
  lcd.setCursor (5, 3);
  lcd.print (F("    "));
  lcd.setCursor (5, 3);
  lcd.print (Rampe);
  tone(17, 400, 100);

  //-----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
    lcd.setCursor (16, 3);
    lcd.print (F("     "));
    lcd.setCursor (16, 3);
    lcd.print (vspeed);
    //min speed =2 and max speed =180 rpm
    myStepper.setSpeed( vspeed );
  }

  // Drehen rechtsrum
  if (button.pressed(Button1) ) {
    //Taster1 gedrückt
    myStepper.rotate( 1 );          // Stepper dreht vorwärts
  }
  if ( button.released(Button1) ) {
    //Taster1 losgelassen
    myStepper.rotate(0);             // Stepper stoppt
  }

  //Drehen linksrum
  if (button.pressed(Button2) ) {
    //Taster2 gedrückt
    myStepper.rotate( -1 );         // Stepper dreht rückwärts
  }
  if ( button.released(Button2) ) {
    //Taster2 losgelassen
    myStepper.rotate(0);            // Stepper stoppt
  }

  // 1 Umdrehung rechts {
  if (button.pressed(Button3) ) {
    tone(17, 1000, 100);
    //Taster3 wurde gedrückt
    myStepper.doSteps(STEPS_REVOLUTION);
  }

  // 1 Umdrehung links
  if (button.pressed(Button4) ) {
    tone(17, 1000, 100);
    //Taster4 wurde gedrückt
    myStepper.doSteps(-STEPS_REVOLUTION);
  }
}
Auf Pin5 ist die Richtung (Dir)
Auf Pin6 ist der Schrittackt (Step)
Auf Pin7 ist der Betrieb Ein /Aus (Enable)

Auf Pin8 - 11 Sind die Taster, die gegen GND liegen müßen. Man braucht keine Widerstande,weil die Pins mit Input pinup belegt sind.
Pin8 ist Vorwärts solange GND anliegt
Pin9 ist Rückwärts solange GND anliegt
Pin10 kurz gedrückt ist 8 Umdrehungen vorwärts
Pin11 kurz gedrückt ist 8 Umdrehungen rückwärts
Die Taster werden in der Library entprellt!!

Pin A0 ist der Eingang für ein Poti,damit bestimmt man das Tempo des Schrittmotors
Ist da kein Poti dran, muss man "vspeed" einen festen Wert von 20 - 240 verpassen, anstelle der Zeile 89
Also Zeile 89 auskommentieren,
//vspeed = map((analogRead(potPin)), 0, 1023, 20, 240); //Poti mappen auf 2 ... 240 Umdr/Min
und an deren Stelle,
vspeed = 240; // 240 für vollgas.
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,

Danke für die schnelle Antwort.
ich habe kein Display angeschlossen und bekomme folgende Fehlermeldung.
Wenn ich LiquidCrystal_I2C lcd auskommentiere läuft der Sketch.
Bin jetzt am Testen.


Arduino: 1.8.13 (Windows 10), Board: "Arduino Nano, ATmega328P (Old Bootloader)"

Drehscheibe_Franz54_orginal:18:53: error: 'POSITIVE' was not declared in this scope

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

^~~~~~~~

C:\Users\Internet\Desktop\Drehscheibe_Franz54_orginal\Drehscheibe_Franz54_orginal.ino:18:53: note: suggested alternative: 'ACTIVE'

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

^~~~~~~~

ACTIVE

exit status 1

'POSITIVE' was not declared in this scope
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ja,das Display ist bei mir so ein Standart Display, das ich an jedem Arduino drann habe, um das anzuzeigen, was mich im Programm - Ablauf gerade interessiert. Es ist billig, braucht als I2C Display nur zwei Pins vom Arduino, und ist sehr leicht in Betrieb zu nehmen. Noch leichter ist nur der Serial.print() Befehl für die Fehlersuche im Programm.

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

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Hallo Wofgang,
wie schaut´s aus. Ist das Testprogramm gut genug beschrieben, dass du die Funktionen in deinem Programm nutzen kannst? Das Poti das man da nutzen kann, um die Geschwindigkeit des Schrittmotors einzustellen, ist übrigens ein 5kOhm Poti, das an den eusseren Anschlüßen mit Plus und Minus 5 Volt angeschlossen wird und der Mittelanschluss vom Poti geht zum Analog Pin A0 vom Arduino. Dann muss natürlich die auskommentierte vspeed Zeile wieder rein. Die übergibt ja den eingestellten Wert in "vspeed" an´s Porgramm.

Schönen Sonntag,
Franz :(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 »

Servus Franz,

:(V): habe gem. anderen Anweisungen ein 10k Poti verbaut und werde das als erstes ändern.
Problem: Motor dreht viel zu schnell - 1x UM ungefähr 28 Umläufe ???

Vorschlag: Nenn mir doch Bitte mal ein Display damit wir dieselbe Hardwarekonfig. haben und ich Deinen TestSketch ohne Änderung zum Laufen bringe.

Ein weiteres Problem wird wahrscheinlich der Direktantrieb. Ich hab da eine Lösung mit 40- fach - Untersetzung gesehen https://www.digitalzentrale.de/main.php ... itemgr=199 ArtNr. 199002

:O: ich gehe jetzt FFP2-Masken kaufen
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Ich schätze mal du wirst in dem Fall keinen Unterschied haben, zwischen 5 und 10 kOhm.Also lasse es ruhig.Wenn du zu schnell bist, dann Musst du die Schritte pro umdrehung ändern. An deinem Treiber gibt es drei Eingänge, die du mit Brücken zu plus5V verbinden kannst. Ich glaube die heißen MS1/MS2/MS3 oder so ähnlich. Da gibt es auch eine Liste, welche Brücken was bewirken. Da kannst du die Schritte je Umdrehung von 200 bis (ich glaube) 1600 ändern. Je mehr Schritte pro Umdrehung, desto langsammer wird der Motor. Und auch genauer!!

Dein Treiber ist so viel ich mich erinnere der A4988 ?

Franz

PS: Hier habe ich mal ein PDF gemacht zum Thema Schritte je Umdrehung beim A4988:
http://pdf.franz-koehler.de/A4988-Schri ... rehung.pdf
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 »

Danke -

aber welches Display soll ich besorgen ?
Grüße aus der Heimat der E69
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,

Danke für Deine pdf, ich war der falschen Meinung, dass die 3 Pins per Software geschaltet werden.

10k Poti - 3x mal Plus = mit dieser Geschwindigkeit kann ich leben.

Ich musste die "steps per Revolution" auf const int STEPS_REVOLUTION = 3200; setzen, da bei 64oo = 2 Umläufe.

Super, 70 Euro für Getriebe gespart, die investieren wir lieber in eine Brotzeit.

Ich werde jetzt mal ein Drehscheibenmodell bauen und ein Display anschließen, dann können wir die einzelnen Abgänge ansteuern.

Welches Display soll ich mir kaufen?

Danke und servus
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Admin »

Wenn ich schnell Displays brauche, hole ich sie bei deutschen Anbietern. Zum Beispiel hier. Oder beim Eckstein.

Wenn ich Zeit habe und nur mal den Vorrat gelegentlich auffrischen möchte, bestelle ich diese Displays in China. Da muss man halt 4-6 Wochen Zeit haben.

Franz
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: Admin und 0 Gäste