RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#76 von fbstr , 22.03.2017 23:14

Zitat

schade, dass Du deinen Versuch nicht gespeichert hast.



So hatte ich mir das gedacht:

1
2
3
4
5
6
7
8
9
 
 if (buttonStatusStepClockwise == LOW)             // Wenn Taster gedrückt...
{
StepClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
 



Also erstmal einen Step machen.
Dann die 2 Sekunden starten
Und erst wenn die Zeit abgelaufen ist, weitere Drehungen machen
Allerdings hat das keinerlei Auswirkung und ich denke auch der Sketch kann so nicht funktionieren. Aber wie kann ich dem teil sagen es soll erstmal nur 1 Schritt machen, dann auf der einen Seite: nochmals Steps machen wenn der Taster zwischenzeitlich auf HIGH war (innerhalb der 2 Sekunden) und auf der anderen Seite nichts machen wenn der Taster gedrückt blieb (innerhalb der 2 Sekunden). Und nach den 2 Sekunden dann drehen falls der Taster immernoch gedrückt ist... :


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#77 von MicroBahner , 23.03.2017 21:16

Hallo Frank,
ich gehe mal davon aus, dass Du erstmal eine Lösung suchst, in der gleichen 'Technik' wie dein bisheriger Sketch, d.h. der Arduino bleibt blockierend in der Aktion solange die Taste gedrückt ist. Dann fehlt in deinem Ansatz eigentlich nur noch die Abfrage, ob die Taste noch gedrückt ist:

1
2
3
4
5
6
7
8
9
10
11
12
13
 
    if (buttonStatusStepClockwise == LOW)             // Wenn Taster gedrückt...
{
StepClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while ( digitalRead( buttonStepClockwise ) == LOW ) // solange die Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
 
 


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.834
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#78 von fbstr , 23.03.2017 22:59

Zitat

Dann fehlt in deinem Ansatz eigentlich nur noch die Abfrage, ob die Taste noch gedrückt ist:



Hallo Franz-Peter,

genial - es funktioniert so wie ich es gehofft habe.
Habe jetzt beide Step-Taster mit der while-Abfrage ausgestattet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
 

// Drehscheibe TimeWaster, Frank Becker 2017
// Version 1.4 while-Abfrage der Step-Tasten hinzugefügt
// UNO R3 Com6, Motor Shield v2.0
 

// For use with the Adafruit Motor Shield v2
// ----> http://www.adafruit.com/products/1438
 

 
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <MobaTools.h>
 
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);
 
// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #1 (M1 and M2)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 1);
 
const byte buttonFullTurnClockwise = 8 ; //Taster 180Grad Uhrzeigersinn
const byte buttonFullTurnCounterClockwise = 9 ; //Taster 180Grad gegen Uhrzeigersinn
const byte buttonStepClockwise = 10 ; //Taster Step Uhrzeigersinn
const byte buttonStepCounterClockwise = 11 ; //Taster Step gegen Uhrzeigersinn
const byte buttonRelease = 12 ; //Taster um Motor stromlos zu schaltem
 
byte buttonStatusFullTurnClockwise = 0 ;
byte buttonStatusFullTurnCounterClockwise = 0 ;
byte buttonStatusStepClockwise = 0 ;
byte buttonStatusStepCounterClockwise = 0 ;
byte buttonStatusRelease = 0 ;
 
EggTimer myTimer2sec ; //Timer für 2 Sekunden
 
byte i; //Zählvariable
 
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
 
pinMode(buttonFullTurnClockwise, INPUT);
pinMode(buttonFullTurnCounterClockwise, INPUT);
pinMode(buttonStepClockwise, INPUT);
pinMode(buttonStepCounterClockwise, INPUT);
pinMode(buttonRelease, INPUT);

AFMS.begin(1600); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(10); // original 10 rpm
}
 
