Schrittmotorsteuerung für Drehscheibe
- Admin
- Administrator
- Beiträge: 1204
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Schrittmotorsteuerung für Drehscheibe
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
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
Re: Schrittmotorsteuerung für Drehscheibe
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
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
- Admin
- Administrator
- Beiträge: 1204
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Schrittmotorsteuerung für Drehscheibe
Ja, das kann passieren wenn der Strom unterdimensioniert ist. Das hatte ich auch, dass der Motor ein paar Zuckungen macht und dann aufgibt
Re: Schrittmotorsteuerung für Drehscheibe
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 schönen Abend
für die Geräuschdämpfung des Stepper habe ich jetzt folgende Teile verbaut, welche ein wesentliche Verbesserung bringen. Preis -,70€ / Stück schönen Abend
Grüße aus der Heimat der E69
- Admin
- Administrator
- Beiträge: 1204
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Schrittmotorsteuerung für Drehscheibe
Hast du im Arduino Forum mitgelesen
Das Thema mit den 7 Schrittmotoren
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
Das Thema mit den 7 Schrittmotoren
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
Re: Schrittmotorsteuerung für Drehscheibe
Hallo Franz,
ich habe noch eine weitere Positon " > Ausfahrt 1B" auf Button8 hinzugefügt.
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.
PS. Sind die Eistellungen für den Stepper so i.O. ??
Grüße an Deine Lieben
Wolfgang
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.
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 ---------------------------------------------------------------- //
}
Grüße an Deine Lieben
Wolfgang
- Admin
- Administrator
- Beiträge: 1204
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Schrittmotorsteuerung für Drehscheibe
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 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
Am 6.Mai kommt die Augenklappe dann schon wieder runter, dann sollte ich wieder sehen wie vor dem graune Staar. Da bin ich gespannt.
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 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
Am 6.Mai kommt die Augenklappe dann schon wieder runter, dann sollte ich wieder sehen wie vor dem graune Staar. Da bin ich gespannt.
- Admin
- Administrator
- Beiträge: 1204
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Schrittmotorsteuerung für Drehscheibe
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;
}
Re: Schrittmotorsteuerung für Drehscheibe
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; }
Schulterklopfen: Das mit der Anzeige läuft super - ich habe nur noch die PinNr. angepaßt und
Code: Alles auswählen
lcd.init();
So, und jetzt kommt der große Fahrradcheck für die Ausfahrt.
Schönen Samstag
Grüße aus der Heimat der E69
- Admin
- Administrator
- Beiträge: 1204
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Schrittmotorsteuerung für Drehscheibe
Ja, und das noch anpassen:
Ich hatte da nur nen Bestätigungston zum Test drin.
Ändern auf:
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);
}
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
}
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste