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

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von e69-fan »

Hallo Forengemeinde,

um die Besonderheiten bei den unterschiedlichen Schrittmotoren aufzuzeigen und Re: Schrittmotorsteuerung für Drehscheibe übersichtlicher zu gestalten, eröffne ich ein neues Thema.

Der erste Teil handelt von der "billigsten" Ausführung: 28BYJ-48 ULN2003 STEPPER MOTOR DRIVER BOARD
28BYJ-48_stepper mit Treiber.jpg
28BYJ-48_stepper mit Treiber.jpg (32.3 KiB) 1911 mal betrachtet

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

Dafür ist wohl das Programm das Daniel probiert hat.
Ist natürlich nicht für die Treiber, die wir an den Nema 17, 23, 34 Motoren benutzen. Z.B. der TB6600, DM556, u.s.w.

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 »

Ja genau, darum versuche ich zu entflechten.

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

Hi Daniel
wie schauts aus, hast du schon bischen Bewegung in deiner Drehscheibe :) ....oder tut sich noch nichts?

Franz
Daniel-MOBA
Beiträge: 13
Registriert: Mo 20. Dez 2021, 11:09
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Daniel-MOBA »

Hallo Franz,

bin erst jetzt wieder dazu gekommen. Allerdings hänge ich jetzt hier fest.

compilation terminated.
exit status 1
SSD1306Ascii.h: No such file or directory

Gruß Daniel
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 Daniel,

das sind Bibliotheken welche für meinen Sketch benötigt werden.
#include <MobaTools.h>

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
Einfach über den Bibliotheksverwalter nachinstallieren.

Das ist der aktuelle Sketch:

Code: Alles auswählen

/*  Dateiname:      Drehscheibe_neu_2_1   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>

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
// A4 = SDA, grün; A5 = SCL, blau; +5V, rot; Ground, schwarz;


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

// -----------Declarationen Blinklicht-----------------
int LED_PIN = 2;               // Blink-LED auf D2
byte LED = LOW;
byte stopp = 8;
byte fahrt = 8;
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 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 / leuchtet wenn RefPunkt gesetzt
const byte piezo              = 3;      //  rot-weiß       / ?????????????????????????????????

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;       // 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,   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


// ----------------------------------------- S E T U P -----------------
void setup() {

  // ------------------OLED Display --------------------------------------
  Wire.begin();
  Wire.setClock(400000L);
#if RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else                                         // RST_PIN >= 0
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif                                        // RST_PIN >= 0
  oled.setFont(Callibri11);
  // ---------------------------------------------------------------------
  pinMode(RefLED, OUTPUT);
  digitalWrite(RefLED, LOW);
  pinMode(LED_PIN, OUTPUT);

  oled.setCursor (0, 0);
  oled.print (F("Drehscheibe_neu_2_1"));

  oled.setCursor (0, 2);
  oled.print (F("Referenzpunkt ?   "));

  oled.setCursor (0, 4);
  oled.print (F("Gleis ?            "));

  oled.setCursor (50, 16);   // 50er Einzug in Zeile 6
  oled.print (F("-----"));

  //-----  Stepper  -------------------------------------------------------------------- //
  Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;
  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 < 8)
      {

        oled.setCursor (0, stopp);               // Ausgabe Position für das Wort "Stopp" übergeben
        oled.print (F("       Stopp       "));   // durch Leerzeichen mittig ausgerichtet
        stopp = 8;
      }
    }
    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
    oled.setCursor (0, 2);
    oled.print (F("< Referenzpunkt ?     "));
    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
    oled.setCursor (0, 2);
    oled.print (F("> Referenzpunkt ?     "));
    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
    tone(3, 440, 300);                // Bestätigungston piezo an PIN3, Tonhöhe, ? - Dauer
    digitalWrite(RefLED, HIGH);
    oled.setCursor (0, 2);
    oled.print (F("Referenzpunkt   OK  "));

  }

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

  if ((button.pressed(Button4)) && (fahrt == 8)) {      // Taster4 gedrückt:
    tone(3, 150, 1000);    // tone(3, 440, 300);
    oled.setCursor (0, 4);
    oled.print (F("> Einfahrt Gleis 1A "));
    fahrt = 6;
    disp();
    stopp = 6;
    myStepper.write( 0 );                               // dreht zur Einfahrt Gleis1A zurück
    // zur Startposition
  }

  if ((button.pressed(Button5)) && (fahrt == 8)) {      // Taster5 gedrückt
    tone(3, 150, 1000);
    oled.setCursor (0, 4);
    oled.print (F("> Ausfahrt Gleis 1B "));
    fahrt = 6;
    disp();
    stopp = 6;
    myStepper.write( 50 );                              // dreht  zur Ausfahrt Gleis1B - vorwärts
  }

  if ((button.pressed(Button6)) && (fahrt == 8)) {      // Taster6 gedrückt:
    tone(3, 150, 1000);
    oled.setCursor (0, 4);
    oled.print (F("< 180 Wendung        "));
    fahrt = 6;
    disp();
    stopp = 6;
    myStepper.write( -180 );                            // wendet die Bühne um 180 Grad
  }

  if ((button.pressed(Button7)) && (fahrt == 8)) {      // Taster7 gedrückt:
    tone(3, 150, 1000);
    oled.setCursor (0, 4);
    oled.print (F("< Lokschuppen        "));
    fahrt = 6;
    disp();
    stopp = 6;
    myStepper.write( -250 );                            // dreht zur Abfahrt: Lokschuppen
  }

  if ((button.pressed(Button8)) && (fahrt == 8)) {      // Taster8 gedrückt:
    tone(3, 150, 1000);
    oled.setCursor (0, 4);
    oled.print (F("< Ausfahrt Gleis 1B "));
    fahrt = 6;
    disp();
    stopp = 6;
    myStepper.write( -100 );                            // dreht zur Ausfahrt Gleis1B - rückwärts
  }
}

void disp()
{
  oled.setCursor (0, (fahrt));
  oled.print (F("                   "));
  oled.setCursor (0, (fahrt));                           // Position (Zeile) für das Wort "Fahrt"
  oled.print (F("            Fahrt       "));

  fahrt = 8;
}
Schönen Tag - Wolfgang
Grüße aus der Heimat der E69
Daniel-MOBA
Beiträge: 13
Registriert: Mo 20. Dez 2021, 11:09
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Daniel-MOBA »

Hallo Wolfgang,

hatte immer das Falsche raus gesucht aus der Bibliothek. Jetzt
funktioniert er ohne Fehler. Werde heute Abend probieren.

Danke Dir.. :(oo):

Gruß Daniel
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, da bekommt man schnell mal die falsche Lib, weil es welche mit den selben Namen gibt, oder auch mal mit fast den selben Namen.
Aber schön wenn das Programm jetzt funktioniert. wenn du dann die Anschlüße auch passend hast, dann läuft das Ding.

Franz
Daniel-MOBA
Beiträge: 13
Registriert: Mo 20. Dez 2021, 11:09
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Daniel-MOBA »

So Ihr beiden,

habe kurz probiert, konnte nicht abwarten :)
Drehen usw. funktioniert auch. Rest werde ich wohl
heute abend oder Morgen probieren.

Gruß Daniel
Dateianhänge
canvas.png
canvas.png (419.35 KiB) 1899 mal betrachtet
Benutzeravatar
Franz54
Beiträge: 56
Registriert: Mo 20. Apr 2020, 10:12
Wohnort: 82441 Ohlstadt / Garmisch
Kontaktdaten:

Re: Schrittmotorsteuerung für Drehscheibe

Beitrag von Franz54 »

Na also, schaut doch gut aus. Zu den MobaTools gibt übrigens auch eine gute Beschreibung, die man leicht verstehen kann.

Grüße
Franz
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

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