RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#76 von MicroBahner , 12.09.2015 15:10

Hallo,
nun soll die 'kurze Pause' erstmal wieder ein Ende haben .
Ganz untätig war ich in dieser Zeit aber nicht . Wie ich schon geschrieben hatte, finde ich auch den von Ulli (garti62) bereits am Anfang des Threads verlinkten kleinen Schrittmotor interessant. Den bekommt man bei verschiedenen Quellen unter 5€, und das ist schon sehr günstig. Im Servo-Bereich gibt es da nur die 'Billig-Servos', die das Ruckelproblem wohl eher nicht lösen können.
Nachdem die Motörchen geliefert waren, wollte ich sich natürlich auch ausprobieren . Leider ist die Stepper-Lib des Arduino m.M. nach eher was zum Testen von Steppern, aber für ernsthafte Anwendungen nicht zu gebrauchen - während der gesamten Bewegung des Schrittmotors ist der Arduino blockiert , da kann man nicht wirklich was mit anfangen.
Inzwischen ist meine eigene Stepper Library weitgehend fertig und da kann man den Schrittmotor - nach einer Kalibrierung - im Prinzip mit den gleichen Befehlen wie einen Servo ansteuern - also auch absolut positionieren. Impulslängen machen da zwar keinen Sinn - aber Winkelwerte schon. Im Gegensatz zur Servo-Ansteuerung stimmen die Winkelwerte da auch wirklich.
Damit wird unsere Schrankensteuerung mit nur geringfügigen Anpassungen mit beiden Antriebsarten funktionieren.

Zur ersten Einstimmung 2 Videos - mit Servo und mit Stepper. Die verwendete Schranke ist zwar nicht der Brüller - ist ein altes Faller-Schätzchen aus der Grabbelkiste - aber für den Zweck sollte sie ausreichen. Die 'Kraftübertragung' erfolgt mit einem einfachen Zwirnsfaden - ich war immer schon für mechanisch simple Lösungen .
Erstmal mit Servo:


Der Servo liegt etwa in der 10€ Klasse, ist aber auch noch nicht ganz ruckelfrei. Ich habe aber nicht vor, mir für die Tests teurere Servos zuzulegen .

Dann mit dem Stepper ( noch mit einer reinen Test-Software ):

Was mich auch - im Gegensatz zum Servo - beeindruckt, ist der sehr geringe Geräuschpegel. Das 'Klick' des Micro-Schalters ist lauter als das Motorgeräusch. Geht man mit der Geschwindigkeit noch deutlich runter, fängt der Schrankenbaum an leicht zu vibrieren. Dann sind die einzelnen Schritte des Motors sichtbar. Das liesse sich nur mit einem weiteren Zwischengetriebe reduzieren.
Nachteil ist halt, dass er einen Referenzpunkt benötigt. Ich habe auch schon daran gedacht, ein Poti anzuflanschen. Etwa in der Art:

Dann wüsste die Software beim Start direkt wo sich der Stepper befindet.
Wäre interessant, wie Eure Meinung dazu ist.

Jetzt muss ich meine HW noch ein wenig umbauen, dann geht es mit der Ablaufsteuerung weiter.


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#77 von MicroBahner , 15.09.2015 22:07

Hallo,
so, nun wieder etwas zur Ablaufsteuerung. Ich habe erstmal mit dem Servo weitergemacht. Falls jemand das testen will, ist wahrscheinlich eher ein Servo vorhanden als der Schrittmotor.
Die Erweiterung in der Software bezieht sich erstmal auf dem Ablauf der Steuerung. Die Endlagen müssen noch im Programm per Konstante eingetragen werden. Ich habe versucht den Sketch soweit zu kommentieren, dass man ihn (hoffentlich) eingermaßen nachvollziehen kann. Ein bisschen Programmiererfahrung wird aber wohl nötig sein :? . Zum ausprobieren muss man aber auch nicht jedes Detail verstehen .
Der Sketch basiert jetzt auf den MobaTools, die ich hier vorgestellt habe. Die müssen installiert sein, damit der Sketch läuft. Der wesentliche Punkt bei der Programmierung ist, dass man in der 'loop' Funktion keine delays und Warteschleifen einbaut, bei denen das Programm nicht weiterlaufen würde. Dann kann man mehrere unabhängig agierende Programmblöcke einfach hintereinander setzen und so eine Art 'multitasking' betreiben.

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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
 
/* Schrankensteuerung mit Servo V0.2 15.9.2015
* Die Schrankensteuerung benötigt die 'MobaTools' - library
*
* Version mit erweiterter Ablaufsteuerung: mit Vorlauf für Glocke und
* Wechselblinker.
*
* Für eine bessere Übersicht und Erweiterbarkeit ist das Programm logisch in einzelen Blöcke aufgeteilt.
* Diese Blöcke sind im loop hintereinander angeordnet, arbeiten aber weitgehend unabhängig. Damit dies
* möglich ist, dürfen innerhalb der Blöcke keine Warteschleifen/Delays werwendet werden, die den
* Programmablauf temporär anhalten.
*
* 1.Block: Einschaltlogik.
* Hier wird bestimmt, ob die Schranke geschlossen oder geöffnet werden soll. Derzeit ist dies einfach ein
* Schaltereingang, der abgefragt wird. Soll die Schranke später automatisch durch die Züge gesteuert werden
* muss dies in diesem Block eingerichtet werden. Ergebnis der Einschaltlogik ist ein Flag 'schrankeSchliessen'
*
* 2. Block Ablaufsteuerung Schrankenlogik
* zentraler Block, der den Ablauf des Schrankenschliessens bzw -öffnens steuert. Der Block agiert abhängig
* von dem Flag 'schrankeSchliessen' und dem momentanen Zustand der Schrankenlogik
* Hier werden auch die Flags gesetzt, mit denen die Glocke (glAktiv) und der Wechselblinker (wbAktiv)
* ein- bzw ausgeschaltet werden.
*
* 3. Block Ansteuerung der Glocke
* abhängig vom Flag 'glAktiv' wird der Impulsausgang für die Glocke ein- bzw ausgeschaltet. Je nach ange-
* schlossenem Audio-Modul muss gegebenenfalls auch darauf geachtet werden, dass der letzte Glockenschlag
* nicht abgeschnitten wird.
*
* 4. Block Wechselblinker
* abhängig vom Flag 'wbAktiv' wird der Wechselblinker ein- bw ausgeschaltet. Beim Einschalten sind kurz beide
* Blinker gleichzeitig an, bevor sie dann abwechselnd blinken.
*
* 5.Block Endlagenjustierung
* noch nicht enthalten ;-)
*
*
*
*/
#include <Eggtimer.h> // Timer nach dem Prinzip der Eieruhr (Aufziehen und läuft dann ab)
#include <Mobatools.h> // Lib für Hardwareerzeugte Servo-Pulse an Port 9,10
 
#define SCHRANKENZAHL 2 // Zahl der Schrankenbäume ( derzeit nur 2 erlaubt)
 
//////////////// Portzuordnungen und Konstante /////////////////////////
// 1. Einschaltlogik --------------------------------------------------
const byte schrankeZuP = 7; // Pin HIGH bedeutet Schranke schliessen
 
// 2. Ablaufsteuerung --------------------------------------------------
const byte ServoPort[SCHRANKENZAHL] = {9,10}; // Nur Port 9 / 10 erlaubt
const byte schrTempo[SCHRANKENZAHL] = { 5,4 };
const int vorlaufZu = 6000; // Vorlaufzeit: Glocke und Wechselblinker aktiv, Schranke noch ruhend
const int nachlaufZu = 2000; // Nachlaufzeit: Schranke zu, Glocke nochaktiv
 
// 3. Glocke -------------------------------------------------------------
const byte glockeP = 4; // Impulsausgang zur Ansteuerung einer Glocke
const int glZykl = 2000; // Glockenrythmus
const int glImp = 50; // Impulslänge am Glockenausgang
 
// 4. Wechselblinker ----------------------------------------------------
const byte led1P = 6; // Ausgänge für den Wechselblinker ( Ports müssen PWM-fähig sein )
const byte led2P = 5;
const int wbZykl = 1100; // Zykluszeit des Wechselblinkers
const int wbSoft = 300; // Auf/Abblendzeit der Lampen
 
// sonst. ----------------------------------------------------------------
 
////////////////////// globale Variable //////////////////////////////////////
// 1. Einschaltlogik ----------------------------------------------------
bool schrankeSchliessen; // Wird derzeit nur durch einen einfachen Schalter gesteuert
 
// 2. Ablaufsteuerung ---------------------------------------------------
int positionZu[2] = {1040,1550}; // Servopostionen, über Justiervorgang einstellbar
int positionAuf[2] = {1900, 1450}; // Servopostionen, über Justiervorgang einstellbar
 
Servo2 Schranke[2]; // Für die Schrankenservos
EggTimer VorlaufT;
 
// Zustand, in dem sich die Ablaufsteuerung gerade befindet
byte bueZustand; // Aktueller Zustand
byte bueVorZustand; // vorheriger Zustand des Bue ( noch nicht verwendet)
#define OFFEN 0
#define VORLAUF_ZU 1 // Wechselblinker und Glocke, aber noch keine Bewegung
#define SCHRANKE_SCHLIESST 2 // Bewegung Schrankenbaum zu
#define NACHLAUF_ZU 3 // Beide Schrankenbäume in Endpos, Glocke läutet noch.
#define GESCHLOSSEN 4 // Schranke geschlossen
#define SCHRANKE_OEFFNET 6 // Bewegung Schrankenbaum auf
 
// 3. Glocke -------------------------------------------------------------
EggTimer glockeT;
byte glAktiv = false; // Flag ob Glocke aktiv ist
 
// 4. Wechselblinker ------------------------------------------------------
SoftLed Wblinker[2]; // 2 Leds für den Wechselblinker
EggTimer BlinkerT;
byte wbAktiv = false; // Flag ob Wechselblinker aktiv ist
byte ledState = LOW; // Status Wechselblinker
// Zustand Wechselblinker
byte wblZustand = 0;
#define WBL_AUS 0
#define WBL_START 1 // Beim Start sind kurz beide Lampen an
#define WBL_BLINKT 2
 
// sonst. -----------------------------------------------------------------
// für debugging
byte debug;
char buf[40];
 
//-------------- Ende der Definitionen -------------------------------------
 
void setup()
{
// 1. Einschaltlogik ----------------------------------------------------
pinMode(schrankeZuP, INPUT_PULLUP);

// 2. Ablaufsteuerung ---------------------------------------------------
/////// Servo-Initiierung //////////////////////
Schranke[0].attach(ServoPort[0]); //Servo an Pin 9
Schranke[1].attach(ServoPort[1]); //Servo an Pin 10
Schranke[0].setSpeed( schrTempo[0] );
Schranke[1].setSpeed( schrTempo[1] );

// 3. Glocke -------------------------------------------------------------
pinMode( glockeP, OUTPUT );

// 4. Wechselblinker ------------------------------------------------------
Wblinker[0].attach(led1P); // Portzuordnung für den WEchselblinker
Wblinker[1].attach(led2P);
Wblinker[0].riseTime(wbSoft); // Weiches Auf/Abblenden der Lampen
Wblinker[1].riseTime(wbSoft);

// sonst. -----------------------------------------------------------------
//Serial.begin(19200); //Debugging

} // End Setup
 

void loop()
{
// 1. Einschaltlogik ----------------------------------------------------
////////////// Eingang zur Steuerung des Bahnübergangs /////////////////
schrankeSchliessen = ( digitalRead( schrankeZuP) == HIGH );

// 2. Ablaufsteuerung ---------------------------------------------------
//////////// Ablaufsteuerung des Bue - Haupt-Zustandsautomat ///////////////////
switch ( bueZustand ) {
case OFFEN:
// Schranke ist geöffnet, warten auf Eingang
if ( schrankeSchliessen ) {
// Schranke soll sich schliessen, Glocke und Wechselblinker startet.
wbAktiv = true; // Wechselblinker einschalten
glAktiv = true; // Glocke einschalten.
VorlaufT.setTime( vorlaufZu );
bueZustand = VORLAUF_ZU;
}
break; //----------------------------------------------------------
case VORLAUF_ZU:
// Warten bis die Vorlaufzeit abgelaufen ist, dann die Schrankenbewegung starten
if ( !VorlaufT.running() ) {
// Vorlaufzeit abgelaufen, Schrankenbewegung starten.
// spätestens hier muss auch die Glocke aktiviert werden
glAktiv = true; // wurde sie schon aktivert, machts auch nichts ;-)
Schranke[0].write( positionZu[0]);
Schranke[1].write( positionZu[1] );
bueZustand = SCHRANKE_SCHLIESST;
}
break; //----------------------------------------------------------
case SCHRANKE_SCHLIESST:
// Schrankenbaum schliesst sich.
if ( Schranke[0].moving() == 0 &&
Schranke[1].moving() == 0 ) {
// beide Schrankenbäume haben ihre Endposition erreicht
VorlaufT.setTime( nachlaufZu );
bueZustand = NACHLAUF_ZU;
}
break; //----------------------------------------------------------
case NACHLAUF_ZU:
// Schrankenbaum geschlossen, kurzer Nachlauf für Glocke.
if ( !VorlaufT.running() ) {
glAktiv = false;
bueZustand = GESCHLOSSEN;
}
break; //----------------------------------------------------------
case GESCHLOSSEN:
// Schranke ist zu, warten auf Eingang
if ( schrankeSchliessen == false ) {
// Schranke soll sich öffnen, Bewegung einleiten
Schranke[0].setSpeed( schrTempo[0]);
Schranke[1].setSpeed( schrTempo[1]);
Schranke[0].write( positionAuf[0]);
Schranke[1].write( positionAuf[1]);
wbAktiv = false; // Wechselblinker ausschalten
bueZustand = SCHRANKE_OEFFNET;
}
break; //----------------------------------------------------------
case SCHRANKE_OEFFNET:
// Schrankenbaum öffnet sich, warten bis offen
if ( Schranke[0].moving() == 0 &&
Schranke[1].moving() == 0 ) {
// beide Schrankenbäume haben ihre Endposition erreicht
bueZustand = OFFEN;
}
break; //----------------------------------------------------------
} ////////////// Ende Zustandsautomat Bahnübergang /////////////////////
 
// 3. Glocke -------------------------------------------------------------
////////////////// Glockenimpuls erzeugen ////////////////////////////////
if ( glAktiv ) {
if ( !glockeT.running() ) {
// Glockentimer abgelaufen, Impuls erzeugen
if ( digitalRead( glockeP ) == HIGH ) {
// Port ist gesetzt, abschalten
digitalWrite( glockeP, LOW );
glockeT.setTime( glZykl - glImp );
} else {
// Port ist aus, einschalten
digitalWrite( glockeP, HIGH );
glockeT.setTime( glImp );
}
}
} else {
// Glocke inaktiv, Ausgang abschalten wenn Timer nicht mehr läuft
if ( !glockeT.running() ) {
// Die Timerabfrage stellt sicher, dass auch der letzte Impuls immer in
// voller Länge ausgegeben wird
digitalWrite( glockeP, LOW );
}
}

// 4. Wechselblinker ------------------------------------------------------
/////////////// Wechselblinker (Zustandsautomat ) //////////////////
switch (wblZustand) {
case WBL_AUS:
// Beide Lampen sind aus, warten auf einschalten
if ( wbAktiv ) {
// Beide Leds einschalten, Timer für gemeinsames Startleuchten
Wblinker[0].on();
Wblinker[1].on();
BlinkerT.setTime( wbSoft/2 );
wblZustand = WBL_START;
}
break;
case WBL_START:
// Startphase: Nach Zeitablauf erste Led wieder aus
if ( !BlinkerT.running() ) {
// Übergang zur normalen Blinkphase
ledState = HIGH;
Wblinker[1].off();
BlinkerT.setTime(wbSoft);
wblZustand = WBL_BLINKT;
}
break;
case WBL_BLINKT:
if ( !BlinkerT.running() ) {
BlinkerT.setTime(wbZykl/2);
if ( ledState == LOW ) {
Wblinker[0].on();
Wblinker[1].off();
ledState = HIGH;
} else {
ledState = LOW;
Wblinker[1].on();
Wblinker[0].off();
}
}
if ( !wbAktiv ) {
// Wechselblinker abschalten
Wblinker[0].off();
Wblinker[1].off();
wblZustand = WBL_AUS;
}
break;

} /////////// Ende switch Wechselblinker ////////////////////////
} // End Loop
 
 