void loop() {
 
// Stati der Taster einlesen
 
buttonStatusFullTurnClockwise = digitalRead(buttonFullTurnClockwise);
buttonStatusFullTurnCounterClockwise = digitalRead(buttonFullTurnCounterClockwise);
buttonStatusStepClockwise = digitalRead(buttonStepClockwise);
buttonStatusStepCounterClockwise = digitalRead(buttonStepCounterClockwise);
buttonStatusRelease = digitalRead(buttonRelease);

if (buttonStatusFullTurnClockwise == LOW) // Wenn Taster gedrückt...
{
FullTurnClockwise(); // ... Funktion ausführen
}
if (buttonStatusFullTurnCounterClockwise == LOW) // Wenn Taster gedrückt...
{
FullTurnCounterClockwise(); // ... Funktion ausführen
}
if (buttonStatusStepClockwise == LOW) // Wenn Taster gedrückt...
{
StepClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while (digitalRead(buttonStepClockwise)==LOW) // solange Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
if (buttonStatusStepCounterClockwise == LOW) // Wenn Taster gedrückt...
{
StepCounterClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while (digitalRead(buttonStepCounterClockwise)==LOW) // solange Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepCounterClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
if (buttonStatusRelease == LOW) // Wenn Taster gedrückt...
{
myMotor->release(); // ... Schrittmotor stromlos schalten
}
}
 
void FullTurnClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung (733 steps)im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(10); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(30); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(40); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(255); // original 10 rpm
myMotor->step(653, FORWARD, MICROSTEP);
myMotor->setSpeed(40); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(30); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(10); // original 10 rpm
myMotor->step(10, FORWARD, MICROSTEP);
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(15, FORWARD, MICROSTEP);
myMotor->step(8, BACKWARD, MICROSTEP);
myMotor->step(3, FORWARD, MICROSTEP);
}
 
void FullTurnCounterClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung gegen Uhrzeigersinn");
myMotor->setSpeed(255); // original 10 rpm
myMotor->step(733, BACKWARD, MICROSTEP);
}
 
void StepClockwise() { // Definition als Funktion
Serial.println("1 Step im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(1, FORWARD, MICROSTEP);
delay(100);
}
 
void StepCounterClockwise() { // Definition als Funktion
Serial.println("1 Step im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(1, BACKWARD, MICROSTEP);
delay(100);
}
 

 



Vielen Dank!


Ich bin gespannt was dann der Unterschied sein wird, wenn ich die Moba-Tools beim anderen Motor-Shield einsetzen werde.


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#79 von fbstr , 26.03.2017 11:55

Bei den Geschwindigkeiten (myMotor->setSpeed) sehe ich keine Unterschiede bei Speed >160.
Mit 2 for-Schleifen habe ich versucht die Beschleunigung und Abbremsen etwas eleganter zu lösen.
Aktueller Sketch:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
 

// Drehscheibe TimeWaster, Frank Becker 2017
// Version 1.5 For Abfrage für Beschleunigen und Abbremsen
// Version 1.4 while-Abfrage der Step-Tasten hinzugefügt
// UNO R3 Com6, Motor Shield v2.0
 

// For use with the Adafruit Motor Shield v2
// ----> http://www.adafruit.com/products/1438
 

 
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <MobaTools.h>
 
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);
 
// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #1 (M1 and M2)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 1);
 
const byte buttonFullTurnClockwise = 8 ; //Taster 180Grad Uhrzeigersinn
const byte buttonFullTurnCounterClockwise = 9 ; //Taster 180Grad gegen Uhrzeigersinn
const byte buttonStepClockwise = 10 ; //Taster Step Uhrzeigersinn
const byte buttonStepCounterClockwise = 11 ; //Taster Step gegen Uhrzeigersinn
const byte buttonRelease = 12 ; //Taster um Motor stromlos zu schaltem
 
byte buttonStatusFullTurnClockwise = 0 ;
byte buttonStatusFullTurnCounterClockwise = 0 ;
byte buttonStatusStepClockwise = 0 ;
byte buttonStatusStepCounterClockwise = 0 ;
byte buttonStatusRelease = 0 ;
 
EggTimer myTimer2sec ; //Timer für 2 Sekunden
 
byte i; //Zählvariable
 
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
 
pinMode(buttonFullTurnClockwise, INPUT);
pinMode(buttonFullTurnCounterClockwise, INPUT);
pinMode(buttonStepClockwise, INPUT);
pinMode(buttonStepCounterClockwise, INPUT);
pinMode(buttonRelease, INPUT);

AFMS.begin(3000); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(10); // original 10 rpm
}
 
void loop() {
 
// Stati der Taster einlesen
 
buttonStatusFullTurnClockwise = digitalRead(buttonFullTurnClockwise);
buttonStatusFullTurnCounterClockwise = digitalRead(buttonFullTurnCounterClockwise);
buttonStatusStepClockwise = digitalRead(buttonStepClockwise);
buttonStatusStepCounterClockwise = digitalRead(buttonStepCounterClockwise);
buttonStatusRelease = digitalRead(buttonRelease);

if (buttonStatusFullTurnClockwise == LOW) // Wenn Taster gedrückt...
{
FullTurnClockwise(); // ... Funktion ausführen
}
if (buttonStatusFullTurnCounterClockwise == LOW) // Wenn Taster gedrückt...
{
FullTurnCounterClockwise(); // ... Funktion ausführen
}
if (buttonStatusStepClockwise == LOW) // Wenn Taster gedrückt...
{
StepClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while (digitalRead(buttonStepClockwise)==LOW) // solange Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
if (buttonStatusStepCounterClockwise == LOW) // Wenn Taster gedrückt...
{
StepCounterClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while (digitalRead(buttonStepCounterClockwise)==LOW) // solange Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepCounterClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
if (buttonStatusRelease == LOW) // Wenn Taster gedrückt...
{
myMotor->release(); // ... Schrittmotor stromlos schalten
}
}
 
void FullTurnClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung (733 steps)im Uhrzeigersinn");
for (i=0; i<160; i++) {
myMotor->setSpeed(i);
myMotor->step(1, FORWARD, MICROSTEP);
}
myMotor->setSpeed(160); // >160rpm keine Geschwindigkeitsvergößerung bemerkbar
myMotor->step(414, FORWARD, MICROSTEP);
for (i=0; i<160; i++) {
myMotor->setSpeed(160-(i));
myMotor->step(1, FORWARD, MICROSTEP);
}
}
 
void FullTurnCounterClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung gegen Uhrzeigersinn");
for (i=0; i<160; i++) {
myMotor->setSpeed(i);
myMotor->step(1, BACKWARD, MICROSTEP);
}
myMotor->setSpeed(160); // >160rpm keine Geschwindigkeitsvergößerung bemerkbar
myMotor->step(414, BACKWARD, MICROSTEP);
for (i=0; i<160; i++) {
myMotor->setSpeed(160-(i));
myMotor->step(1, BACKWARD, MICROSTEP);
}
}
 
void StepClockwise() { // Definition als Funktion
Serial.println("1 Step im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(1, FORWARD, MICROSTEP);
}
 
void StepCounterClockwise() { // Definition als Funktion
Serial.println("1 Step im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(1, BACKWARD, MICROSTEP);
}
 

 


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#80 von fbstr , 28.03.2017 21:21

Zitat

Zitat

http://www.ebay.de/itm/CNC-V3-Shield-UNO...rcAAOSwHMJYI3wd


Ich habe mal 2 von diesen bestellt. Müßten Anfang April dann da sein.




Gestern kam schon das Päckchen an. Morgen gehts aber erstmal ins KH um den Nierenstein loszukriegen.
Wenn alles klappt kann ich nächste Woche mich dann wieder mit dem Thema beschäftigen.

Was ich schon als Frage habe:
- Anscheinend kann man mit diesem MotorShield nur Schrittmotoren mit 4 Anschlußkabeln betreiben, richtig?
- Die Platine ist für 4 Schrittmotoren ausgelegt und belegt dadurch praktisch alle Pins vom UNO. Da ich aber pro Arduino nur 1 Schrittmotor betreiben will, kann ich dann die anderen Pins verwenden? Z.B. für 2 Servos (Gleissperrsignale), Licht und Hallsensor(en), sowie Taster zur Steuerung.

Bis bald


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#81 von michl080 , 29.03.2017 10:03

Zitat
Gestern kam schon das Päckchen an. Morgen gehts aber erstmal ins KH um den Nierenstein loszukriegen.
Was ich schon als Frage habe:
- Anscheinend kann man mit diesem MotorShield nur Schrittmotoren mit 4 Anschlußkabeln betreiben, richtig?
- Die Platine ist für 4 Schrittmotoren ausgelegt und belegt dadurch praktisch alle Pins vom UNO. Da ich aber pro Arduino nur 1 Schrittmotor betreiben will, kann ich dann die anderen Pins verwenden? Z.B. für 2 Servos (Gleissperrsignale), Licht und Hallsensor(en), sowie Taster zur Steuerung.


moinmoin Frank,

bei Motoren mit 6 Anschlüssen sind 2 Spulen mit Mittelanzapfung verbaut. Du kannst die Mittelanzapfung einfach frei lassen. Mit einem Widerstandsmesser kannst Du die Anschlüsse identifizieren. Der Widerstand in beiden Teilwicklungen einer Spule ist gleich. Du musst die Anschlüsse mit dem grössten Widerstand dazwischen suchen.

Wenn Du die Module unbestückt lässt, sollten die entsprechenden Anschlüsse anderweitig verwendbar sein. Allerdings kann es sein, dass zugehörige Software alle Kanäle belegt, dann ist Handarbeit in der Software angesagt.

Viel Spass mit Deinen Nierensteinen Ich hatte mal Gallensteine....

Michael


meine Anlage findest Du unter viewtopic.php?f=64&t=65847


 
michl080
InterCity (IC)
Beiträge: 995
Registriert am: 21.11.2010


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#82 von fbstr , 07.04.2017 16:50

Zitat von michl080 im Beitrag #81

Viel Spass mit Deinen Nierensteinen :-) Ich hatte mal Gallensteine....



Ja Danke :D Nächsten Dienstag kommt der Schlussakt, dann hoffe ich das Nierenstein-Kapitel ist erstmal abgeschlossen.
Gallensteine machen auch ganz schön Stress habe ich mir von einem Kollegen sagen lassen...


Viel ist in der Zwischenzeit nicht passiert, aber einen neuen Schrittmotor habe ich bei Reichelt geordert:
https://www.reichelt.de/Schrittmotoren/Q...2652&OFFSET=16&

Irgendwie habe ich den Eindruck daß ich den ersten Schrittmotor geschrottet habe. Rein Äußerlich (nach dem Aufschrauben) sieht man dem Motor nichts an, aber beim "von Hand drehen" gibt es eine Stelle wo es irgendwie "anders" ist.

Also der neue Trimatic Schrittmotor soll mit 1A auskommen. Im ausgebauten Zustand dreht er kaum hörbar (im MICROSTEP Modus). Eingebaut ist das schon anders, wobei ich nicht genau feststellen kann woran es liegt.
Er läuft auf alles Fälle ruhiger und gleichmäßiger (trotz dem alten MotorShield v2.0). Ich habe hier mal ein Video gemacht, wobei nach der Vierteldrehung ich zum Vergleich meinen Neuzugang ertönen lasse. Eine schwedische 1212, die auch im Bahnpark Augsburg beheimatet ist. Die Roco-Lok ist die erste, wo ich den Sound nicht herunterdrehen mußte und standardmäßig eine angenehme Lautstärke hat.



Die Drehscheibe hört man praktisch nicht mehr wenn eine Lok mit Sound aktiv ist.

Trotzdem bin ich natürlich gespannt wie das Ergebnis mit dem CNC Shield v3.00 aussehen wird. :D


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital

zuletzt bearbeitet 10.06.2021 | Top

RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#83 von fbstr , 14.05.2017 17:35

Auf dieser Baustelle ist es nicht viel weitergegangen.
Lediglich mein Test-Tasterpult hat etwas Acryl bekommen.
Momentan im Einsatz 5 Taster, 3 stehen also noch für weitere Funktionen zur Verfügung.


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#84 von hpe , 26.02.2019 23:32

Hallo,
ich bin Arduino Neuling und will meiner TT-Anlage neue Schienen und Weichen spendieren. Weichen sollen über 2 Taster und Servos gesteuert werden.
Dazu habe ich mir den Code von Frank vom 01.03.17 Seite2 "geklaut". Besten Dank an Frank.
Weichen und und Entkuppler bewegen sich so, wie gewünscht (habe 2 Weichenservos und 2 Entkupplerservos angeschlossen).
Nun zu meinem Problem:
Die Servos der Entkuppler zittern nach einiger Zeit im Ruhezustand, Weichenservos sind ruhig.
Habe mit Oszi Signale gegen GND gemessen.
Weichenservos haben bei keiner Bewegung kein Signal
Entkupplerservos haben im Ruhezustand Signal (schmal imOszi), während der Haltezeit 5000ms kein Signal
ich kann mir den Grund vom Code her nicht erklären, Weichen und Entkuppler sind vom Prinzip ja gleich aufgebaut
habe Arduino Uno getauscht und Servoausgänge auf PWM gelegt - keine Änderung
Signalproblem besteht mit oder ohne Anschluss der Servos
Servos sind seperat an Labornetzteil 5V angeschlossen, GND ist verbunden
ich suche nach einer Lösung, bei der Servos von Entkuppler im Ruhezustand auch kein Signal bekommen
Viele Grüße
Hans-Peter


hpe  
hpe
Beiträge: 4
Registriert am: 13.01.2019


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#85 von fbstr , 01.03.2019 06:24

Hallo Hans-Peter.

Zitat

...ich kann mir den Grund vom Code her nicht erklären, Weichen und Entkuppler sind vom Prinzip ja gleich aufgebaut...



Das habe ich auch gedacht als ich Dein Post gelesen habe.

Bei mir lag es am Anfang an einer falschen Schaltung die sich aber dann auf alle Servos auswirkte. Das ist bei Dir ja anders.
Wissen wir hier schon etwas ueber Deine Schaltung oder wie Dein Entkupplunger mechanisch funktioniert? Ist da im Ruhezutand igendwie mechanischer Druck auf dem Servo?

Vielleicht auch mal einen Entkuppler an einen funktionierenden Ausgang der Weichenservos haengen.

Ich hatte auch gehofft dass sich hier die Experten zu Wort melden und eine Idee haben.

Gruss
Frank


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#86 von MicroBahner , 01.03.2019 11:04

Hallo Hans-Peter,

Zitat
Entkupplerservos haben im Ruhezustand Signal (schmal imOszi), während der Haltezeit 5000ms kein Signal

Ich habe mir den Code von Frank mal kurz angeschaut. Er wertet die Taster statisch aus. Das bedeutet, dass bei den Entkupplern ( wo es ja nur einen Taster gibt ) im Ruhezustand ständig das servo.write() ausgegeben wird. Damit wird das Abschalten der Servopulse ausgehebelt.
Da bei den Weichen und beim aktiven Zustand des Entkupplers die .write-Befehle nur während des Drückens ausgegeben werden, kann da nach dem Loslassen der Taster die Pulsabschaltung aktiv werden.
Wie stark die Servos brummen, wenn sie ständig angesteuert werden, hängt dann auch wesentlich von deiner Mechanik ab.


Hallo Frank
was mir in dem Zusammenhang auch noch aufgefallen ist: durch die rein statische Abfrage der Taster werden auch die EEPROM-Zellen rel. stark beansprucht. Solange Du den Taster drückst, wird bei jedem loop-Durchlauf das EEPROM beschrieben. Da sollte man dann wenigstens statt 'write' die update-Funktion verwenden. Dann wird vor dem Schreiben geprüft, ob sich der Inhalt ändert, und wenn nicht wird kein Schreibvorgang ausgelöst.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.834
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#87 von fbstr , 03.03.2019 08:23

Zitat

Hallo Frank
was mir in dem Zusammenhang auch noch aufgefallen ist: durch die rein statische Abfrage der Taster werden auch die EEPROM-Zellen rel. stark beansprucht. Solange Du den Taster drückst, wird bei jedem loop-Durchlauf das EEPROM beschrieben. Da sollte man dann wenigstens statt 'write' die update-Funktion verwenden. Dann wird vor dem Schreiben geprüft, ob sich der Inhalt ändert, und wenn nicht wird kein Schreibvorgang ausgelöst.



Hallo Franz-Peter,

Danke für den Hinweis. Ich werde mich so gegen Ende März damit beschäftigen. Da sollte ich wieder einen arbeitsfähigen Computer haben.
Mit Bodo's Platinen und der geplanten Lokschuppen-Tür-Ansteuerung muß ich auch endlich mal anfangen…


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#88 von fbstr , 24.04.2020 17:21

Zitat

Ich werde mich so gegen Ende März damit beschäftigen.



Tja, das Jahr 2019 verlief nicht ganz so nach Plan und auch 2020 ist nicht so erfreulich, allerdings wird einem ja das Moba-Basteln quasi aufgezwungen

Inspiriert durch die MobaLedLib ist meine Motivation für Arduino wieder mächtig gestiegen. Vor 3 Wochen habe ich Früjahrsputz gemacht und mal den TimeWaster abgebaut und dann festgelegt, dass die Drehscheiben-Elektrik von der Verkabelung her optimiert werden muß.
Gleichzeitig würde ich gerne ein paar Verbesserungen einbauen - erstmal mit dem vorhandenen MotorShield - nach dem Motto "Never change a running system".
Aber ich will auch eine "Spielschaltung" dannn parallel haben, wo ich den Schrittmotor via MobaTools ansteuern will. Aber erstmal die Optimierungen der vorhandenen Elektrik.

Da hoffe ich erstmal auf ein paar Antworten der Experten hier

1. Tastersteuerung der Drehscheibe
Damit bin ich eigentlich ganz zufrieden. Diese Tasterfunktionen - Dank Franz-Peter - finde ich immer noch optimal: Einzeldruck = Step, Länger drücken = Drehen und eine 180° Drehung. Ein 5ter blaue Taster schaltet den Motor stromlos, damit nicht permanent 1A fließen.

Was ich jetzt noch gerne aktivieren möchte ist der 6te rote Taster. Dieser soll den Motor sofort stoppen. Wenn ich z.B. die 180° Drehung versehentlich anstoße, dass ich diese mit dem Stop-taster eben stoppe.
Allerdings schreibt Franz-Peter hier dass:

Zitat
...da deine Aktionen blockierend sind. D.h. solange sich die Scheibe dreht, läuft der Sketch ja nicht weiter und fragt die anderen Taster sowieso nicht ab.


D.h. ich habe keine Chance mittels Taster die Drehung zu unterbrechen?

2. Schaltung der Taster

Ich habe neue Taster gebastelt, aber nicht aufgepasst, dass ich eine andere Schaltung bisher hatte.

Bisher hatte ich Option1 und bei der neuen Verkabelung nun Option2.

Muß ich die Verkabelung ändern (was machbar wäre) oder kann man elegant im Sketch das invertieren?
Hat eine Variante generell Vor- oder Nachteile? Z.B. belastet eine Variante den Arduino mehr oder weniger?

3. Zusätzliche Elektronik
Durch die Optimierung der Verkabelung will ich auch endlich an die fehlenden Dinge rangehen. Durch den 12poligen Schleifring möchte ich noch zusätzlich via DCC schalten, bzw. nutzen:
- 2x Servos für die Gleissperren
- 3x LED's für Bühnenhaus, Bühnenlampen und Beleuchtung der Gleissperren
- 2x Hall-Sensoren, um evtl. mal eine Nullpunktjustierung machen zu können
- GND und 5V Versorgung, die vom Arduino kommt (und hoffentlich stromtechnisch ausreicht)

D.h. wegen der DCC-Ansteuerung benötige ich Pin2 und A3 (mit Pin3 habe ich Domapi's DCC-Sniffer nicht zum laufen gebracht) und
das Motor-Shield verwendet A4 und A5 für den Stepper und Pin9 und Pin10 für die Servos. Ich vermute für das langsame Drehen der Servos wären die MobaTools auch hier optimal?


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#89 von MicroBahner , 24.04.2020 17:38

Hallo Frank,

Zitat

D.h. ich habe keine Chance mittels Taster die Drehung zu unterbrechen?

Wie sieht denn dein Sketch aktuell aus? Wenn er immer noch während der Bewegung blockiert, wirst Du ihn umbauen müssen, um den Stop Taster nutzen zu können.

Zitat

Hat eine Variante generell Vor- oder Nachteile? Z.B. belastet eine Variante den Arduino mehr oder weniger?

Zu den Tasterschaltungen: Grundsätzlich sind beide Varianten aus Programmiersicht praktisch gleichwertig. Der Vorteil von Option 2 ist hauptsächlich, dass Du dir den externen Widerstand sparen kannst, weil ein PullUp Widerstand im Prozessor schon eingebaut ist, und nur aktiviert werden muss. Im Sketch muss man nur 'andersrum' abfragen. Also 'LOW' ist Taster gedrückt.

Zitat

Ich vermute für das langsame Drehen der Servos wären die MobaTools auch hier optimal?

Zumindest lässt sich das damit einfach erreichen .


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.834
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#90 von fbstr , 24.04.2020 17:57

Hallo Franz-Peter!

Zitat

Wie sieht denn dein Sketch aktuell aus? Wenn er immer noch während der Bewegung blockiert, wirst Du ihn umbauen müssen, um den Stop Taster nutzen zu können.



Ich habe nur vorgestern angefangen den 6ten Taster einzubauen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
// Drehscheibe TimeWaster, Frank Becker 2017
//
// Version 1.7 Neue Verkabelung 22.04.2020, Stop-Button Pin7
// Version 1.6 Drucktaster-Platine erstellt
// Version 1.5 For Abfrage für Beschleunigen und Abbremsen
// Version 1.4 while-Abfrage der Step-Tasten hinzugefügt
// UNO R3 Com6, Motor Shield v2.0
 

// For use with the Adafruit Motor Shield v2
// ----> http://www.adafruit.com/products/1438
 

 
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
#include <MobaTools.h>
 
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);
 
// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #1 (M1 and M2)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);
 
const byte buttonFullTurnClockwise = 2 ; //Taster 180Grad Uhrzeigersinn
const byte buttonFullTurnCounterClockwise = 0 ; //Taster 180Grad gegen Uhrzeigersinn
const byte buttonStepClockwise = 3 ; //Taster Step Uhrzeigersinn
const byte buttonStepCounterClockwise = 1 ; //Taster Step gegen Uhrzeigersinn
const byte buttonRelease = 6 ; //Taster um Motor stromlos zu schaltem
const byte buttonStop = 7 ; //Taster um Motor sofort anzuhalten und stromlos zu schalten
 
byte buttonStatusFullTurnClockwise = 0 ;
byte buttonStatusFullTurnCounterClockwise = 0 ;
byte buttonStatusStepClockwise = 0 ;
byte buttonStatusStepCounterClockwise = 0 ;
byte buttonStatusRelease = 0 ;
byte buttonStatusStop = 0 ;
 
EggTimer myTimer2sec ; //Timer für 2 Sekunden
 
byte i; //Zählvariable
 
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Stepper test!");
 
pinMode(buttonFullTurnClockwise, INPUT);
pinMode(buttonFullTurnCounterClockwise, INPUT);
pinMode(buttonStepClockwise, INPUT);
pinMode(buttonStepCounterClockwise, INPUT);
pinMode(buttonRelease, INPUT);

AFMS.begin(1600); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(10); // original 10 rpm
}
 
void loop() {
 
// Stati der Taster einlesen
 
buttonStatusFullTurnClockwise = digitalRead(buttonFullTurnClockwise);
buttonStatusFullTurnCounterClockwise = digitalRead(buttonFullTurnCounterClockwise);
buttonStatusStepClockwise = digitalRead(buttonStepClockwise);
buttonStatusStepCounterClockwise = digitalRead(buttonStepCounterClockwise);
buttonStatusRelease = digitalRead(buttonRelease);
buttonStatusStop = digitalRead(buttonStop);

if (buttonStatusFullTurnClockwise == LOW) // Wenn Taster gedrückt...
{
FullTurnClockwise(); // ... Funktion ausführen
}
if (buttonStatusFullTurnCounterClockwise == LOW) // Wenn Taster gedrückt...
{
FullTurnCounterClockwise(); // ... Funktion ausführen
}
if (buttonStatusStepClockwise == LOW) // Wenn Taster gedrückt...
{
StepClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while (digitalRead(buttonStepClockwise)==LOW) // solange Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
if (buttonStatusStepCounterClockwise == LOW) // Wenn Taster gedrückt...
{
StepCounterClockwise(); // 1 Step machen
myTimer2sec.setTime(2000) ; // Timer auf 2 Sek setzen
while (digitalRead(buttonStepCounterClockwise)==LOW) // solange Taste gedrückt ist
{
if (myTimer2sec.running()==false) // Wenn die 2 Sekunden abgelaufen sind und immernoch die Taste gedrückt ist...
{
StepCounterClockwise(); // so lange drehen, bis Taste losgelassen wird.
}
}
}
if (buttonStatusRelease == LOW) // Wenn Taster gedrückt...
{
myMotor->release(); // ... Schrittmotor stromlos schalten
}
if (buttonStatusStop == Low) //Wenn Taster gedrückt...
{
myMotor->release(); // ... Schrittmotor stoppen und stromlos schalten
}
}
 
void FullTurnClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung (733 steps)im Uhrzeigersinn");
for (i=0; i<160; i++) {
myMotor->setSpeed(i);
myMotor->step(1, FORWARD, MICROSTEP);
}
myMotor->setSpeed(160); // >160rpm keine Geschwindigkeitsvergößerung bemerkbar
myMotor->step(414, FORWARD, MICROSTEP);
for (i=0; i<160; i++) {
myMotor->setSpeed(160-(i));
myMotor->step(1, FORWARD, MICROSTEP);
}
}
 
void FullTurnCounterClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung gegen Uhrzeigersinn");
for (i=0; i<160; i++) {
myMotor->setSpeed(i);
myMotor->step(1, BACKWARD, MICROSTEP);
}
myMotor->setSpeed(160); // >160rpm keine Geschwindigkeitsvergößerung bemerkbar
myMotor->step(414, BACKWARD, MICROSTEP);
for (i=0; i<160; i++) {
myMotor->setSpeed(160-(i));
myMotor->step(1, BACKWARD, MICROSTEP);
}
}
 
void StepClockwise() { // Definition als Funktion
Serial.println("1 Step im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(1, FORWARD, MICROSTEP);
}
 
void StepCounterClockwise() { // Definition als Funktion
Serial.println("1 Step im Uhrzeigersinn");
myMotor->setSpeed(1); // original 10 rpm
myMotor->step(1, BACKWARD, MICROSTEP);
}
 




Zitat

Zu den Tasterschaltungen: Grundsätzlich sind beide Varianten aus Programmiersicht praktisch gleichwertig. Der Vorteil von Option 2 ist hauptsächlich, dass Du dir den externen Widerstand sparen kannst, weil ein PullUp Widerstand im Prozessor schon eingebaut ist, und nur aktiviert werden muss. Im Sketch muss man nur 'andersrum' abfragen. Also 'LOW' ist Taster gedrückt.



D.h. ich muß das nicht aktivieren, weil ich ja schon Widerstände eingelötet habe und dann im Sketch z.B.
if (buttonStatusFullTurnClockwise == LOW)
durch
if (buttonStatusFullTurnClockwise == HIGH)
ersetzen?
Das wäre ja einfach


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#91 von MicroBahner , 24.04.2020 21:51

Hallo Frank,
Was das 'Stop' angeht ist da leider dein Shield ein kleiner 'Stolperstein'. Die dazugehörige Lib ist nunmal blockierend, und während der Stepper läuft kannst Du auf nichts anderes reagieren. Da das Shield recht speziell ist, und alles über I2C angesteuert wird, ist das auch nicht so einfach umzustellen. Evtl. ginge es über die AccelStepper. Die kennt auch einen Modus bei dem sie für die eigentliche Ausführung eines Steps auf externe Funktionen zurückgreifen kann. Das wäre dann das onestep() bei deiner Lib. Da das onestep aber keine einfache Funktion, sondern eine Methode ist, bin ich mir nicht sicher, ob das funktionert.

Für den Taster mit dem pullUp Widerstand musst Du nur das Auslesen invertieren. Die ganzen Abfragen des Status können dann gleich bleiben:

Also z.B. statt

1
2
 
  buttonStatusFullTurnClockwise = digitalRead(buttonFullTurnClockwise);
 
 

schreibst Du einfach

1
2
 
  buttonStatusFullTurnClockwise = !digitalRead(buttonFullTurnClockwise);
 
 

Dann bekommt deine Statusvariable wieder den richtigen Wert.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.834
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#92 von fbstr , 25.04.2020 06:32

Zitat

Was das 'Stop' angeht ist da leider dein Shield ein kleiner 'Stolperstein'. Die dazugehörige Lib ist nunmal blockierend, und während der Stepper läuft kannst Du auf nichts anderes reagieren.



Moin Franz-Peter,

ein letzter Versuch mit der Stop-Taste:
Mein Problem sind eigentlich nur die 2 Tasten/Funktionen für das 180° Drehen. Denn nur dort läuft der Stepper weiter auch wenn ich die Taste loslasse.
Die Funktion fürs 180° Drehen sieht ja so aus:
1. Beschleunigen in 160 Schritten von 0 auf 160
2. 414 Schritte fahren mit Speed160
3. Abbremsen in 160 Schritten von 160 auf 0

Wäre es möglich eine Tasterabfrage dort nach jedem Schritt einzubauen und falls ich die Stop-Taste drücke springe ich zum Ende?
Also z.B. so:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 

void FullTurnCounterClockwise() { // Definition als Funktion
Serial.println("180 Grad Drehung gegen Uhrzeigersinn");
for (i=0; i<160; i++) {
[color=#FF0000]Prüfe Stop-Taster und höre auf falls gedrückt[/color]
myMotor->setSpeed(i);
myMotor->step(1, BACKWARD, MICROSTEP);
}
 
for (i=0; i<414; i++) {
[color=#FF0000]Prüfe Stop-Taster und höre auf falls gedrückt[/color]
myMotor->setSpeed(160);
myMotor->step(1, BACKWARD, MICROSTEP);
}

for (i=0; i<160; i++) {
[color=#FF0000]Prüfe Stop-Taster und höre auf falls gedrückt[/color]
myMotor->setSpeed(160-(i));
myMotor->step(1, BACKWARD, MICROSTEP);
}
}
 
 


(Kann man hier im Forum innerhalb von Code keine Formatierung machen? Ich wollte den eingefügten Part Rot darstellen.)

Wenn dies als Stop-Taste möglich wäre müßte ich dann wissen wie ich die Funktion beende. Gibt es da ein "goto End"?
Also ungefähr so:
if (buttonStatusStop == Low) //Wenn Stop-Taster gedrückt...
{
aus der Funktion springen und Motor stoppen und releasen; // ... Schrittmotor stoppen und stromlos schalten
}


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.573
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


RE: Arduino MobaTools: Optimierung Drehscheibensteuerung

#93 von MicroBahner , 25.04.2020 11:44

Hallo Frank,

Zitat

Kann man hier im Forum innerhalb von Code keine Formatierung machen?

Das geht prinzipiell nicht, damit nicht Codeteile fälschlich als Formatierungsbefehle verstanden werden. Einige der Formatierungscodes können nämlich durchaus im Code als gültige Codeteile vorkommen.

Im Prinzip müsste das so gehen, wie Du das vorhast. Was da dann noch als maximale Steprate möglich ist, wenn Du nur Einzelsteps ausgibst, musst Du halt testen. Die for-Schleife kannst Du dann mit dem 'break;' Befehl abbrechen, wenn der Stoptaster gedrückt ist. Dann fährt der Motor ja nicht weiter.
Alsö etwa so:

1
 
if (buttonStatusStop == Low) break; //Wenn Stop-Taster gedrückt Schleife abbrechen
 

Ob Du die Rampe dann noch fahren willst kannst Du ja dadurch entscheiden, ob Du die Abfrage in die entsprechende Schleife auch reinmachst oder nicht.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.834
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz