Seite 9 von 10

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: Mi 22. Dez 2021, 14:09
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) 2029 mal betrachtet

Servus - Wolfgang

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: Mi 22. Dez 2021, 22:31
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

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: Do 23. Dez 2021, 06:03
von e69-fan
Ja genau, darum versuche ich zu entflechten.

Servus - Wolfgang

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: Sa 25. Dez 2021, 12:20
von Admin
Hi Daniel
wie schauts aus, hast du schon bischen Bewegung in deiner Drehscheibe :) ....oder tut sich noch nichts?

Franz

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: So 26. Dez 2021, 11:46
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

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: So 26. Dez 2021, 12:44
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

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: So 26. Dez 2021, 13:35
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

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: So 26. Dez 2021, 14:12
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

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: So 26. Dez 2021, 14:22
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

Re: Schrittmotorsteuerung für Drehscheibe

Verfasst: Fr 31. Dez 2021, 08:50
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