Hier auch nochmals die Library zum herunterladen:
Edit: für die MobaTools gibts ein Update .
Abschliessend noch ein Video vom Ablauf. Im Video wird immer angezeigt, in welchem Zustand sich die Ablaufsteuerung gerade befindet. Das kann man dann im Sketch nachvollziehen.
Um das ganze besser darzustellen, habe ich meinem Testaufbau auch mal 2 Blinklampen und einen Lautsprecher verpasst.



Wenn noch Interesse besteht und etwas unklar ist - einfach fragen. Wie Uli schon geschrieben hatte, es gibt keine dummen Fragen, nur dumme Antworten


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


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

zuletzt bearbeitet 06.09.2021 | Top

RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#78 von Dubi , 16.09.2015 11:55

Hallo,
Tolle Sache , müsste doch auch über eine Lichtschranke zu steuern sein ?
Gibt es ein Bild wie das ganze am Uno angeschlossen ist ?
Das mit dem Schrittmotor interessiert mich auch !

Gruss
Sonja


P.S Mein Mann ist im Forum angemeldet ( Ich will Ihn nur überraschen das ich sowas auch hinbekomme !


Dubi  
Dubi
InterRegio (IR)
Beiträge: 121
Registriert am: 13.10.2013


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#79 von MicroBahner , 16.09.2015 22:40

Hallo Sonja,
freut mich, wenn Dir mein kleines Projekt gefällt. Den Antrieb mit Schrittmotor werde ich auf jeden Fall auch noch realisieren. Da knobel ich derzeit noch am mechanischen Aufbau.

Per Lichtschranke lässt sich das natürlich auch steuern. Da muss man aber schon schauen, wie die Lichtschranke(n) eingebaut ist(sind). Angepasst werden muss dann 'nur' der 1. Programmblock. Wenn man das vom Zug automatisch steuern will, wird aber ein Lichtschranke wohl nicht ausreichen.

Ein Bild vom Uno-Anschluß kann ich leider nicht bieten. Ich habe nur Nano- und Mikro- Klone und das Ganze auf einer Lochrasterplatine aufgebaut:

Das Bild wird dir aber nicht viel helfen. Die Schaltung ist aber recht simpel, und da beim Arduino die Pin-Nummern überall identisch sind, passt das auch zu deinem Uno:

Für die Servos solltest Du auf jeden Fall eine getrennte Spannungsversorgung vorsehen.

Zitat von Dubi
( Ich will Ihn nur überraschen das ich sowas auch hinbekomme !

Da musst Du aber aufpassen, dass er hier nicht mitliest, sonst ist die Überraschung dahin


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#80 von Dubi , 17.09.2015 20:03

Vielen Dank

Er hat es mitbekommen, aber ich bau es nach mal was anderes als Landschaftsbau !

L.G.
Sonja


Dubi  
Dubi
InterRegio (IR)
Beiträge: 121
Registriert am: 13.10.2013


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#81 von MicroBahner , 22.09.2015 12:06

Hallo,
hier nochmal ein Update der Schrankensteuerung. Dieses Update benötigt die aktuelle MobaTools-Version und sollte bereits praktisch einsetzbar sein.

Die Endlagen der Schranken können jetzt justiert und im EEPROM gespeichert werden. Ausserdem merkt sich die Steuerung die letzte Schrankenposition (Auf/Zu) im EEPROM. So kann sie nach Aus-/Einschalten der Versorgungspannung im jeweils richtigen Zustand starten und es kommt zu keinen 'hektischen' Bewegungen der Servos. Mit digitalen Servos tritt auch kein 'Einschaltzucken' auf.
Die Version ist auch bereits vorbereitet für einen Bü mit 4 Schrankenbäumen. Derzeit ist mit den MobaTools aber nur ein Betrieb mit 2 Servos möglich.
Die gesamte Bewegungsteuerung der Schrankenbäume ist in ein eigenes Unterprogramm ausgelagert. Das erleichtert die Umstellung auf einen anderen Antrieb - z.B. einen Schrittmotor.

Justierung der Endlagen
Für die Justierung wird ein Taster je Schrankenbaum benötigt. Es gibt keinen speziellen Justiermodus. Die Justierung kann jederzeit im Betrieb stattfinden. Wird während der Bewegung des Schrankenbaums der Justiertaster gedrückt und gehalten, so verringert die Schranke ihr Tempo. Wird der Taster wieder losgelassen, so stoppt die Bewegung sofort, und diese Position wird als neue Endposition gespeichert. Bei gedrücktem Taster läuft die Schranke auch über die bisherige Endposition weiter. Dies funktioniert beim Öffnen und beim Schliessen der Schranke, so dass beide Endlagen mit dem Taster eigestellt werden können.
Voraussetzung ist lediglich, dass die im Programm hinterlegten Ausgangswerte so gesetzt sind, dass sich das Servo in die richtige Richtung dreht. Diese Ausgangswerte werden beim erstmaligen Start übernommen, wenn das EEPROM noch nie beschrieben wurde. Wird beim Starten des Programms ein Justierschalter gedrückt gehalten, so werden die Ausgangswerte erneut übernommen und evtl. per Justiertaster eingestellte Werte überschrieben.

Unterschiede zur Arduino-Servo-Lib

Im Gegensatz zur Standard-Servo-Library des Arduino führt eine 'write'-Befehl bei den MobaTools nicht zu einer unmittelbaren Änderung der Impulslänge auf den neuen Wert. Vielmehr wird die Impulslänge entsprechend der vorher eingestellten Geschwindigkeit mehr oder weniger langsam an den übergebenen Wert herangeführt. Dies hat auch Auswirkung auf die Funktionen 'read' bzw. 'readmicroseconds'. Bei der Standard-Lib geben diese Funktionen eigentlich nur den als letztes mit 'write' eingestellten Wert zurück. Bei den MobaTools geben diese Funktionen jedoch die tatsächliche momentane Impulslänge zurück. Dies kann - insbesondere bei langsamer Bewegung - noch deutlich vom zuletzt per 'write' übergebenen Wert abweichen. Das 'write' - Kommando wirkt sich grundsätzlich sofort aus - auch wenn die Zielposition vom vorherigen 'write' Kommando noch nicht erreicht wurde. Obwohl es keinen expliziten 'stop' aufruf gibt, lässt sich damit eine Stop-Funktion erreichen: Wird mit einer read-Funktion die momentane Impulslänge ermittelt und sofort anschliessend als neue Zielposition vorgegeben, bleibt das Servo stehen, da es sich ja bereits an der Zielposition befindet.
Diese Zusammenhänge werden beim Justiervorgang genutzt. Beim Drücken des Tasters wird eine neue Zielposition jenseits der bisherigen Endposition eingestellt, so dass sich das Servo auch über die bisherige Endposition hinaus bewegen würde. Wird der Taster wieder losgelassen, wird die momentane Servoposition ausgelesen, mit einem entsprechenden 'write' das Servo angehalten und die ausgelesene Position im EEPROM als neue Endlage gespeichert.

Schaltung
Gegenüber der bisherigen HW-Schaltung sind lediglich die 2 Justiertaster hinzugekommen.

Da die Taster nur zur Justierung benötigt werden, müssen sie nicht fest verdrahtet werden. Es reicht ein Taster mit einem Stück Kabel, der entsprechend umgesteckt werden kann.

Der Sketch kann hier heruntergeladen werden.[attachment=0]BueSteuerung_V0.3.zip[/attachment]

Noch ein paar Bemerkungen dazu, falls doch auch jemand in das Programm hineinschauen will ( ich habe mich bemüht es ausführlich zu kommentieren):
Die Arduino-Umgebung bietet zwar auch eine EEPROM Library. Diese habe ich jedoch bewusst nicht benutzt. Bei dieser Library muss man die Adressen im EEPROM selbst verwalten, was meiner Meinung nach leicht zu Fehlern führen kann.
Der von der Arduino-Umgebung verwendete Compiler bietet ebenfalls Aufrufe zum Schreiben und Lesen des EEPROMS. Dabei kann man die Variablen im EEPROM praktisch genauso definieren wie die RAM-Variablen. Am Schlüsselwort EEMEM erkennt der Compiler, dass die Variable im EEPROM hinterlegt werden soll.

1
2
3
4
5
6
7
8
9
10
11
12
 
byte eeValid                    EEMEM ; //  hex55 wenn EEprom g&#252;ltige Daten enth&#228;lt (Erstbeschreibung)
byte eeZustand EEMEM ; // aktueller Bue Zustand ( nur OFFEN und GESCHLOSSEN )
word eePosZu[SCHRANKENZAHL] EEMEM ;
word eePosAuf[SCHRANKENZAHL] EEMEM ;
// ....
// Positionswerte aus EEProm lesen
for ( i=0; i&lt;SCHRANKENZAHL; i++ ) {
positionZu[i] = eeprom_read_word( &amp;eePosZu[i] );
positionAuf[i] = eeprom_read_word( &amp;eePosAuf[i] );
}
 

 

Man braucht sich also nicht selbst um die EEPROM-Adressen kümmern. Dies halte ich für einen sehr wesentlichen Vorteil.


Einsatz und Anpassung

Dies ist erstmal die letzte Version mit Servo-Antrieb. Wobei die Version auch so wie sie ist einsetzbar sein sollte (wenn ich keine gravierenden Fehler übersehen habe ). Lediglich die Ausgangswerte für die Endpositionen der Schranken muss man gegebenenfalls anpassen, damit die Servos in die richtige Richtung drehen. Die derzeitigen Vorgaben sind so eingestellt, dass in der Stellung 'geschlossen' die kürzere Impulslänge ausgegeben wird. Baut man die Mechanik entsprechend auf und hält sich an die pin-Nummern im Schaltplan, sollten keine Änderungen am Sketch notwendig sein.

1
2
3
4
5
6
7
8
9
 
// gegebenenfalls anzupassende Werte (weitere Werte k&#246;nnen im Abschnitt 'Portzuordnungen und Konstante' angepasst werden)
#define PULS_ZU1 1200 // Initiale Pulsl&#228;ngen f&#252;r die Endpositionen. Die Werte k&#246;nnen &#252;ber die Justierung
#define PULS_AUF1 1800 // angepasst werden. Die Drehrichung kann durch Vertauschen der Werte f&#252;r ZU / AUF
#define PULS_ZU2 1200 // umgedreht werden. Dies ist &#252;ber die Justierung NICHT anpassbar.
#define PULS_AUF2 1800
 
#define GLOCKE_ZYK 1000 // Glockenzyklus und Impulsl&#228;nge muss an das angeschlossene Soundmodul
#define GLOCKE_PULS 200 // angepasst werden.
 
 



Ausblick
Da das Interesse hier doch inzwischen sehr überschaubar ist wird es erstmal keine weitere Version geben. Es braucht ja auch alles seine Zeit .
@Sonja: wenn Du es noch nachbauen willst, nimm gleich diese Version, die vorige war doch eher ein Zwischenstand.

Die Versionsnummer bleibt auf einem 'Vorab'-Level (V0.3), da der Sketch ja noch nicht wirklich praxiserprobt ist. Vielleicht findet sich von den ursprünglichen Interessenten doch der eine oder andere, der irgendwann Zeit und Lust hat und dies auch mal austestet. Die Fehler die er findet könnte er dann hier kundtun - 'geschlossen' wird der Thread ja nicht

Meinen eigenen Bü werde ich jetzt auf eine Schrittmotorversion umstellen (Gegebenenfalls werde ich die auch mal vorstellen ). Der dort bisher verwendete Getriebemotor macht mir zu viel Krach


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

Dateianlage:
Sie haben nicht die nötigen Rechte, um die angehängten Dateien zu sehen

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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#82 von railfan2401 , 26.09.2015 10:27

Lieber Franz-Peter,
seit Beginn verfolge ich diesen thread mit Interesse. Nun bin ich alles andere als ein IT-Experte und habe mich auch erst in fortgeschrittenem Alter in die C-Programmierung eingearbeitet. Als ich dann entdeckte, dass mit Arduino vieles komfortabler geht, benutze ich es zunehmend. Bis zur V0.2 deines Programmes hatte ich als Anwender keine Probleme, wobei ich die header-Dateien zur Kenntnis nahm, ohne sie im Detail zu verstehen – wie das bei Arduino mal so ist.
Bei V0.3 ist mir dagegen einiges aufgefallen, was ich mir nicht einfach erklären kann.
Ist es richtig, dass V0.1 und V0.2 nicht mehr compilieren, wenn MobaTools als library angelegt wurde? Bei mir wird ein Fehler angezeigt, dass die Dateinamen doppelt vorhanden sind und damit nicht eindeutig. Lösche ich MobaTools, läuft alles wie zuvor. Das würde bedeutet, dass ich die Dateibezeichnungen ändern müsste.
V0.3 läuft bei mir fehlerfrei auf einem Arduino Uno mit der Software V1.6.5-r5. Versuche ich es mit V1.0.6 zu compilieren, bekomme ich eine Flut von Fehlermeldungen, die sich auf EEMEM und eeprom beziehen (expect initializer, not declared etc.). Kann es sein, dass die V1.0.6 diese Befehle nicht unterstützt? Von WinAVR habe ich die Version 20100110 installiert, meines Wissens die neueste.


Beste Grüße
Burkhardt


railfan2401  
railfan2401
S-Bahn (S)
Beiträge: 11
Registriert am: 11.09.2014
Spurweite H0
Stromart Digital


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#83 von MicroBahner , 26.09.2015 12:09

Hallo Burkhardt,
es freut mich natürlich, wenn mein Thread dein Interesse gefunden hat und Du dich hier meldest. .
Zu deinen Fragen:

Zitat von railfan2401
Ist es richtig, dass V0.1 und V0.2 nicht mehr compilieren, wenn MobaTools als library angelegt wurde?

Ja, das ist zumindest bei V0.1 wohl so. Das sind die 'Nebenwirkungen' der Einfacheit der Arduino IDE. Man kann nur eingeschränkt bis gar nicht beeinflussen, was sie alles übersetzt. Bei V0.1 hatte ich zur einfacheren Entwicklung die Sourcen der MobaTools noch mit im Sketchverzeichnis gehalten. Sind die jetzt auch als Library vorhanden, übersetzt die IDE leider beide - was natürlich nicht sinnvoll ist und zu den angegebenen Fehlern führt. Das war mir Anfangs so auch nicht bewusst ops:

Zitat von railfan2401
Das würde bedeutet, dass ich die Dateibezeichnungen ändern müsste.

Das sollte zumindest bei der V0.1 funktionieren. Dabei geht es nur um die Datei 'Eggtimer.' im Sketchverzeichnis. Wenn Du die umbenennst musst Du natürlich auch die Includeinträge in Eggteime.cpp und im -ino File manpassen.

Bei der V0.2 verstehe ich deine Probleme noch nicht. Die bezog sich doch schon auf eine installierte MobaTools Library. Da kann ich die Fehlermeldungen nicht nachvollziehen.

Mit der V0.3 sollten die vorherigen Versionen aber eigentlich nicht mehr nötig sein - sind ja nur Zwischenstände.

Zitat von railfan2401
Versuche ich es mit V1.0.6 zu compilieren, bekomme ich eine Flut von Fehlermeldungen, die sich auf EEMEM und eeprom beziehen

Ich gebe zu, mit der IDE V1.0 habe ich es nicht versucht - die habe ich auch gar nicht installiert. Ich müsste also wohl dazuschreiben, dass die MobaTools erst ab IDE V1.6 funktionieren ( Wobei die von dir angegebenen Fehlermeldungen sich gar nicht auf die MobaTools beziehen, sondern auf den Sketch). Natürlich könnte man alles auf die EEPROM Library des Arduino umstellen ( ich nehme an, die ist kompatibel zu 1.0 ). Mir gefällt halt nicht, dass man da die EEPROM-Adressen selbst verwalten muss. Im Sinne eines 'echten' Arduino Sketches wäre es aber wohl die bessere Variante .
Andererseits kenne ich durchaus auch andere Libraries und Sketche, die lt. Beschreibung erst ab IDE 1.6 funktionieren. 'Rückwärtskompatibilität' ist ja nicht immer gegeben


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#84 von MicroBahner , 27.09.2015 20:07

Hallo Burkhardt,
noch ein Nachtrag zur IDE 1.0.6: Ich habe sie mir jetzt mal auf einem 2. Rechner installiert. Um den V0.3 Sketch zu übersetzen musst Du am Anfang bei den Zeilen mit den Includefiles noch

1
 
#include &lt;avr/eeprom.h&gt;
 


einfügen. Dann kompiliert es bei mir fehlerfrei. Bei der neuen IDE wird dieses h-File wohl automatisch eingebunden.

Die EEPROM-Lib der Version 1.0.6 macht übrigends nichts anderes, als noch mal einen Aufruf um die avr-Aufrufe drumzubinden. In der 1.6 ist die EEPROM Lib deutlich erweitert.


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#85 von railfan2401 , 28.09.2015 15:48

Hallo Franz-Peter,
vielen Dank für deine Nachrichten, die sehr hilfreich waren. Auch bei mir compiliert jetzt alles einwandfrei, sowohl unter 1.0.6 und 1.6.5. Jetzt werde ich es bei Gelegenheit einem Praxistest unterziehen, wobei V0.1 schon vor einiger Zeit erfolgreich lief.


Beste Grüße
Burkhardt


railfan2401  
railfan2401
S-Bahn (S)
Beiträge: 11
Registriert am: 11.09.2014
Spurweite H0
Stromart Digital


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#86 von MicroBahner , 08.10.2015 12:07

Hallo liebe Moba und Arduino-Freunde
Wie ich schon geschrieben hatte, habe ich mich jetzt mit der Schrittmotorversion des Schrankenantriebs beschäftigt. Vorteil gegenüber der Servo-Version ist eindeutig die nahezu geräuschlose Arbeitsweise und die sehr gleichmäßige und ruckelfrei Bewegung.
Der Nachteil wurde auch schon angesprochen: da der Schrittmotor nicht absolut positioniert werden kann, braucht es einen Referenzpunkt. Auch da wurden im Forum schon verschiedene Lösungswege gezeigt - mit Microschalter oder sogar ganz ohne .
Ich habe nun eine Lösung gesucht, bei der der Referenzpunkt nicht ausserhalb des Bewegungsbereiches der Schranke liegt - denn das ist bezügl. der Mechanik nicht immer ganz einfach. Meine Lösung arbeitet mit einer Segmentscheibe auf der Schrittmotorachse und einer Lichtschranke.

Die Lichtschranke ist auf dem Bild oben rechts zu erkennen. Der Fototransistor liegt hinter dem etwas größeren Loch in der Lochrasterplatte.
Die seltsame Konstruktion mit dem Gummiband hat andere Gründe: Damit kommt eine Vorspannung auf das Untersetzungsgetriebe, so dass in beiden Drehrichtungen die gleichen Zahnflanken belastet werden. Dies eliminiert das Getriebespiel, was wesentliche Vorteile beim 'Nachwippen' bringt. Eine lange weiche Spiralfeder wäre zwar besser, aber sowas hatte ich leider nicht. Das Gummiband muss man gegebenenfalls austauschen, wenn es spröde wird. Ist alles recht 'prototypmäßig' und lässt sich auch wesentlich ordentlicher aufbauen, aber es funktioniert. Dass die Segmentscheibe ein Zahnrad ist, liegt einfach daran, dass das in der Grabbelkiste lag, und von der Größe her passte . Die Justierung der Segmentscheibe ist recht unkritisch. Der Referenzpunkt muss nur irgendwo innerhalb des Bewegungsbereiches sein, am besten einigermaßen in der Mitte.

Vorteile dieser Lösung:

  • Durch die Segmentscheibe kann die Steuerung beim Start sofort erkennen, ob sich der Schrittmotor in der Stellung 'Auf' oder 'Zu' befindet. Damit ist klar, in welche Richtung der Motor drehen muss.
  • Der Referenzpunkt wird bei jeder Bewegung durchlaufen. Ein gesonderter Bewegungsablauf zum Setzen des Referenzpunktes ist nicht notwendig. Bei jedem Öffnen und Schliessen wird der Referenzpunkt automatisch gesetzt.

Hier mal ein Video dazu:


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#87 von garti62 , 08.10.2015 17:32

Hallo Franz-Peter,

ich muß mich mal kurz zu Wort melden und mich für die Idee mit dem Gummiband bedanken, da muß man erst mal drauf kommen! Aus dem vormals recht abgehackten, na ja,ich nenn es trotzdem mal "Nachwippen" wird eine richtig geschmeidige Bewegung. Und ich habe nur zwei kleine Löcher bohren und eine kleine Feder nachrüsten müssen. Super!

Schönen Dank
sagt Ulli


erste Versuche: Weichenbau


 
garti62
InterCity (IC)
Beiträge: 645
Registriert am: 08.11.2011


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#88 von Mape71 ( gelöscht ) , 13.10.2015 20:49

Hallo Franz-Peter,

wie schon im Post DCC Servodecoder geschrieben - sehr beeindruckend, vor allem die Version mit den Steppermotoren. Mein Traum für eine solche Schrankensteuerung - ein Sketch für den Arduino, der über DCC angesprochen wird und bei dem insgesamt bis zu 4 Steppermotoren (für 4 Halbschranken) angesprochen werden. Allerdings wird es dann vermutlich mit den Ein-und Ausgängen des Arduino Uno etwas knapp, oder? Es müssten dann ja 16 Ausgänge für die Steppermotoren, 2 Ausgänge für die Blinker, 1 Ausgang für die Glocke, Ein Eingang für das DCC Signal, 4 Eingänge für die Fototransistoren zur Lageerkennung der Schrittmotoren sowie ggf. noch die Eingänge für die Taster zur Endlagenbestimmung vorgesehen werden - von daher wird das mit dem Uno so sicher nicht funktionieren, oder? Allerdings ist der Arduino Mega ja mit ca. 20 Euro auch nicht gerade teuer - und da sollte es dann ja mit Ein- und Ausgängen wieder reichen. Hast Du so etwas in der Planung?

Viele Grüße

Marko


Mape71

RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#89 von Bodo , 14.10.2015 07:45

Hallo Marco,

die MobaTools von Franz-Peter können doch über SPI 4 Schrittmotoren ansteuern - mit drei Ports und zwei Schieberegistern für die Motoren bist Du also dabei. An der UNO-Hardware wird das nicht scheitern - da geht mehr, als man auf den ersten Blick glaubt. .

Viele Grüße, Bodo


Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)

Meine Anlage - Meine Dauerbaustelle
Platinen für Modellbahn- und Arduino-Anwendungen


 
Bodo
InterCityExpress (ICE)
Beiträge: 2.473
Registriert am: 28.04.2005
Homepage: Link
Gleise C-Gleis, Lenz 0
Spurweite H0, 0
Steuerung MS2 & CS2
Stromart Digital


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#90 von MicroBahner , 14.10.2015 10:11

Hallo Marko, hallo Bodo,
wie Bodo schon geschrieben hat, ist es von den Anschlusspins her kein Problem, wenn man die Schrittmotoren über SPI ansteuert. Da reicht der Uno ( oder - für eigene Schaltungen besser geeignet - der Nano ) aus.
Der aktuelle Stand des Sketches ist auch schon für 4 Schrankenbäume vorbereitet. Das Schließen kann für jeden Baum individuell verzögert werden, so dass der jeweils in Fahrtrichtung der Autos hintere Schrankenbaum vorbildgerecht später schließt ( ist aber noch nicht getestet ).

Etwas problematisch wird es, wenn Du die Schranke direkt über DCC ansteuern willst. Ich habe es zwar noch nicht probiert, aber grundsätzlich sollte die NmraDcc-Lib da schon noch einbindbar sein. Dann wird es aber eng mit den PWM (analog) Ausgängen, die für den Wechselblinker gebraucht werden. Die sind ja von den Timern abhängig. PWM an Pin 9 und 10 fallen aus, weil sie den Timer1 benötigen, der aber von den MobaTools belegt ist. PWM an Pin 3 und 11 benutzen den Timer 2, der grundsätzlich frei ist. Allerdings benutzt die SPI-Schnittstelle auch den Pin 11, weshalb dort der PWM wegen der Schrittmotoransteuerung ausfällt. Dann haben wir noch PWM an Pin 5 und 6, die am 'System' Timer0 hängen. Den benutzt aber die NmraDcc Lib mit, und stellt ihn so um, dass die PWM da auch nicht mehr funktionieren. Letztendlich bleibt dann also nur der Pin3 übrig. Wir brauchen für den Wechselblinker aber 2 PWM_Ausgänge. Ohne das weiche Auf- Abblenden wirkt der Wechselblinker meiner Meinung nach nicht gut.

Alternativen wären:

  • Das weiche Auf- Abblenden per HW realisieren und im Sketch nur einfaches Ein/Ausschalten der Ausgänge
  • Die NmraDcc-Lib so umbauen, dass sie den Timer 0 nicht mehr benötigt. Das ist zwar grundsätzlich möglich, habe ich derzeit aber eigentlich nicht vor . Wobei die softwaretechnisch einfachste Variante auch noch etwas zusätzliche HW benötigt und dann 2 Input-Pins belegt.
  • Du nutzt doch den Mega, weil der mehr Möglichkeiten für PWM-Ausgänge bietet. ( wobei der ansonsten eigentlich eher 'oversized' für die Schranke ist)
  • Du nutzt einen Ausgang eines anderen DCC-Decoders (z.B. den für deine Werkshalle) und steuerst damit den Eingang zum Schranke schliessen/öffnen. ( Das würde ich bevorzugen)


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#91 von JSo , 14.10.2015 14:58

Hallo Marko,

Zitat von Mape71
...insgesamt bis zu 4 Steppermotoren (für 4 Halbschranken) ... mit den Ein-und Ausgängen des Arduino Uno etwas knapp, oder?


Könnte man reduzieren indem man mehrere Schranken mit einer Mechanik mit nur einem Schrittmotor betreibt.
Auch sollte man den Stromverbrauch der Schrittmotoren und die maximale Belastbarkeit des Arduino im Hinterkopf behalten.
Als "die Lösung" werfe ich mal den Begriff "Schrittmotortreiber" in den Raum.

Ein a4988 ist so ein Teil und funktioniert bei mir mit nem NEMA17 (~2A) problemlos und du bräuchtest nur 2 Pins (Richtung und Step).
Auch sind dann Mikroschritte mit kleinerer Auflösung möglich (falls ihr das nicht eh schon mit der Stepper-Lib macht). (1/2, 1/4, 1/8 und 1/16 Schritte)


Gruß
Jan


JSo  
JSo
S-Bahn (S)
Beiträge: 10
Registriert am: 22.01.2015


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#92 von MicroBahner , 14.10.2015 15:52

Hallo Jan,

Zitat von JSo
Könnte man reduzieren indem man mehrere Schranken mit einer Mechanik mit nur einem Schrittmotor betreibt.

Das geht natürlich. Dadurch wird die Mechanik - besonders was die Einstellung der Endlagen betrifft - aber wesentlich aufwändiger. Außerdem finde ich es schöner und natürlicher, wenn sich jeder Schrankenbaum leicht unterschiedlich bewegt - und dafür braucht jeder auch einen eigenen Antrieb.

Zitat von JSo
Auch sollte man den Stromverbrauch der Schrittmotoren und die maximale Belastbarkeit des Arduino im Hinterkopf behalten.

Das stimmt. Direkt an den Arduino anschließen kann man den Schrittmotor aber eh nicht. Einen Treiberbaustein braucht man immer, egal ob einfach oder komplex.

Zitat von JSo
Ein a4988 ist so ein Teil und funktioniert bei mir mit nem NEMA17 (~2A) problemlos und du bräuchtest nur 2 Pins (Richtung und Step).

Das ist natürlich die Luxus Variante. Für so einen H0-Bü aber meiner Ansicht nach etwas überdimensioniert. Soviel 'Power' braucht man da nicht. Der Mini-Stepper, den ich dafür einsetze, reicht von der Kraft her vollkommen aus, braucht max. 200mA bei 5V und kostet inklusive Treiberbaustein gerade mal 3,90€. Durch das eingebaute Getriebe macht er ( im HALFSTEP ) 4096 Steps pro Umdrehung - da braucht man kein Microstepping mehr.

Dass die Lib derzeit den a4988 gar nicht ansteuern könnte ist ein anderes Problem. Für entsprechende Anwendungen würde eine diesbezügliche Erweiterung allerdings durchaus Sinn machen .


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#93 von sinix ( gelöscht ) , 15.10.2015 23:04

Hallo Franz-Peter,

vielen Dank für diesen tollen Fachbeitrag, der Automation mit Modellbahn auf interessante Weise verbindet.
Nun habe ich mich durch die fast 100 Postings durchgelesen und möchte ein bisschen Senf dazu geben.
Nach den ersten Beiträgen hab ich mich schon gefragt warum die Servotechnik trotz der schlechten
Eigenschaften weiterverfolgt wird, nun gehts ja mit den Schrittmotoren besser.
Nach den weiteren Beiträgen fragte ich mich, warum die Justierung/Referenzierung nicht
automatisch ablaufen soll, nun gehts ja mit der Lichtschranke

Rundrum ein tolles Projekt, das Nachwippen find ich Klasse

Zitat von MicroBahner

Ich habe nun eine Lösung gesucht, bei der der Referenzpunkt nicht ausserhalb des Bewegungsbereiches der Schranke liegt - denn das ist bezügl. der Mechanik nicht immer ganz einfach. Meine Lösung arbeitet mit einer Segmentscheibe auf der Schrittmotorachse und einer Lichtschranke.
...
Der Referenzpunkt muss nur irgendwo innerhalb des Bewegungsbereiches sein, am besten einigermaßen in der Mitte.

Vorteile dieser Lösung:
  • Durch die Segmentscheibe kann die Steuerung beim Start sofort erkennen, ob sich der Schrittmotor in der Stellung 'Auf' oder 'Zu' befindet. Damit ist klar, in welche Richtung der Motor drehen muss.
  • Der Referenzpunkt wird bei jeder Bewegung durchlaufen. Ein gesonderter Bewegungsablauf zum Setzen des Referenzpunktes ist nicht notwendig. Bei jedem Öffnen und Schliessen wird der Referenzpunkt automatisch gesetzt.




Das kann ich leider nicht ganz nachvollziehen.
Nehmen wir mal einen Spannungsausfall an und die Schranke steht in der Mitte. Die Lichtschranke ist von der Segmentscheibe belegt. Ist die Schranke nun in Stellung 'Auf' oder 'Zu'? Egal welche Richtung ich nun starte, könnte es doch sein, dass ich nicht am Referenzpunkt vorbeikomme.

Als Vorschlag würde ich in geschlossenen Zustand einen Sensor (Kontakt) bevorzugen und beim Neustart die Schranke immer schließen (wie in Sketch V0.2 15.9.2015 schön zu sehen), evtl. den Motor noch minimal nachlaufen lassen. Dann den Referenzwert = Endlage unten speichern. Dies sollte doch auch bei der Servovariante funktionieren und ein umständliches Tastendrücken entfallen.
Noch nichts gelesen habe ich über die Variante für beide Endlagen jeweils einen Sensor zu verwenden und gänzlich auf die Justierung/Referenzierung zu verzichten (zu Programmieren gibts ja immer noch genug )

Grüße ingo


sinix

RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#94 von spielbahn ( gelöscht ) , 15.10.2015 23:14

@Ingo: Endlagenschalter müssen mechanisch justiert werden. (OK, nur einmal.) Da finde ich die Lösung von Franz-Peter eleganter - auch wenn sie im jetzigen Zustand nicht alle Eventualitäten abdeckt - lässt sich evtl. programmtechnisch lösen....

@Franz-Peter: Die Schrankenbewegung sieht perfekt aus!


spielbahn

RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#95 von MicroBahner , 16.10.2015 10:25

Hallo Ingo,
danke für deinen Beitrag und dass Du dich durch alle Postings 'gekämpft' hast. Dabei hast Du sicher auch bemerkt, dass dieses Projekt nicht ganz 'geradlinig' gelaufen ist . Im Laufe der Zeit haben sich halt einige Ideen ergeben, die dann die neue Richtung bestimmt haben

Zitat von sinix
Das kann ich leider nicht ganz nachvollziehen.
Nehmen wir mal einen Spannungsausfall an und die Schranke steht in der Mitte. Die Lichtschranke ist von der Segmentscheibe belegt. Ist die Schranke nun in Stellung 'Auf' oder 'Zu'? Egal welche Richtung ich nun starte, könnte es doch sein, dass ich nicht am Referenzpunkt vorbeikomme.

Wenn die Segmentscheibe richtig ausgelegt ist, kann das nicht passieren. Die Mechanik muss so ausgelegt werden, dass es im gesamten Bewgungsabauf nur einen Wechsel im Lichtschranken Zustand gibt. Beim Prototyp ist die Lichtschranke im geöffneten Zustand frei. Während des Schließens wird Segmentscheibe die Lichtschranke abdecken und dass muss so bleiben bis die Schranke ganz geschlossen ist. Das bedeutet auch, dass die Segmentscheibe während des ganzen Bewegungsablaufs maximal eine Umdrehung - bzw. etwas weniger wegen der notwendigen Reserve - machen darf. Beim Prototyp bewegt sie sich um ca. 120 Grad, also nur ca. 1/3 Umdrehung was für einen flüssigen Ablauf bereits vollkommen ausreicht.

Beim Einschalten der Versorgungsspannung interpretiert die Software eine belegte Lichtschranke als 'ZU' und eine freie Lichtschranke als 'OFFEN'. Dabei ist es egal, ob sich die Schranke tatsächlich in der Endlage befindet, oder noch im Bereich davor. Die nächste Bewegung geht dann auf jeden Fall in die richtige Richtung und es wird der Referenzpunkt (Umschalten des LS-Zustand ) durchlaufen. Ich habe das mit diversen Tests - 'Stecker ziehen' in beliebigen Zwischenständen des Bewegungsablaufs - überprüft. Auch ob sich der Eingang für Auf/Zu während der ausgeschalteten Zeit ändert oder nicht spielt keine Rolle. Der Schrittmotor wird immer korrekt angesteuert.

Ich finde eine mechanische Justierung der Endlagen recht unpraktisch - je nach Einbauort kann das eine ziemliche 'Frickelei' werden. Elektrisch geht es wesentlich komfortabler und auch sehr sicher. Was man evtl. noch aus Sicherheitsgründen machen könnte, ist einen mechanischen Anschlag jeweils etwas außerhalb des Bewegungsende einbauen. Da die Durchzugskraft des kleinen Motors nicht sooo groß ist, ist das kein Problem. Dann kann die Mechanik auch dann nicht beschädigt werden, wenn die Software mal 'Amok' läuft - was während der Programmentwicklung ja durchaus mal vorkommen kann

Zitat von spielbahn
Da finde ich die Lösung von Franz-Peter eleganter - auch wenn sie im jetzigen Zustand nicht alle Eventualitäten abdeckt - lässt sich evtl. programmtechnisch lösen....

Danke für deine Einschätzung. Wie schon geschrieben, finde ich mechanische Endlagenjusitierung auch nicht so prickelnd. . Bisher habe ich aber noch keine Eventualität entdeckt, die meine Lösung nicht abdeckt...


Für ein überzeugendes Nachwippen ist es übrigens essentiell, dass das Getriebespiel eliminiert wird. Wenn bei der Bewegungsumkehr nur ein kurzer Stillstand auftritt, ist die Illusion dahin - das Auge ist da recht empfindlich. Je nach Aufbau der Schranke muss da auch die Kraftübertragung zur Schranke selbst berücksichtigt werden. Am besten ist es, wenn die Schranke so viel Gewicht hat, dass sie von alleine zufällt, und der Motor sie nur hochheben muss. Dass wirkt sich dann auch wie eine Getriebevorspannung aus.


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#96 von Mape71 ( gelöscht ) , 16.10.2015 12:17

Hallo miteinander,

die Ansteuerung der Stepper über ein Schieberegister scheint mir eine gute Lösung - und dann gibt es auch das von mir vermutete Ausgangsanzahlproblem nicht. Die Ansteuerung direkt über DCC würde ich - der ja ein Freund des Auslagerns von Funktionen ist - auch über einen zweiten Arduino erledigen können, das ist also gar nicht so kritisch.
Eine Verständnis-Frage zum Ansteuern des Schieberegisters habe ich aber noch. Neben den aus dem Servo-Ausgang kommenden Pulsen benötige ich auch noch mind ein CLK zum korrekten Takten des Registers. Wie würde ich das denn realisieren müssen und in den Sketch integrieren (sorry für die vermutlich einfache Frage, aber meine Arduino Karriere steckt noch in den Kinderschuhen)?

Danke und Grüße

Marko


Mape71

RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#97 von MicroBahner , 16.10.2015 20:51

Hallo Marko,
Für die Ansteuerung der Schieberegister enthalten die AtMega-Prozessoren im Arduino eine eigene Hardware - eben die SPI-Schnittstelle. Das hat also nichts mit Pulsen an einem Servo-Ausgang zu tun. Da es sich um eine spezielle HW handelt, sind auch die Pins nicht frei wählbar, sondern das externe Schieberegister muss an festgelegten Pins angeschlossen werden. Im Prinzip so:

Da sind dann alle Signale für das Schieberegister vorhanden.
SCK(Pin13) ist das Taktsignal
MOSI(Pin11) ist der Ausgang für die seriellen Daten
SS(Pin10) ist der Puls, der die Daten im Schieberegister nach dem Schieben an die Ausgänge überträgt.
MISO(Pin12) darüber könnte der Arduino gleichzeitig auch serielle Daten empfangen. Das wird aber für den Stepper nicht genutzt.

Im Sketch gibtst Du für den Stepper dann nur z.B.

1
 
myStepper.attach( SPI_1 );
 

an, und die Steuersignale für den Motor kommen an den entsprechenden Anschlüssen des Schieberegisters an. Darum wie die dorthin kommen, musst Du dich im Sketch nicht kümmern, das machen die MobaTools.

Willst Du nur 2 Stepper anschliessen, kann das untere Schieberegister ersatzlos entfallen. Dann gehen natürlich nur SPI_1 und SPI_2 als Parameter für den attach-Befehl.


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#98 von Mape71 ( gelöscht ) , 17.10.2015 20:03

Hallo Franz-Peter,

vielen Dank. Ich habe mir eine Hand voll CD4094 bestellt und werde dann mal probieren. Wird aber sicher nichts vor nächstem WE.
Und weitermuss ich nichts ändern, nur myStepper.attach... einfügen und dann geht's?

Viele Grüße

Marko


Mape71

RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#99 von MicroBahner , 17.10.2015 22:22

Hallo Marko,

Zitat von Mape71
Ich habe mir eine Hand voll CD4094 bestellt

Die (74)HC4094 wären schon besser gewesen - die sind schneller und können auch mehr Strom am Ausgang - müsste aber mit den CD4094 auch gehen. Sie werden nur mit 1MHz betrieben, und das sollten die auch können. Da Du für den Motor eh einen Treiberbaustein brauchst ( ist bei dem kleinen Stepper ja dabei ), sollte auch der Ausgangsstrom reichen.

Zitat von Mape71
Und weitermuss ich nichts ändern, nur myStepper.attach... einfügen und dann geht's?

Worauf beziehst Du dich beim 'ändern' ? Ob die Signale für den Stepper an 4 Arduino-Pins oder an dem Schieberegister rauskommen entscheidet in der Tat alleine der attach Befehl. Den brauchst Du aber immer - entweder mit 4 Pin-Nummern, oder eben mit diesem speziellen SPI_x Parameter. Aber Du brauchst natürlich auch einen Sketch der die Schrittmotore dann ansteuert - das unterscheidet sich schon etwas von der Servoansteuerung.


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


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


RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage

#100 von Mape71 ( gelöscht ) , 17.10.2015 22:34

Hallo Franz-Peter,

vielen Dank für die Rückmeldung. Ich habe so meine Probleme in einen bestehenden Sketch etwas anderes einzufügen. Das meint konkret, wenn der aktuelle Sketch Servos steuert indem er über einen Ausgang die dafür notwendigen Pulse erzeugt fällt es mir schwer diesen Sketch so umzubauen, dass anstatt der Servos nun ein Schritmotor angesteuert wird - und das dann auch noch über ein Schieberegister. In dem Post mit den DCC Servodecoder war es mir ja auch nicht eigenständig möglich anstatt der Servos einen Ausgang nur ein oder auszuschalten. Einen Sketch für einen Schrittmotor habe ich, und losgelöst verstehe ich den auch - nur diesen Sketch anstatt der Servosteuerung einzubauen - das ist die Herausforderung.

Viele Grüße

Marko


Mape71

   

CAN-Stellpult oder analoges Stellpult mit LEDs für Weichen
Viessmann 5552 Umschaltrelais gehen ständig kaputt

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