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

#276 von MicroBahner , 24.11.2020 22:32

Hallo Andi,
super, freut mich, dass es jetzt funktioniert - und sogar schon mit DCC


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

#277 von DJMetro , 02.03.2022 12:59

Moin,
kann mir nochmal jemand sagen welche Versionen man von den MobaTools und der NMRADCC benötigt für die DCC Servo Variante? Ich bekomme es irgendwie nicht mehr übersetzt.
Oder hat die inzwischen schon jemand geupdatet/überarbeitet?

Andi


DJMetro  
DJMetro
InterRegio (IR)
Beiträge: 137
Registriert am: 17.05.2008
Ort: DJMetro
Spurweite H0
Stromart Digital


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

#278 von MicroBahner , 26.04.2022 22:24

Hallo Andi,
das ist ja alles schon ein Weilchen her. Kannst Du mal genauer sagen, mit welchem Sketch Du es versuchst? Alte Lib-Versionen würde ich nicht verwenden, sondern den Sketch updaten. Kann eigentlich nicht viel sein, denn grundsätzliches hat sich nicht geändert.


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

#279 von 30-60 , 24.09.2022 19:24

Hallo!
Habe Probleme mit der Version Schrankensteuerung V0.5DCC Stepmotorversion 23.10.2015, er lässt sich nicht kompilieren und was bedeutet der Fehler #include <NmraDcc.h>
Kann mir jemand helfen? Danke im Voraus.

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#280 von volkerS , 24.09.2022 19:57

Hallo Thomas,
#include <NmraDcc.h> heißt, dass im Hauptprogramm V0.5DCC Stepmotorversion 23.10.2015 ein Unterprogramm (library), in diesem Fall NmraDcc.h, eingebunden wird. Folglich muss dieses vorhanden sein. Prüfe ob du in deiner Arduino Umgebung diese library hast. Wenn nein, du findest sie im Web.
Volker


30-60 hat sich bedankt!
volkerS  
volkerS
ICE-Sprinter
Beiträge: 6.008
Registriert am: 14.10.2014


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

#281 von MicroBahner , 24.09.2022 21:35

Zitat von volkerS im Beitrag #280
du findest sie im Web.

Man kann sie auch über den Bibliotheksmanager der IDE installieren. Der kennt die Lib. Einfach 'nmradcc' im Suchfeld eingeben.


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


30-60 hat sich bedankt!
 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog

zuletzt bearbeitet 24.09.2022 | Top

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

#282 von 30-60 , 25.09.2022 07:19

danke.
<was bedutet die zeile #include &lt;NmraDcc.h&gt;
Aber da steht exit status 1
#include expects "FILENAME" or <FILENAME>
die lib ist da er schreib fehler

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC

zuletzt bearbeitet 25.09.2022 | Top

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

#283 von MicroBahner , 25.09.2022 15:40

Hallo THomas,

Zitat von 30-60 im Beitrag #282
was bedutet die zeile #include <;NmraDcc.h>;

das ist offensichtlich ein Fehler, der wohl mit der Umstellung auf die neue Forumssoftware entstanden ist. Da werden die Sonderzeichen als HTML-Tags dargestellt. Damit kommt der Compiler natürlich nicht zurecht.
Hast Du einen Link auf den Post, wo Du den Sketch her hast?


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


30-60 hat sich bedankt!
 
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

#284 von 30-60 , 25.09.2022 17:19

Danke dir
der link RE: Arduino: Schrankensteuerung - DCC-Ansteuerung für Betrieb und Justage (5)
Schrankensteuerung V0.5DCC Stepmotorversion 23.10.2015.
Ps.Danke Franz-Peter.
Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#285 von MicroBahner , 25.09.2022 21:22

Es gibt eine Webseite, mit der man solche HTML-Tags wieder in UTF8 umwandeln kann.

Dann kommt sowas raus - und das ist dann wieder kompilierbar:

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
678
 

/* 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'


30-60, fbstr und fneurieser haben sich bedankt!
 
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

#286 von 30-60 , 26.09.2022 15:28

1000 Dank!
Aber er hat immer noch Fehler ('Schranke' was not declared in this scope)
Siehe Bild.

Gruß ThomasBild entfernt (keine Rechte)


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#287 von MicroBahner , 26.09.2022 16:49

Zitat von 30-60 im Beitrag #286
Aber er hat immer noch Fehler

Der Sketch ist allerdings auch schon etwas älter, und seitdem hat sich in den Libs einiges getan.
Ersetz mal

1
 
Stepper4 Schranke[SCHRANKENZAHL] = { steps360,steps360 };     // Für die Schrankenmotore
 


durch

1
 
MoToStepper Schranke[SCHRANKENZAHL] = { {steps360},{steps360} };     // Für die Schrankenmotore
 


Dann sollte er zumindest ohne Fehler kompilieren.


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


30-60 hat sich bedankt!
 
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

#288 von 30-60 , 26.09.2022 17:44

Geht leiter nicht.

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#289 von 30-60 , 26.09.2022 18:01

Eigendich wollte ich die version wegen der DCC steuerung.


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#290 von MicroBahner , 26.09.2022 21:31

Zitat von 30-60 im Beitrag #288
Geht leiter nicht.

Was geht denn nicht ? Gibt es noch Fehler beim Übersetzen?


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

#291 von 30-60 , 27.09.2022 11:16

jetzt hat er Übersetzt.
Habe noch eine frage:
wo steht die adresse für den decoder.

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC

zuletzt bearbeitet 27.09.2022 | Top

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

#292 von MicroBahner , 27.09.2022 17:51

Hallo Thomas,

Zitat von 30-60 im Beitrag #291
wo steht die adresse für den decoder.

Ganz am Anfang des Sketch, nach den includes:

1
2
3
4
 
#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
 



Der Decoder arbeitet als Multifunktionsdecoder ( also wie ein Lokdecoder ). Es könnte aber sein, dass man da für die NmraDcc Lib noch was anpassen muss. Da wurden mal inkompatible Änderungen gemacht, und ich weis nicht mehr genau, ob das vor oder nach der Erstellung dieses Sketches war.


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


30-60 und fneurieser haben sich bedankt!
 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog

zuletzt bearbeitet 27.09.2022 | Top

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

#293 von 30-60 , 02.10.2022 18:07

Hallo!
Ich danke dir Franz-Peter es ist jetzt alles ok.
Eine Frage noch: ist es möglich das beim start die LEDs ein wenig länger an sind.
PS: Schönen Feiertag

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC

zuletzt bearbeitet 04.10.2022 | Top

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

#294 von MicroBahner , 06.10.2022 19:24

Hallo Thomas,
meinst Du die Zeit, in der am Anfang beide Led's an sind, bevor das Wechselblinken startet?

Die Zeit wird in dem Code-Abschnitt ab Zeile 365 gesetzt:

1
2
3
4
5
6
7
8
 
        if ( wbAktiv ) {
// Beide Leds einschalten, Timer für gemeinsames Startleuchten
Wblinker[0].on();
Wblinker[1].on();
BlinkerT.setTime( wbSoft/2 );
wblZustand = WBL_START;
}
 
 



Wenn Du da z.B. dass '/2' bei 'wbSoft/2' weglässt, ist die Zeit doppelt so lange.


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


30-60 hat sich bedankt!
 
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

#295 von 30-60 , 07.10.2022 14:46

Hallo!
Geht nicht habe selber erfolg mit
#include <TimeLib.h>
BlinkerT.setTime( 2200 );

Danke.

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#296 von MicroBahner , 07.10.2022 15:44

Wozu bindest Du da die TimeLib.h ein? Oder hast Du noch mehr am Sketch verändert?

Natürlich kannst Du bei BlinkerT.setTime(xx) auch eine beliebige konstante Zahl einsetzen. Aber

1
 
BlinkerT.setTime( wbSoft );
 

statt

1
 
BlinkerT.setTime( wbSoft/2 );
 

muss die bisherige Einschaltzeit Zeit auch verdoppeln. Wenn dir das nicht reicht, dann eben eine konstante Zahl nach deinen Wünschen . Aber die TimeLib.h brauchst Du dazu nicht.


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


30-60 und fneurieser haben sich bedankt!
 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog

zuletzt bearbeitet 07.10.2022 | Top

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

#297 von 30-60 , 07.10.2022 15:52

Danke alles ok.


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#298 von 30-60 , 08.10.2022 11:36

Hallo!
Jetzt wolte ich mahl sehen wie das mit DCC einstalten ist aber die schaltung spricht nicht an. Schrankensteuerung mit Servo und DCC-Ansteuerung V0.5 28.11.2015.
beim drücken der IB pasiert nichts.

gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


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

#299 von 4fangnix , 08.10.2022 12:11

Hallo Thomas,

ich habe mittels DCC schalten können. Allerdings mit der Fichtelbahn-Zentrale.
Bei meiner IB ging das auch nicht. Dann habe ich gelesen, dass die IB (1) Zubehördecoder (und darum handelt es sich ja, galube ich) nur bis zu einer gewissen Adresshöhe anspricht.
Ich habe die Beschreibung der IB gerade nicht parrat, aber ich galube, das ging nur bis zur Adresse 240, oder so. Weiter getestet hatte ich es nicht, da es ja bei der anderen Zentrale ging.

Welche Adresse verwendest Du?

Gruß
Armin


Rocrail; 1x OpenDCC GBMboost, 1x BiDiB RF-Basis (OpenCar), 5x GBM16T, 2x LightControl, 2x OneControl, 5x Mobalist, DMX-RGB-Dimmer;
MobaLedLib (kann > 48.000 LED via WS2811 oder > 16.000 WS2812-RGB-LED steuern und/oder Servos, Sounds, Stepper, DMX und Displays);
Intellibox; Märklin C- und K-Gleis, Bahn im Aufbau.


30-60 hat sich bedankt!
4fangnix  
4fangnix
InterRegioExpress (IRE)
Beiträge: 270
Registriert am: 18.10.2015
Ort: Weiterstadt
Gleise K-Gleis, C-Gleis
Spurweite H0
Stromart Digital

zuletzt bearbeitet 08.10.2022 | Top

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

#300 von 30-60 , 08.10.2022 12:22

danke dir
Ich habe v1.55 habe Adrr.2 es läuft,muss Mann nach der neuen adrrese den Reset Knopf drücken.
Möchte gerne die Datei umschreiben für Schrittmotoren,ist das möglich.

Gruß Thomas


30-60  
30-60
S-Bahn (S)
Beiträge: 18
Registriert am: 21.12.2020
Spurweite H0
Stromart DC


   

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