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

#101 von MicroBahner , 17.10.2015 22:51

Hallo Marko,

Zitat von Mape71
nur diesen Sketch anstatt der Servosteuerung einzubauen - das ist die Herausforderung

Zitat von Mape71
meine Arduino Karriere steckt noch in den Kinderschuhen

Aus den Kinderschuhen muss man halt erstmal rauswachsen - das braucht eben seine Zeit und dann wird das auch . Es ist noch kein (Programmier)Meister vom Himmel gefallen

Den kompletten Sketch für den Bü mit Schrittmotor hatte ich noch gar nicht hochgeladen. Das hole ich hiermit mal nach:
Sorry, war noch eine Testversion - reiche ich dann nach
Ist durch das Nachwippen und den für den Schrittmotor notwendigen Referenzpunkt aber etwas komplexer geworden .


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

#102 von Mape71 ( gelöscht ) , 17.10.2015 22:57

Hey super, vielen Dank. Ich gelobe stetige Weiterbildung - einfach auch weil mich nervt dass ich es nicht verstehe.

Danke und viele Grüße

Marko


Mape71

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

#103 von MicroBahner , 17.10.2015 23:05

Hallo,
so hier der nochmal der Sketch - jetzt sollte er ok sein:[attachment=0]BueSteuerung_V0.4S.zip[/attachment]


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

#104 von UweS , 18.10.2015 09:46

Hallo Franz-Peter,
Hallo Marko,

ich stehe auch am Anfang der Arduino Benutzung. Habe mir einen Arduino Uno R3 zugelegt und teste nun
fast täglich alle möglichen Beispiele durch.
Nutze auch die MobaTools, danke auch für Deine Unterstützung, Franz-Peter.

Ich habe auch die Beispiele der MobaTools, geändert um andere Effekte zu erhalten.
Zur Zeit bin ich dabei, die Schrankensteuerung mit Nachwippfunktion für einen Servo so zu verändern, dass er ebenso sauber läuft
wie die Schrittmoteren Version.
Ich nutze dafür einen Graupner Heliservo, stammt noch aus meiner Karriere als Helikopterpilot, läuft sehr sauber und hat enorme
Haltekräfte, also ein Schrankenbaum sollte kein Problem sein.


Uwe

Lenz Digital seit 1993, seit 2020 Roco z21 und steuern mit der Z21 App, Traincontroller Gold, Mikromodellbau, Car Motion


 
UweS
InterRegioExpress (IRE)
Beiträge: 340
Registriert am: 02.02.2012
Spurweite H0, 1
Stromart Digital


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

#105 von Mape71 ( gelöscht ) , 18.10.2015 11:11

Hallo Uwe, welches Servo verwendest Du genau? Ich habe für meine knapp 60 Weichen auch Servos verwendet und dafür verschiedenste Servos ausprobiert, sogar analoge und digitale HighSpeed Servos für den Heckrotor, die ja extrem präzise sind. Bei den Weichen am Servodecoder (Joka) habe ich mich dann letztendlich für 3 Euro Billigservos entschieden, da ich keinen großen Unterschied bei langsamen Bewegungen zu den HighEnd Servos feststellen konnte. Daher interessiert mich, was Du rausgefunden hast.

Viele Grüße

Marko


Mape71

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

#106 von UweS , 18.10.2015 12:28

Hallo Marco,

dass Heliservo von Graupner ist kein Digitalservo, es ist das C4041 und stammt aus dem Jahre 2002.
Diese Servos wurden damals in den Helis eingesetzt und sind natürlich jetzt für Helis nicht mehr Stand der Zeit.

Aber im Vergleich zu den Billigservos, die ich auch für die Weichensteuerung nutze (Modelcraft RS-2 und EMAX ES08A),
ein präzises leise laufendes Servo.
Also bei langsam Lauf um die Schranke zu bewegen, ist das Graupner Servo deutlich besser.

Für die Weichen würde ich es nicht benutzen, liegt ja immer noch im Preissegment von 15.-€.


Uwe

Lenz Digital seit 1993, seit 2020 Roco z21 und steuern mit der Z21 App, Traincontroller Gold, Mikromodellbau, Car Motion


 
UweS
InterRegioExpress (IRE)
Beiträge: 340
Registriert am: 02.02.2012
Spurweite H0, 1
Stromart Digital


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

#107 von MicroBahner , 23.10.2015 17:26

Hallo,
jetzt mal eine Bü-Version für unsere Digitalfreunde
Die letzte Schrittmotorversion habe ich auf Ansteuerung über DCC erweitert. Der Decoder ist mit im Arduino integriert - es wird also direkt das DCC-Signal an die Bue-Steuerung gelegt. Der Decoder arbeitet als Multifunktionsdecoder. Schranke schliessen / Öffnen wird über F0 gesteuert.

Damit lässt sich natürlich auch die Endlagenjustierung wesentlich eleganter lösen: Dazu kann man jetzt einfach einen Handregler hernehmen und mit dem Fahrknopf die Endlagen einstellen. Zur Sicherheit muss für die Endlagenjustierung ein Justageeingang auf 0 gezogen werden ( z.B. mit einem Brückenstecker ). Dann kann mit F1 ... F4 die Justierung für bis zu 4 Schrankenbäume aktiviert werden. Welche Endlage eingestellt wird, bestimmt der Schrankenzustand (Offen oder geschlossen). Wird z.B. F1 aktiviert, so kann nun der 1. Schrankenbaum mit dem Fahrregler bewegt werden. Wird F1 wieder abgeschaltet, wird die aktuelle Position des Schrankenbaums als Endlage übernommen. Dazu ein kleines Video:



Für die DCC-Decodierung wird die NmraDcc-Lib verwendet. Wie in einem vorigen Postschonmal erwähnt ist dazu eine leicht modifizierte Version notwendig, da sonst die Wechselblinker mit dem weichen Auf- und abblenden nicht mehr funktionieren würden.

Der Sketch ist allerdings nochmal etwas umfangreicher geworden:

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
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
 
/* Schrankensteuerung V0.5DCC Stepmotorversion 23.10.2015
* -- Version mit Schrittmotoren und Nachwippen
* Die Schrankensteuerung benötigt die 'MobaTools' - library ab der Version 0.5
* und die NmraDcc Lib in der Version ohne Nutzung des Timer0
*
* V0.5DCC Version mit Ansteuerung über DCC. Der Schranke wird eine Lokadresse zugeordnet.
* F0 bestimmt den Zustand der Schranke (Auf/Zu)
* F1-F4 aktivieren die Justierung der Schrankenbäume 1-4. Im jeweiligen Zustand (Auf/Zu) kann dann
* die Lage der Schranke über den Fahrregler eingestellt werden. Mit dem Ausschalten der Funktion
* wird die dann aktive Position des Schrankenbaums abgespeichert.
*
* V0.4S Version mit Schrittmotoren und Nachwippen. Der Referenzpunkt des Schrittmotors wird über
* eine Segmentscheibe und Lichtschranke realisiert, und muss im Bewegungsbereich der Schranke liegen.
*
* 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.
*
*/
 
#include <MobaTools.h>
#include <NmraDcc.h> // es wird die Variante ohne Timer0 - Nutzung benötigt
 
#define DCC_ADDR 9999 // bis 99 wird kurze Adressierung verwendet, ab 100 die lange
#define DEBUG ; // Wenn dieser Wert gesetzt ist, werden Debug ausgaben auf dem ser. Monitor ausgegeben
 
// gegebenenfalls anzupassende Werte (weitere Werte können im Abschnitt 'Portzuordnungen und Konstante' angepasst werden)
#define GLOCKE_ZYK 1000 // Glockenzyklus und Impulslänge muss an das angeschlossene Soundmodul
#define GLOCKE_PULS 200 // angepasst werden.
 
////////////////////////////////////////////////////////////////////////
//////////////// Portzuordnungen und Konstante /////////////////////////
// 1. Einschaltlogik --------------------------------------------------
// in dieser Version wird die Schranke über DCC-Signale gesteuert
const byte DccInputP = 2 ; // muss ein IRQ-fähiger Port sein (2 oder 3 auf Uno+komp. )
 
// 2. Ablaufsteuerung --------------------------------------------------
// Antriebsmotore ( für 2 Schrankenbäume, bei 4 Schrankenbäumen müssen die Arrays entsprechend erweitert werden )
const byte StepPort[] = {SPI_1,SPI_2}; // Step-Motore über SPI-Schieberegister angeschlossen
const byte refLsP[] = {A3,A2}; // Anschluß Lichtschranke für Referenzpunkt des Schrittmotors
const byte SCHRANKENZAHL = sizeof( refLsP ); // Zahl der Schrankenbäume
const int8_t RichtungZu[] = { 1, 1 }; // Drehrichtung des Motors beim Schliessen der Schranke ( +1 oder -1 )
const byte refLsZu[] = { HIGH, HIGH }; // LS-Eingang im Bereich der geschlossenen Schranke
#define ENDPOS_INIT 20 // Initiale Winkellage (+/- vom Refpunkt) für die Endpositionen.
// Die Werte können über die Justierung angepasst werden
const int steps360 = 4096; // Schritte für eine Umdrehung
const byte schrTempo[] = { 20,21 };
const int schrVerzZU[] = { 10, 500 }; // Verzögerung für die Schrankenbewegung (ms)
// damit laufen die Schranken nicht exakt gleichzeitig los.
// bei 4 Schrankenbäumen kann dies genutzt werden, um die in Auto-Fahrtrichtung
// hinteren Schranken später schliessen zu lassen
 
const int vorlaufZu = 6000; // Vorlaufzeit: Glocke und Wechselblinker aktiv, Schranke noch ruhend
const int nachlaufZu = 2000; // Nachlaufzeit: Schranke zu, Glocke nochaktiv
 
// Definitionen für das Nachwippen
#define WIPPBEREICH 5
byte wippIx[SCHRANKENZAHL]; // Index in die Tabelle für die Nachwippbewegungen
int wippPos[] = {-20,0,-10,0,-5,0}; // Wipppunkte in 1/10 °, gerechnet von Endpunkt
byte wippSpeed[] = {12,0,6,0,3,0}; // Tempo an den Wippunkten. 0 = keine Änderung
const byte wippPnts = sizeof(wippPos)/sizeof(int); // Zahl der Wipppunkte
 
// 3. Glocke -------------------------------------------------------------
const byte glockeP = 4; // Impulsausgang zur Ansteuerung einer Glocke
const int glZykl = GLOCKE_ZYK; // Glockenrythmus
const int glImp = GLOCKE_PULS; // 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. ----------------------------------------------------------------
const byte InitJustageP = 7; // Pin LOW: Justage der Endlagen möglich
// Pin LOW beim Programmstart: Alle Werte initiieren
byte justageMode;
 
////////////////////// globale Variable //////////////////////////////////////
// 1. Einschaltlogik ----------------------------------------------------
bool schrankeSchliessen; // Wird über DCC, F0 gesetzt
 
NmraDcc DCC;
// 2. Ablaufsteuerung ---------------------------------------------------
// Aufteilung der CV-Variablen (Standardadressen werden in NmraDcc.h definiert)
// CV-Adressen für die Speicherung der Endlagen ( in Grad vom Refpunkt , ohne Vorzeichen )
const word CvPosZu = 47; // max Winkel 250 Grad vom Refpunkt, 255 gilt als ungültig (leeres EEPROM)
const word CvPosAuf = CvPosZu+(SCHRANKENZAHL) ;
 
// Variable im RAM
int positionZu[SCHRANKENZAHL]; // Endlage, über Justiervorgang einstellbar
int positionAuf[SCHRANKENZAHL]; // Endlage, über Justiervorgang einstellbar
byte justageAktiv[SCHRANKENZAHL]; // über DCC F1...F4 ein/ausschalten
 
// Aufrufparameter für das Unterprogramm 'Schrankenbewegung':
#define SB_INIT 0 // Servoansteuerung initiieren
#define SB_START_AUF 1 // Schranke öffnen starten
#define SB_START_ZU 2 // Schranke schliessen starten
#define SB_ENDE 3 // Bewegung überwachen und Ende erkennen. Ggfs. Endlagen justieren
 
Stepper4 Schranke[SCHRANKENZAHL] = { steps360,steps360 }; // Für die Schrankenmotore
EggTimer SchrankeT[SCHRANKENZAHL]; // Schrankenspezifische Zeiten
EggTimer VorlaufT; // Timer der Ablaufsteuerun
 
// Zustand, in dem sich die Ablaufsteuerung gerade befindet
byte bueZustand; // Aktueller Zustand
#define OFFEN 50
#define VORLAUF_ZU 51 // Wechselblinker und Glocke, aber noch keine Bewegung
#define SCHRANKE_SCHLIESST 52 // Bewegung Schrankenbaum zu
#define NACHLAUF_ZU 53 // Beide Schrankenbäume in Endpos, Glocke läutet noch.
#define GESCHLOSSEN 54 // Schranke geschlossen
#define SCHRANKE_OEFFNET 56 // 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
#ifdef DEBUG
#define DB_PRINT( ... ) {sprintf( dbgbuf,"Dbg: " __VA_ARGS__ ) ; Serial.println( dbgbuf );}
byte debug;
char dbgbuf[80];
#else
#define DB_PRINT ;
#endif
 
//###################### Ende der Definitionen ##############################
//###########################################################################
 
void setup()
{
byte i;
#ifdef DEBUG
Serial.begin(115200); //Debugging
long waitMax = millis()+5000;
while( !Serial && millis()<waitMax); // nur bei Arduino-Micro oder Leonardo notwendig
Serial.println( "start of Program" );
#endif
 

pinMode( InitJustageP, INPUT_PULLUP );

// 1. Einschaltlogik ----------------------------------------------------
// Initiieren des DCC-Decoders
DCC.pin(digitalPinToInterrupt(DccInputP), DccInputP, 1); // Dcc-Signal mit Pullup
DCC.init( MAN_ID_DIY, 01, FLAGS_MY_ADDRESS_ONLY, 0 ); // Multi-Funktionsdecoder, nur eigene Adresse
 
// 2. Ablaufsteuerung ---------------------------------------------------
// Eingänge für die Referenzpunkt-Lichtschranken
for ( i=0; i<SCHRANKENZAHL; i++ ) {
pinMode( refLsP[i], INPUT );
}
////////////////// Grundinitiierung ////////////////////////////////////
// Testen ob gültige Werte im EEProm. Wenn nicht, Grundinitiierung mit default-Werten
// Initiiert wird auch, wenn der Justageschalter beim Start geschlossen ist
if ( DCC.getCV( CvPosZu ) == 255 || digitalRead( InitJustageP ) == LOW ){
// Grundinitiierung
//DB_PRINT( "CV Initiierung" );
// Endlagen auf die Default-werte setzen
for ( i=0; i<SCHRANKENZAHL; i++ ) {
DCC.setCV( CvPosZu+i, ENDPOS_INIT );
DCC.setCV( CvPosAuf+i, ENDPOS_INIT );
}
// DCC-Adresse setzen ( Multifunktionsdecoder )
if ( DCC_ADDR > 99 ) {
// lange Adresse
DCC.setCV( 17, DCC_ADDR >> 8 | 0b11000000 );
DCC.setCV( 18, DCC_ADDR & 0xff );
DCC.setCV( 29, DCC.getCV(29) | 0b00100000 ); // lange Adressierung
} else {
// kurze Addresse:
DCC.setCV( 1, DCC_ADDR );
DCC.setCV( 29, DCC.getCV(29) & ~0b00100000 ); // kurze Adressierung
}
}

/////////////////////////////////////
// Positionswerte aus EEProm lesen
for ( i=0; i<SCHRANKENZAHL; i++ ) {
positionZu[i] = DCC.getCV( CvPosZu+i) * RichtungZu[i] ;
positionAuf[i] = DCC.getCV( CvPosAuf+i ) * -(RichtungZu[i]);
DB_PRINT( "Schr.%d - PosZu=%d PosAuf=%d", i, positionZu[i], positionAuf[i] );
}
 
#ifdef DEBUG
// CV-Werte ausgeben
DB_PRINT( "CV1:%d, CV29:%x, CV7=%d, CV8=%d", DCC.getCV(1), DCC.getCV(29), DCC.getCV(7), DCC.getCV(8) );
DB_PRINT( "CV17:%d, CV18:%d" ,DCC.getCV(17), DCC.getCV(18) );
#endif

//////////////////////////////////////
/////// Antriebs-Initiierung ////////////
Schrankenbewegung( SB_INIT );
 
// Anfangsstellung der Schranke setzen
// Die Stellung des Schrankenbaums 1 definiert den Zustand der gesamten Schrankenanlage
if ( digitalRead( refLsP[0]) == refLsZu[0] ) {
bueZustand = GESCHLOSSEN;
schrankeSchliessen = true;
Schrankenbewegung( SB_START_ZU );
DB_PRINT( "Init = ZU" );
while ( !Schrankenbewegung( SB_ENDE ) );
wbAktiv = true;
} else {
bueZustand = OFFEN;
schrankeSchliessen = false;
Schrankenbewegung( SB_START_AUF );
DB_PRINT( "Init = AUF" );
while ( !Schrankenbewegung( SB_ENDE ) );
}

// 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. -----------------------------------------------------------------

} // End Setup
//############################### ENDE SETUP ##################################
//#############################################################################
 
void loop()
{
// 1. Einschaltlogik ----------------------------------------------------
////////////// Eingang zur Steuerung des Bahnübergangs /////////////////
DCC.process();
// schrankeSchliessen wird in notifyDccFunc gesetzt
justageMode = ( digitalRead( InitJustageP ) == LOW );

// 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. Diesen Befehl auskommentieren wenn die Glocke erst
// mit der Schrankenbewegung starten soll
if ( justageMode ) VorlaufT.setTime( 100 ); // keine Verzögerung während Justage
else VorlaufT.setTime( vorlaufZu );
bueZustand = VORLAUF_ZU;
//DB_PRINT("Zustandswechsel: %d", bueZustand );
}
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 ;-)
wbAktiv = true;
Schrankenbewegung(SB_START_ZU); // Überwachung initiieren
bueZustand = SCHRANKE_SCHLIESST;
}
break; //----------------------------------------------------------
case SCHRANKE_SCHLIESST:
// Schrankenbaum schliesst sich.
if ( ( Schrankenbewegung( SB_ENDE ) ) ) {
// beide Schrankenbäume haben ihre Endposition erreicht
if ( justageMode ) VorlaufT.setTime( nachlaufZu );
else VorlaufT.setTime( 100 ); // keine Verzögerung während Justage
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
Schrankenbewegung(SB_START_AUF); // Überwachung initiieren
wbAktiv = false; // Wechselblinker ausschalten
bueZustand = SCHRANKE_OEFFNET;
}
break; //----------------------------------------------------------
case SCHRANKE_OEFFNET:
// Schrankenbaum öffnet sich, warten bis offen
if ( schrankeSchliessen == true ) {
// Notfall: beim Öffnen der Schranke kommt wieder der Befehl Schranke schliessen
bueZustand = VORLAUF_ZU; // Da der Vorlauftimer nicht läuft, schliesst die Schranke sofort

}
if ( Schrankenbewegung( SB_ENDE ) ) {
// 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
//#################### ENDE LOOP ##################################################
//#################################################################################
 

byte Schrankenbewegung( byte mode ) {
// Bewegungsvorgang der Schranken überwachen
// Das Unterprogramm wird im Loop währende der Bewegung zyklisch aufgerufen
// Der Funktionswert ist 'true', wenn die Bewegung aller Schranken abgeschlossen ist,
// sonst immer 'false'
// mode:SB_INIT Grundinitiierung
// SB_START_ZU Schliessen der Schranken einleiten
// SB_START_AUF Öffnen der Schranken einleiten
// SB_ENDE Bewegung überwachen, meldet 'true' wenn alle Bewegungen abgeschlossen
// sind
// -------------------------------------------------------------------------
//
static enum { WAIT, NORMAL, WIPPEN, FIND_REF, STOP } ssZustand[SCHRANKENZAHL] ;
static int startPos[SCHRANKENZAHL] ; // Position der Schranke zu Bewegungsbeginn
static byte gotRef[SCHRANKENZAHL] ; // Flag ob Referenzpunkt bekannt ist
static enum { AUF,ZU } richtung;

byte bewegung=0, sn, refLS;
int tmp;
for( sn=0; sn<SCHRANKENZAHL; sn++ ) {
// für alle Schranken durchlaufen
switch ( mode ) {
case SB_INIT: // Initiierung der Schranken
//DB_PRINT("SB_INIT(%d)",sn);
Schranke[sn].attach(StepPort[sn] ); // Schrittmotore an SPI_x
Schranke[sn].setSpeed( schrTempo[sn] );
gotRef[sn]=false;
bewegung = 1;
break; //---------------------------------------------
case SB_START_ZU: // Schliessen der Schranken einleiten
//DB_PRINT("SB_START_ZU(%d)",sn);
richtung =ZU;
Schranke[sn].setSpeed( schrTempo[sn]);
SchrankeT[sn].setTime( schrVerzZU[sn] ); //Wartezeit bis Schrankenbewegung
//DB_PRINT( "Start Wartezeit %d mit %d ms", sn, schrVerzZU[sn] );
ssZustand[sn] = WAIT;
bewegung = 1;
break; //---------------------------------------------
case SB_START_AUF: // Öffnen der Schranken einleiten
richtung = AUF;
Schranke[sn].setSpeed( schrTempo[sn]);
if ( digitalRead( refLsP[sn] ) == refLsZu[sn] ) {
// Bewegung AUF nur starten, wenn sich die Schranke im Bereich ZU befindet
// Zur Sicherheit dreht der Motor max 1/2 Umdrehung. In diesem Bereich muss er die
// Referenzpunkt LS erreichen, wo auf den endgültigen Endpunkt umgeschaltet wird
Schranke[sn].doSteps( -(RichtungZu[sn]) * steps360/2);
//DB_PRINT( "doSteps(%d):%d R=%d S=%d",sn, RICHTUNG_AUF * steps360/2 , RICHTUNG_AUF, steps360);
ssZustand[sn] = FIND_REF;
//DB_PRINT("SB_START_AUF(%d)->FIND_REF",sn);
} else if ( gotRef[sn] ) {
// steht noch im Bereich 'AUF', könnte Notumkehr sein. Da ref bekannt ist, direkt
// auf Position Auf
Schranke[sn].write(positionAuf[sn]);
ssZustand[sn] = NORMAL;
//DB_PRINT("SB_START_AUF(%d)->NORMAL(write)",sn);
} else {
// nichts tun
ssZustand[sn] = STOP; // keine Aktion
//DB_PRINT("SB_START_AUF(%d)->JUSTAGE_ENDE(nichts)",sn);
}
startPos[sn] = Schranke[sn].read();
//DB_PRINT( "Schranke %d, Position: %d, Richtung= %d", sn, startPos[sn], richtung );
bewegung = 1;
break; //---------------------------------------------
case SB_ENDE: // Bewegung überwachen, auf Ende prüfen
// Schrankenbewegung
switch ( ssZustand[sn] ) {
case WAIT: // Verzögerungszeit bis zum Schrankenstart abwarten
// Wird nur beim Schliessen der Schranke durchlaufen
if ( SchrankeT[sn].running() == false ) {
// Zeit abgelaufen, Bewegung starten
//Schranke[sn].write( positionZu[sn]);
if ( digitalRead( refLsP[sn]) != refLsZu[sn] ) {
// Bewegung ZU nur starten, wenn sich die Schranke im Bereich AUF befindet
// Zur Sicherheit dreht der Motor max 1/3 Umdrehung. In diesem Bereich muss er die
// Referenzpunkt LS erreichen, wo auf den endgültigen Endpunkt umgeschaltet wird
Schranke[sn].doSteps( RichtungZu[sn] * steps360/2);
//DB_PRINT( "doSteps(%d):%d", sn, RICHTUNG_ZU * steps360/2 );
ssZustand[sn] = FIND_REF;
//DB_PRINT("WAIT(%d)->FIND_REF",sn);
} else if ( gotRef[sn] ) {
// steht noch im Bereich 'ZU', könnte Notumkehr sein. Da ref bekannt ist, direkt
// auf Position Zu
Schranke[sn].write(positionZu[sn]);
//DB_PRINT("WAIT(%d)->NORMAL(write)",sn);
ssZustand[sn] = NORMAL;
} else {
// nichts tun
//DB_PRINT("WAIT(%d)->JUSTAGE_ENDE(nichts)",sn);
ssZustand[sn] = STOP; // keine Aktion
}
startPos[sn] = Schranke[sn].read();
//DB_PRINT( "Schranke %d, Position: %d, Richtung= %d", sn, startPos[sn], richtung );
}
bewegung = 1;
break; //......................................
case FIND_REF: // Bewegungsablauf bis zur LS überwachen. An der LS wird der Refpunkt gesetzt und die
bewegung += Schranke[sn].moving();
// Eigentliche Endposition angesteuert.
refLS = digitalRead( refLsP[sn] );
//if ( sn == 0 ) DB_PRINT( "refLS=%d", refLS );
if ( richtung == ZU && refLS == refLsZu[sn] ) {
//Lichtschranke beim Schliessen erreicht)
Schranke[sn].setZero();
gotRef[sn] = true;
Schranke[sn].write( positionZu[sn]);
//DB_PRINT( "FIND_REF(%d)->NORMAL(zu)",sn );
ssZustand[sn] = NORMAL;
}
if ( richtung == AUF && refLS != refLsZu[sn] ) {
//Lichtschranke beim Öffnen erreicht)
Schranke[sn].setZero();
gotRef[sn] = true;
Schranke[sn].write( positionAuf[sn]);
//DB_PRINT( "FIND_REF(%d)->NORMAL(auf)",sn );
ssZustand[sn] = NORMAL;
}
break;
case NORMAL:
tmp = Schranke[sn].moving();
bewegung += tmp;
if (tmp < WIPPBEREICH && !justageMode ) {
//DB_PRINT( "NORMAL(%d) -> WIPPEN", sn );
ssZustand[sn] = WIPPEN;
wippIx[sn] = 0; // Zähler für die Wippbewegungen
}
break; // .....................................
case WIPPEN:
tmp = Schranke[sn].moving();
bewegung += tmp;
if ( tmp == 0 ) {
// keine Bewegung mehr aber noch Wippen ?
if ( wippIx[sn] < wippPnts ) {
// nächsten Wipppunkt anfahren
tmp = 10* ((richtung == AUF) ? positionAuf[sn] : positionZu[sn]); // in 1/10° umrechnen
tmp = (tmp>0) ? tmp + wippPos[wippIx[sn]] : tmp - wippPos[wippIx[sn]];
if ( wippSpeed[wippIx[sn]] ) Schranke[sn].setSpeed( wippSpeed[wippIx[sn]]);
Schranke[sn].write( tmp, 10 );
//DB_PRINT( "Wip.write( %d , 10 )", tmp );
wippIx[sn]++;
bewegung +=1; // Es ist noch nicht zu Ende!
}
}
break; //......................................
case STOP:
// keine Aktion, nur auf Schrankenstop warten
bewegung += Schranke[sn].moving();

break; //......................................
} // ..... Ende switch 'Schrankenzustand' ......

break; //---------------------------------------------
default:
// falscher Programmaufruf, keine Reaktion
;
} // --- Ende Switch 'mode' --------
} // ........Ende forschleife der Schranken........
 
if ( bewegung == 0 ) DB_PRINT( "Endpositionen erreicht");
return ( bewegung == 0 );
}

//###################################################################################
//###################### DCC - Funktionen ###########################################
 
// Geschwindigkeitstelegramm =========================================================
// wird hier zur Endlagenjustierung genutzt. Der Geschwindikeitswert wird
// als Positionsdifferenz ( in Grad ) zur derzeitigen Position ausgewertet.
// Die Endlagenjustierung ist nur aktiv,
// - wenn der Justiereingang auf LOW steht, und
// - wenn der Bue-Zustand OFFEN oder GESCHLOSSEN ist (dies bestimmt auch welche Endlage eingestellt wird)
// - mindestens eine der DCC-Funktionen F1 ... F4 ( jeweils für Schrankenbaum 1...4 ) aktiv ist.
// Wird die DCC Funktion abgeschaltet, so wird die momentane Position des Schrankenbaums als Endlage gespeichert.
// ( im Funktionstelegramm, s.u. )
//
void notifyDccSpeed( uint16_t Addr, uint8_t Speed, uint8_t ForwardDir, uint8_t MaxSpeed ){
// Geschwindigkeitstelegramm nur zur Justage auswerten
int8_t vSpeed;
Speed--;
// Maximal +/- 32 Grad für die Justierung
if ( MaxSpeed > 28 ) Speed /= 4;

vSpeed = ForwardDir? -Speed:Speed;
static int8_t lastSpeed;
if ( vSpeed != lastSpeed ){
// Geschwindigkeitswert hat sich verändert, gegebenenfalls Schrankenposition aktualisiern
if ( (bueZustand == OFFEN || bueZustand == GESCHLOSSEN) && justageAktiv) {
// im Zustand OFFEN oder GESCHLOSSEN ist Justage möglich
for ( byte i= 0; i<SCHRANKENZAHL; i++ ) {
// Justagezustand prüfen und Schrankenbaum gegebenenfalls bewegen
if( justageAktiv[i] ) {
// Schrankenbaum entsprechend vSpeed positionieren. Der über DCC vorgegebene
// Wert wird nur übernommen, solange sich der Schrankenbaum noch im richtigen
// Bereich der LS befindet.
Schranke[i].setSpeed( schrTempo[i]/2 );
if ( bueZustand == OFFEN ) {
if ( digitalRead( refLsP[i] ) != refLsZu[i] ) {
// noch im korrekten Bereich, Position übernehmen
Schranke[i].write( positionAuf[i]+vSpeed );
} else if ( (vSpeed * RichtungZu[i]) < 0 ) {
// wir sind im falschen Bereich, aber Richtung geht zum richtigen Bereich
Schranke[i].write( positionAuf[i]+vSpeed );
}
} else if ( bueZustand == GESCHLOSSEN ) {
if ( digitalRead( refLsP[i] ) == refLsZu[i] ) {
Schranke[i].write( positionZu[i]+vSpeed );
} else if ( (vSpeed * RichtungZu[i]) > 0 ) {
// wir sind im falschen Bereich, aber Richtung geht zum richtigen Bereich
Schranke[i].write( positionZu[i]+vSpeed );
}
}
}
}
}
DB_PRINT( " Adresse: %u, Speed %d, Max:%d", Addr, vSpeed, MaxSpeed );
lastSpeed = vSpeed;

}

}
 
// Funktionstelegramm ======================================================================
// F0: bestimmt den Zustand der Schranke (auf/zu)
// F1..F4 bestimmt, bei welchem Schrankenbaum die Endlage justiert wird. Mit dem Ausschalten der Funktion
// wird die Endlage übernommen und gespeichert.
void notifyDccFunc( uint16_t Addr, FN_GROUP FuncNum, uint8_t FuncState){
// Funktionstelegramm mit eigener Adresse erhalten
static byte FGrOffset[] = {0,1,5,9,13,21}; // Offset Funktionsgruppe -> Funktionsnummer
static uint8_t lastFuncNum, lastFuncState[6];
uint8_t tmp, i, Fnr, State;
//DB_PRINT( " Adresse: %u, F%d, Status %xnr", Addr, FuncNum, FuncState );
if ( lastFuncState[FuncNum] != FuncState ) {
// Funktionsnummer bestimmen
tmp = FuncState ^ lastFuncState[FuncNum];
// Sonderfall Funktionsnummer 0:
if ( FuncNum == FN_0_4 && ( tmp&FN_BIT_00 ) ) {
// Ist funktion 0 ( = Schranke auf/zu )
schrankeSchliessen = ( (FuncState & FN_BIT_00) != 0);
DB_PRINT( " Adresse: %u, F0, Status %x", Addr, schrankeSchliessen );
tmp = tmp & ~FN_BIT_00;
}
for ( i= 0; i<8 ; i++ ) {
if ( (1<<i) & tmp ) {
// geändertes Bit gefunden
Fnr = FGrOffset[FuncNum] + i;
State = ( (FuncState&(1<<i)) !=0 );
if( Fnr > 0 && Fnr <= SCHRANKENZAHL ){
// Funktionen F1 ... setzen den Justagemodus der Schranken
justageAktiv[Fnr-1] = State;
if ( State == 0 && justageAktiv ) {
// Funktion wird ausgeschaltet, Motorposition als Endlage übernehmen, wenn LS
// im richtigen Bereich
if ( bueZustand == OFFEN && digitalRead( refLsP[Fnr-1] ) != refLsZu[Fnr-1]) {
positionAuf[Fnr-1] = Schranke[Fnr-1].read();
DCC.setCV( CvPosAuf+Fnr-1 , abs( positionAuf[Fnr-1] ) );
} else if ( bueZustand == GESCHLOSSEN && digitalRead( refLsP[Fnr-1] ) == refLsZu[Fnr-1]) {
positionZu[Fnr-1] = Schranke[Fnr-1].read();
DCC.setCV( CvPosZu+Fnr-1 , abs( positionZu[Fnr-1] ) );
}
}
}
DB_PRINT( " Adresse: %u, F%d, Status %xnr", Addr, Fnr, State );
}
}
//DB_PRINT( " Adresse: %u, Funktion %u, Status %xnr", Addr, FuncNum, FuncState );
lastFuncState[FuncNum]=FuncState;
}
}
 
 


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

#108 von UweS , 24.10.2015 09:18

Hallo Franz-Peter,

tolle Arbeit, vielen Dank.

Habe momentan wenig Zeit um am Arduino weiterzulernen.
Aber sobald ich wieder mehr Zeit habe, freue ich mich schon auf weitere Tests.

Auf Grund der Änderungen in den MobaTools und Nmra-DCC Lip, stellst Du netter Weise diese geänderten Lip´s zum
Download zur Verfügung?

Noch was vergessen, ist die Einstellung auch mit dem Lenz LH100 möglich?


Uwe

Lenz Digital seit 1993, seit 2020 Roco z21 und steuern mit der Z21 App, Traincontroller Gold, Mikromodellbau, Car Motion


 
UweS
InterRegioExpress (IRE)
Beiträge: 340
Registriert am: 02.02.2012
Spurweite H0, 1
Stromart Digital


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

#109 von Mape71 ( gelöscht ) , 24.10.2015 10:49

Hallo Franz-Peter, der absolute Hammer! Vielen Dank! Ich werde mich die nächsten Tage mal dran machen und Hardware und Mechanik anfangen zu basteln. Zum Thema Hardware - könntest Du noch einen Übersichtsschaltplan skizzieren und zur Verfügung stellen?

Danke und viele Grüße

Marko


Mape71

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

#110 von digi_thomas2003 , 24.10.2015 18:39

Hallo Franz-Peter,

Respekt!
Faszinierende Sache! Sobald ich einpaar freie Stunden habe, mache ich mal die schon länger angekündigten Versuche mit meinen beiden China-Servos.
Da ich gerade im Zug sitze und Deinen Code für die Schrittmotoren nur überflogen habe: Ich gehe davon aus, dass eine Anpassung an zwei Servos dank Deiner ausführlichen Doku relativ einfach machbar ist?
Dank Deiner mobatools dürfte das ja umsetzbar sein.

Herzliche Grüße
Thomas


Thomas
------------------
Anlage H0: U-Form, im kreativen Bau
Fahren: Tams MC
Schalten: IB
Melden: HSI 88
Steuern: TrainController 9.0 Gold
Denken: Brain 4.1


 
digi_thomas2003
InterRegioExpress (IRE)
Beiträge: 305
Registriert am: 03.05.2005
Gleise sind vorhanden
Spurweite H0
Steuerung TrainController
Stromart AC, Digital


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

#111 von MicroBahner , 24.10.2015 23:26

Hallo Uwe, Markus und Thomas,

danke für Euer Interesse an meinem Bü . Falls das einer nachbaut, würde ich mich sehr freuen.

@Uwe:

Zitat von UweS
Auf Grund der Änderungen in den MobaTools und Nmra-DCC Lip, stellst Du netter Weise diese geänderten Lip´s zum
Download zur Verfügung?

Die aktuellen MobaTools (V0.6) findest Du im MobaTools-Thread. Eine neuere Version gibt es nicht. Was die modifizierte NmraDcc-Lib angeht gibt es noch etwas Probleme. Bodo hat die schon mal getestet, und bei ihm läuft es nicht . Wir wissen noch nicht warum. Ich habe mit meiner Multimaus nur eine sehr einfache 'reine' DCC Umgebung. Evtl. gibt es mit anderen Zentralen und Multiprotokollumgebungen noch Probleme. Da bin ich noch dran. Allerdings werde auch ich in den nächsten Wochen nicht dazu kommen. Vielleicht finden wir bis Anfang der Woche noch eine Lösung. Ein alternative Variante habe ich schon - müsste aber noch getestet werden. Dass sie bei mir läuft, sagt ja noch nichts....

Wer's versuchen will : (Die Zip-Datei enthält nur die geänderte cpp-Datei aus der Lib) [attachment=0]NmraDcc.zip[/attachment]

@Marko:

Zitat von Mape71
könntest Du noch einen Übersichtsschaltplan skizzieren und zur Verfügung stellen?

ja, einen Schaltplan sollte ich schon noch nachliefern ops: . Mal sehen ob ich das bis Anfang der Woche schaffe .

@Thomas:

Zitat von digi_thomas2003
Ich gehe davon aus, dass eine Anpassung an zwei Servos dank Deiner ausführlichen Doku relativ einfach machbar ist?

Im Prinzip müsstest Du 'nur' die Version mit den Servos ( V0.3 oben ) mit der letzten Schrittmotorversion kombinieren. Wenn's nur um die Ansteuerung Auf/Zu über DCC geht ist das sicher recht einfach. Wenn Du auch die Endlageneinstellung per DCC vornehmen willst, sind ein paar mehr Änderungen nötig. Sollte aber durch Vergleich der beiden Versionen auch machbar sein


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

#112 von Schachtelbahner , 25.10.2015 16:08

Hi Franz Peter.

Du darfst dich freuen. Dies Steuerung steht bei mir ganz oben auf der Liste. Wann ich dazu komme kann ich noch nicht sagen. Es müssen noch 4 Kreuze gekauft werden und der Antrieb muss ich dann ändern was eine Menge Arbeit ist. Ich werde mich früh genug bei dir melden.


Grüße von Kurt
dem Schachtelbahner
aus dem Nationalpark Nahe Hunsrück
bleibt Corona negativ

Nicht vom Leben träumen, sondern Träume erleben
47 Videos auf meinem Kanal
https://www.youtube.com/results?search_q...telbahner&sm=12


 
Schachtelbahner
CityNightLine (CNL)
Beiträge: 1.834
Registriert am: 06.04.2012
Spurweite H0
Steuerung Selektrix und DCC
Stromart DC, Digital


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

#113 von MicroBahner , 27.10.2015 10:54

Hallo,

Zitat von MicroBahner
@Marko:

Zitat von Mape71

könntest Du noch einen Übersichtsschaltplan skizzieren und zur Verfügung stellen?


ja, einen Schaltplan sollte ich schon noch nachliefern ops: . Mal sehen ob ich das bis Anfang der Woche schaffe .



So, hier ist der versprochene Schaltplan. Ich hoffe ich habe nichts vergessen . Ist auf die Schnelle entstanden - bitte also nicht 'blind' nachbauen

P.S. Ich seh' gerad - ich habe nur 2 Lichtschranken eingezeichnet. Bei 4 Stepmotoren braucht man natürlich 4 - aber das sollte hinzubekommen sein

Zitat von Schachtelbahner
Du darfst dich freuen. Dies Steuerung steht bei mir ganz oben auf der Liste. Wann ich dazu komme kann ich noch nicht sagen. Es müssen noch 4 Kreuze gekauft werden und der Antrieb muss ich dann ändern was eine Menge Arbeit ist. Ich werde mich früh genug bei dir melden.

Na dann schaun' wir mal, dass wird das gebacken bekommen . Du brauchst dich aber auch nicht beeilen - in den nächsten Wochen ist bei mir 'Arduino-Pause' - da komm' ich nicht zum programmieren.


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

#114 von Mape71 ( gelöscht ) , 27.10.2015 11:15

Hallo Franz-Peter,

vielen Dank, nachdem meine Maschinenfabrik weitestgehend fertig ist werde ich mich in den kommenden Wochen den Schranken widmen.
1000 Dank und Grüße

Marko


Mape71

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

#115 von Mape71 ( gelöscht ) , 31.10.2015 12:19

Hallo zusammen,

nachdem ich so langsam in die Schranken-Konstruktionswelten abtauche habe ich bei Ebay noch eine andere Variante Schrittmotoren entdeckt. Sind auch sehr günstig, noch einmal ein deutliches Stück kleiner und sind möglicherweise aufgrund dessen, dass sie eine lineare Bewegung ausführen (Reiter auf einer Spindel) vor allem für Antriebe von Schranken und Signalen bei kleineren Baugrößen - wie bei mir Spur N - recht gut geeignet. Allerdings sind die Motoren 2-phasige Schrittmotoren, die von ihrer Bauart soweit ich heraus bekommen habe, üblicherweise über eine Doppel H-Brücke anzusteuern sind. Hier dann meine Frage an alle "Wissenden" - ist die Doppel H-Brücke wirklich notwendig, wenn ich einen Micro-Schrittmotor betreiben möchte oder würden es dort dann nicht auch die Darlington Transistorverstärker (wie ja im ULN-2003 auch enthalten) tun? Hier noch einmal der Link von Ebay zu den Motoren:

http://www.ebay.de/itm/400997712376?_trk...K%3AMEBIDX%3AIT

Vielen Dank vorab und Grüße

Marko


Mape71

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

#116 von garti62 , 31.10.2015 13:47

Hallo Marco,

die Antwort auf deine Frage ist: Ja. Im Gegensatz zu dem in diesem Projekt verwendeten unipolaren Schrittmotor, bei dem die "Spulenenden" nur in der richtigen Reihenfolge an die Betriebsspannung durchgeschaltet werden müssen ist es bei einem bipolaren Schrittmotor nötig, die Spannung immer wieder umzupolen. Deshalb die Brückenschaltung. Für unsere Hobbyzwecke macht man das zweckmäßigerweise mit einem L297 und einem L298. Gibt es bei den üblichen Elektronikversendern auch als fertige Bausteine, dann wird es allerdings doch insgesamt etwas teurer. Wenn Du Dich mal an solch einem linear-Motor versuchen willst, mußt Du auch nicht den langen Weg aus Hongkong wählen. Du findest sie in jedem alten CD-Laufwerk, besser noch (weil nicht ganz so filigran) Diskettenlaufwerk.

Schöne Grüße

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

#117 von Mape71 ( gelöscht ) , 01.11.2015 11:18

Hallo Ulli,

vielen Dank für die Antwort, dan werde ich mir noch mal ein paar L297 besorgen. Motoren habe ich auch mal bestellt - da die aber aus Fernost kommen macht es auch nichts, wenn ich auf die Treiber so lange warten muss. Für meinen Bahnübergang passen auch die schon hier behandelten Motoren - nur bei den Signalen, die ich eigentlich über Servos steuern wollte, würden diese Motoren nicht passen. Da versuche ich es mal - und wenn es nicht geht dann greife ich halt doch auf Servos zurück. Ich werde berichten - wird aber aufgrund der Lieferzeiten wohl nichts vor Dezember werden.

Viele Grüße

Marko


Mape71

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

#118 von digi_thomas2003 , 01.11.2015 12:12

Guten Morgen an die BÜ-Bastler hier,

eine kurze Frage: Welche BÜ-Modelle verwendet Ihr für diese Umbauten?
Busch, Faller, Viessmann, oder...

Welche Modelle lassen sich relativ einfach mit einem (Servo-)Motor ausstatten?

Danke im Voraus!

Herzliche Grüße
Thomas


Thomas
------------------
Anlage H0: U-Form, im kreativen Bau
Fahren: Tams MC
Schalten: IB
Melden: HSI 88
Steuern: TrainController 9.0 Gold
Denken: Brain 4.1


 
digi_thomas2003
InterRegioExpress (IRE)
Beiträge: 305
Registriert am: 03.05.2005
Gleise sind vorhanden
Spurweite H0
Steuerung TrainController
Stromart AC, Digital


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

#119 von garti62 , 01.11.2015 13:00

Hallo Marko,

Du brauchst für die Ansteuerung eines bipolaren Schrittmotors beide Schaltkreise. Auch die Ansteuersoftware mußt Du entsprechend anders aufbauen. Am Besten, Du nutzt die Zeit bis zur Lieferung mit ein wenig Lektüre zu diesem Thema. Ich würde diese empfehlen, dort gibt es auch noch jede Menge weitere links.

Viel Erfolg wünscht
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

#120 von Mape71 ( gelöscht ) , 01.11.2015 18:51

Hallo Ulli,

vielen Dank, da werde ich mich mal umschauen.

Hallo Thomas,

bei Spur N ist die Auswahl recht beschränkt (tolles Wortspiel[emoji12]).
Ich baue mir daher die Schranken selbst. Die Lagerböcke, eine Grundplatte, das Schrankenbaumgewicht und die Anlenkung habe ich mir bei Viessmann für wenig Geld als Ersatzteil bestellt. Der Schrankenbaum ist aus Messingrohr und der Stelldraht, der genau Senkrecht nach unten geht, habe ich bei Völkner bestellt. Das alles dann noch bemalt kann sich durchaus sehen lassen und ist alles in Allem sehr einfach und technisch verlässlich aufgebaut. Geht bestimmt auch für andere Spurweiten.

Viele Grüße

Marko


Mape71

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

#121 von digi_thomas2003 , 01.11.2015 19:49

Hallo Marko,

danke für Deine Tipps.
Dabei ist mir aufgefallen, dass ich völlig vergessen habe, in welchem Massstab ich unterwegs bin: H0
Ich suche also Schranken in H0, die sich für die Motorisierung eignen.

Herzliche Grüße
Thomas


Thomas
------------------
Anlage H0: U-Form, im kreativen Bau
Fahren: Tams MC
Schalten: IB
Melden: HSI 88
Steuern: TrainController 9.0 Gold
Denken: Brain 4.1


 
digi_thomas2003
InterRegioExpress (IRE)
Beiträge: 305
Registriert am: 03.05.2005
Gleise sind vorhanden
Spurweite H0
Steuerung TrainController
Stromart AC, Digital


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

#122 von MicroBahner , 02.11.2015 13:21

Hallo Uli, Hallo Marko,
Der Link von Ulli ist sehr gut, da wird das Thema Schrittmotor sehr ausführlich beschrieben.
Allerdings darf man bei den dort empfohlenen Steuerbausteinen nicht vergessen, dass es dort um Roboteranwendungen geht. Dort spielt das Thema Drehmoment eine wesentlich grössere Rolle als bei uns. Der L298 ist aus meiner Sicht für unsere Anwendungen weit über dimensioniert. Auch beim L297 muss man bedenken, dass der mit den MobaTools zusammen nicht funktioniert. Er übernimmt bereits einenTeil der Funktionen de MobaTools. Er kann vor allem auch die Motorspulen Strom gesteuert betreiben, was wieder für ein höheres Drehmoment wichtig ist.
Ich finde, dass der L293 ( als reiner Treiberbaustein ) für unsere kleinen Motörchen vollkommen ausreicht. Er enthält 4 Halbbrücken, und damit müsste man auch einen bipolaren Motor mit den MobaTools ansteuern können. Ist aber eine rein theoretische Überlegung, da ich das mangels Equipment nicht ausprobieren kann


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

#123 von garti62 , 03.11.2015 08:35

Hallo Franz-Peter,

stimmt, da hast Du vollkommen recht. Ich habe mir mal den L293 angeschaut, der sollte eigentlich problemlos mit Deiner Software laufen, wenn man die beiden enable-pins an 5V legt. Evtl. muß die Tabelle für die Schrittsteuerung etwas angepasst werden. Diese enable-Eingänge sind eine recht interessante Sache. Wenn man mehrere Schrittmotore an nur einem Controller betreiben will, braucht man nur 4 + x Leitungen (und damit pins) für x Motore. Ich muß mal schauen, ob in meiner Bastelkiste auch bipolare Schrittmotore zu finden sind, dann besorge ich mir mal einen L293 und probier das mal aus.

Schöne Grüße

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

#124 von Mape71 ( gelöscht ) , 09.11.2015 21:48

Hallo zusammen,

so, der von mir erwähnte Motor


http://www.ebay.de/itm/400997712376?_tr ... EBIDX%3AIT

ist von einem deutschen Händler geliefert und der L293D ebenfalls angekommen. Ich habe das mal mit dem Beispiel-Sketch, der bei der Arduino Software dabei ist ausprobiert - läuft einwandfrei, und aufgrund des Reiters auf der Gewindespindel extrem langsam. Dies nur mal kurz vorab, weiter bin ich aus zeitlichen Gründen leider noch nicht gekommen. Aber ich denke das Bestellen eines solchen Motors und des L293 lohnt sich allemal, ich vermute, dass auch die Mechanik inklusive der Vorspannung des Getriebes per Feder deutlich einfacher zu realisieren ist. Auch die beschriebene Lichtschrankenüberwachung sollte einfach realisierbar sein auch ohne Segmentscheibe, da sich die Lichtschranke über den sich bewegenden Reiter auslösen lässt. Ein eventuellen Haken mag es noch geben - die Stellkraft ist deutlich geringer als bei dem größeren Schrittmotoren oder einem Servo - für einen Stelldraht für Signale oder Bahnschranken sollte es aber locker genügen.
Nun besteht meine Herausforderung darin den Beispiel Sketch zu verlassen und mich den MobaTools zu widmen - mal schauen wie weit ich damit komme. Wenn dann alles funktioniert wird ein Halter konstruiert und gedruckt - gibt's dann auch hier für alle

Viele Grüße

Marko


Mape71

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

#125 von Mape71 ( gelöscht ) , 20.11.2015 16:13

Hallo zusammen,

so, nun habe ich mal ein wenig versucht - aber zum Laufen bekomme ich es nicht. Ich habe die Schaltung so, wie sie Franz-Peter im Schaltplan dargestellt hat, aufgebaut. Alternativ dazu hatte ich auch eine Version mit der über den L293D angetriebenen Miniaturschrittmotor versucht (dann natürlich ohne das Verstärker-IC). Dass beide Motoren korrekt funktionieren (auch parallel) hatte ich mit dem Stepper-Motor Sketch ausprobiert.

Was mein Aufbau denn nun genau macht ist einfach zu beschreiben - gar nichts. Dass das Digitalsignal korrekt an den Arduino gebracht wird hatte ich mit dem 8Servo DCC Sketch ausprobiert (den verwende ich auch bereits auf der Anlage) - damit funktioniert der Arduino. Mit dem DCC Schrankensteuerungssketch hingegen komme ich nicht klar. Ich habe in meiner ECOS eine neue Lokomotive angelegt mit der Adresse 3.

start of Program
Dbg: Schr.0 - PosZu=20 PosAuf=-20
Dbg: Schr.1 - PosZu=20 PosAuf=-20
Dbg: CV1:3, CV29:ff, CV7=1, CV8=13
Dbg: CV17:195, CV18:232
Dbg: Init = AUF
Dbg: Endpositionen erreicht

Da gar nichts geht komme ich auch mit der Fehlersuche nicht so recht weiter - daher hier meine Bitte um Unterstützung, was ich ausprobieren oder wie ich beginnen kann den Fehler einzugrenzen.

Vielen Dank vorab und Grüße

Marko

PS: Anbei wie schon einmal angekündigt ein Bild von meinem Prototypen für die Steppermotorhalterung. Die Lichtschranke ist auch mit integriert


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