RE: Arduino MobaTools: V2.3.1 released

#426 von MicroBahner , 25.09.2019 15:07

Hallo an alle MobaTools-Interessierte,
es gibt wieder ein kleines Update. Hauptsächlich Fehlerbeseitigungen:

  • Es gab Probleme, wenn die Steprate auf '0' gestellt wurde. Das ist nicht zulässig und wird nun abgefangen ( wird dann intern auf '1' gesetzt)
  • Wurde die Zielposition im Modus ohne Rampe in sehr schneller Folge ( schneller als die Steprate ) aktualisiert, kam es zu einem Fehler bei der Steperzeugung.
  • Es sind jetzt höhere Stepraten ( bis 2500 Steps/Sek) möglich. Der relative Jitter wird dann zwar rel groß ( ist absolut immer 200µs), es hat aber in Versuchen immer gut funktioniet. Damit kann jetzt auch besser mit Microsteps gearbeitet werden.


Die Version ist im Bibliotheksverwalter bereits aktiv.


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 MobaTools: V2.3.1 released

#427 von Railcar ( gelöscht ) , 25.09.2019 15:54

Hi Robert,

du solltest ein eigenes Thema aufmachen, da wirst du dann auch mehr antworten bekommmen - dies ist der thread über die MobaTools.

Ulrich


Railcar

RE: Arduino MobaTools: V2.3.1 released

#428 von nofear87 , 25.09.2019 19:32

Zitat

Hi Robert,

du solltest ein eigenes Thema aufmachen, da wirst du dann auch mehr antworten bekommmen - dies ist der thread über die MobaTools.

Ulrich



Da hast du natürlich recht. Entschuldige!


nofear87  
nofear87
S-Bahn (S)
Beiträge: 16
Registriert am: 03.09.2014


RE: Arduino MobaTools: V2.3.1 released

#429 von MicroBahner , 13.01.2020 21:07

Hallo,
es gibt ein neues Release der MobaTools:

  • Die MobaTools laufen nun auch auf dem ESP8266
  • Für Stepper kann ein 'enable' Pin definiert werden. Der Pin ist nur aktiv, solange der Motor läuft. Damit kann der Motor im Stillstand abgeschaltet oder in einen Stromsparmodus gebracht werden.
  • Die Klassennamen haben sich geändert und wurden vereinheitlicht. Die alten sind weiterhin gültig, sollten aber für neue Sketche nicht mehr verwendet werden.


Der Eingangspost wurde entsprechend aktualisiert.


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 MobaTools: V2.3.1 released

#430 von Holz1 , 19.01.2020 18:44

Guten Abend

Ich bin auf der Suche nach einem Arduino Sketch womit ich Märklin M Weichen schalten kann die von 2 Infrarot Lichtschranken getriggert werden.

Ich habe eine Module gebastelt mit OptoKopplern und Darlington NPN Transistor womit ich die Märklin M Weiche AC hin und herstellen kann. Es ist eine andere Module dann der von Steuer- und Schaltstromkreis trennen - Apollo 1 (Beitrag von M-Artin viewtopic.php?f=21&t=82041&p=873238&hilit=steuer+und+schaltstromkreis+trennen#p873238) jedoch das gleiche Prinzip OptoKoppler, Darlington Arduino ohne IR Lichtschranke)
Einen Sketch habe ich bereits aber die Weiche schalten nach durchqueren der einen Lichtschranke hin und beim durchqueren der zweiten Schranke zurück und dann stoppt es. Ich habe die Schaltung mit 2 Taster probiert und die Weichen schalten einwandfrei. Die vergangenen 7 Wochen habe ich schon vieles versucht, das Web von A BIZ Z gelesen, State change versuche probiert , aber es gelingt mir nicht. Auch habe ich die Suche deutscher Beiträgen wie Moba, verbesserten C Gleise, Mikrokontroller usw gelesen aber noch nichts Passendes gefunden.
Vielleicht kann einer von euch mir helfen
Schönen Gruß
Henry
Die Niederlande


Holz1  
Holz1
Beiträge: 6
Registriert am: 22.10.2017
Ort: die Niederlande
Spurweite H0
Stromart AC, DC, Digital


RE: Arduino MobaTools: V2.3.1 released

#431 von MicroBahner , 19.01.2020 21:12

Hallo Henry,
da müsstest Du mal zeigen, was Du bisher gemacht hast ( Schaltung und Sketch ).
Aber vielleicht ist es auch besser, das in einen eigenen Thread mit passendem Titel zu stellen. Hier wird das kaum einer finden.


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 MobaTools: V2.3.1 released

#432 von Holz1 , 29.01.2020 16:17

Herzlichen Dank.
Am Ende dieser Woche könnte ich die Data senden. Das neue Miethaus meiner Tochter macht mich momentan fertig. Muß alles sauber machen, Farben, tapezieren, usw usw.
Grüß
Henry


Holz1  
Holz1
Beiträge: 6
Registriert am: 22.10.2017
Ort: die Niederlande
Spurweite H0
Stromart AC, DC, Digital


RE: Arduino MobaTools: V2.3.1 released

#433 von MicroBahner , 06.02.2020 09:44

Hallo,
es gibt schon wieder eine neue Version der MobaTools

Wesentliche Erweitierung ist die Verwaltung und Entprellung von mechanischen Tastern und Schaltern:

Es gibt eine neue Funktionalität 'MoToButtons'. Damit können mehrere Taster/Schalter ( bis zu 32 / Instanz ) verwaltet werden. Die Klasse übernimmt das Entprellen und stellt den Status der Taster und Events ( Drücken, Loslassen, lange Drücken und kurz Drücken ) zur Verfügung. Dies ist speziell dazu gedacht, wenn viele Taster/Schalter verwaltet werden sollen ( Wie es z.B. bei unseren Stellpulten ja die Regel ist ).
Das Einlesen der HW ist deshalb über eine CallBack Funktion realisert. Damit sind Matrixanordnung und/oder das Einlesen über z.B. I2C Portextender möglich.

Des weiteren hat der MoToTimer eine neue Methode 'expired'. Diese liefert nur einmalig 'true' zurück, nachdem der Timer abgelaufen ist. Alle weiteren Aufrufe sind wieder 'false'. Damit können sehr einfach Aktionen ausgelöst werden, die nach dem Ablauf des Timers nur einmalig gestartet werden sollen.

Der Eingangspost ist entsprechend aktualisiert.


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 MobaTools: V2.3.1 released

#434 von MicroBahner , 08.02.2020 16:23

Leider eine kleine Versionsflut: Die V2.1.0 enthält einen dicken Bug bei den Servos ops:


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 MobaTools: V2.3.1 released

#435 von Woge , 08.02.2020 22:00

Hallo Franz Peter,
Ersteimal meinen vollen Respekt für den tollen Umfang des MoBa-Tools und ich kann nur sagen, mach weiter so. Auf meiner kleinen Anlage habe ich schon einige Objekte mit Nano’s, LED’s, Sevos und Motoren ausgerüstet und es macht mir immer wieder Freude wenn ich ein Projekt zu laufen gebracht habe. Sie sind zwar nicht sehr umfangreich, aber es macht mir Spaß. Bis jetzt habe ich das Schalten von Funktionen immer mit der Auswertung über Deinen erwähnten DCC-Zubehördecoder realisiert (ohne CV-Aktivitäten). Das Ansprechen der einzelnen Funktionen mit der Multi-Maus erschien mir aber mit steigenden Funktionen zu mühselig. Daher habe ich mich mit dem Multifunktionsdecoder beschäftigt und ein Problem ist aufgetreten, dass ich nicht verstehe und dadurch auch nicht beheben kann. Ich würde mich freuen, wenn durch etwas Mithilfe Licht ins Dunkle kommt.
Für die Beleuchtung von zwei Gebäuden habe ich mich für die Auswertung des DCC-Signals über je einen Multifunktionsdecoder entschieden. Hier kommen je ein Nano und die von Dir vorgestellte Dcc-Signalaufbereitung über Optokoppler zum Einsatz.
Die Auswertung und Ansteuerung der einzelnen Leuchtmittel erfolgen an einem Gebäude auf der Softwarebasis von Version 5.4 Geoff Bunza und an einem anderen Gebäude auf Deiner Softwarebasis aus diesem Forum.
Beide Programme habe ich auf meine Bedürfnisse angepasst und zum Laufen gebraucht. Ich kann nun alle gewünschten Funktionen, ob Licht oder Servo, nach meinen Vorstellungen ansprechen.
Auch der Betrieb meiner Roco.-, Trix.- und Lenzlokomotiven funktionieren ohne wechselseitige Probleme. Doch nun kommt der Schreck meiner ganzen Basteleien. Setze ich meine ESU-Lok auf die Schienen kann ich keine einzige Funktion in dem Gebäude ansprechen, wo ich Deine Softwarebasis eingesetzt habe. Im anderen Gebäude können alle Funktionen über Ihre Funktionstasten weiterhin problemlos angesteuert werden.
Ich habe so einiges schon ausprobiert, aber ich sitze in einer Sackgasse fest. Habe ich zu viel gestrichen, habe ich falsche Zusammenhänge gesetzt, oder, oder, oder? Ich weiß es nicht. Und soviel Wissen habe ich bei der Auswertung von DCC-Informationen auch nicht. Ich gehe jedenfalls bei meiner Fehlersuche davon aus, dass es an der ESU-Lok nicht liegen kann.
Ich würde mich freuen, wenn du etwas Zeit investieren könntest, um einmal auf meinen Code zu schauen, damit die Ursache für mein Mysterium eingekreist werden kann.

Hab schon im vorab herzlichen Dank.

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
 
[/* Steuerung des Lagers  Adresse 32 
MobaTools 1.1.0; NmraDcc 1.4.2
*/
//----------------------------------------------------------------------------------------
#include <MobaTools.h>
#include <Wire.h>
#include <NmraDcc.h>
#ifndef NMRA_DCC_ENABLE_14_SPEED_STEP_MODE
#define FN_0 255
#endif
//----------------------------------------------------------------------------------------
 
// ################ anzupassende Konstante: ##############################################################
const byte dccInputP = 2; // Inputport für DCC-Signal
const word myAddr = 32; // Adresse auf die der Decoder reagiert
 
#define FKTMAX 28 // höchste Funktionsnummer, die im Telegramm noch ausgewertet wird. Es werden
// im Telegramm mehr Funktionen ausgewertet, als aktiv verwendet werden. 'Auswerten'
// heisst hier lediglich, dass der Zustand der Funktion (EIN oder AUS) im Telegramm
// erkannt und im Array 'Funktionswert' hinterlegt wird. D.h. der Sketch kennt den Zustand
// aller Funktionen von 0...28, unabhängig davon, ob für diese Funktion auch ein Ausgang und
// eine entsprechende Bearbeitung definiert ist
// Das erleichtert eine spätere Erweiterung auf die Verwendung beliebig ausgewählter
// Funktionsnummern
 
const int TastePin = 11; // Pin Nummer des Tasters
int TasterStatus = LOW; // aktuelles Signal vom Eingangspin
int Tastergedruekt = 0; // abfragen ob Taster gedrückt war
int TasterModus = 0; // festlegen der verschiedenen Lichtprogramme
int LedStatus = LOW; // aktueller Zusatnd der LED
int EntprellZeit = 200; // Zeit für Entprellung, anpassen!
unsigned long TasterZeit = 0; // Zeit beim drücken des Tasters
unsigned long LedMillis = 0; // Zeit für den Blinkrythmus der LED
 
const int HallPin =A0; // Pin für Hall-Sensor
int MotorPin = 12; // Pin Nummer der LED des Arduinos
int Stabler = 0; // Stablerstatus 0 = aus 1 = an
int StablerRunde = 0; // Stablerrundenzähler
EggTimer HallZeit;
 
#define SevAnz 3
const int ServPin[SevAnz]={6,7,8}; //Tor links, Tor rechts, Sektionaltor
const int ServPosZu[SevAnz]={10,130,35}; //Tor zu
const int ServPosAuf[SevAnz]={130,30,120}; //Tor auf
const int ServSpeed[SevAnz]={15,15,15}; //Torgeschwindigkeit
const byte autoOff = 1;
Servo8 Serv[SevAnz];
 
EggTimer AussenNeon[6]; int AussenMe1 = 0; long AussenMe2 = 0; int AussenMe3 = 0;
EggTimer TorNeon[5]; int TorMe1 = 0; long TorMe2 = 0; int TorMe3 = 0; // Torbeleuchtung
EggTimer Zimmer[4]; // Bürobeleuchtung
EggTimer Halle[3]; int HalleMe1 = 0; int HalleMe2 = 0; // Hallenlicht
 
//-------- SPI-Pins -----------
int const LatchPin = 3; // Schalt Pin
int const DataPin = 4; // Daten Pin
int const ClockPin = 5; // Takt Pin
int const Register = 3; // Anzahl der Schieberegister
byte RegisterNeu[] = { 0, 0, 0}; // Ausgabe-Wert für Schieberegister
byte RegisterAlt[] = { 0, 0, 0}; // Zwischenspeicher Schieberegister
 
// Auslesen der Funktionstasten
boolean Funktionswert[FKTMAX+1]; // aktueller Wert der Funktion vom DCC-Tel. ( ein- oder ausgeschaltet )
NmraDcc Dcc;
 
//###########################################################################################################
 
void setup()
{
Serial.begin(9600);
randomSeed(analogRead(0));

Dcc.pin(digitalPinToInterrupt(dccInputP), dccInputP, 1); // Dcc-Signal mit Pullup
Dcc.init( MAN_ID_DIY, 01, 0, 0 ); // Multi-Funktionsdecoder, keine Adressauswertung
 
pinMode(MotorPin, OUTPUT); // LED Pin wird als Ausgang gesetzt
pinMode(TastePin, INPUT); // Taster Pin wird als Eingang gesetzt
 
pinMode (HallPin,INPUT); // Hallsensor
 
for(int i=0;i<SevAnz;i++) //Servos werden initalisiert
{
Serv[i].attach(ServPin[i], autoOff);
Serv[i].setSpeed(ServSpeed[i]);
Serv[i].write(ServPosZu[i]);
}

pinMode(ClockPin,OUTPUT); // Definieren der Schieberegister-Pins als Ausgänge
pinMode(LatchPin,OUTPUT);
pinMode(DataPin,OUTPUT);
digitalWrite(LatchPin,LOW);

for (int i=Register-1; i>=0; i--) // Initialisierung aller Schieberegister mit Null
{
shiftOut(DataPin, ClockPin,MSBFIRST,0);
}
digitalWrite(LatchPin,HIGH);

}
 
//############################################################################################################
void loop()
{
Dcc.process(); // Hier werden die empfangenen Telegramme analysiert
 
////////// Tastereingabe entprellt //////////
 
TasterStatus = digitalRead(TastePin); // Lesen des TastePin
if (TasterStatus == HIGH) // Wenn der Taster gedrückt ist...
{
TasterZeit = millis(); // aktualisiere TasterZeit
Tastergedruekt = 1; // speichert, dass Taster gedrückt wurde
}
if ((millis() - TasterZeit > EntprellZeit) && Tastergedruekt == 1) // Wenn die gewählte EntprellZeit vergangen ist und der Taster gedrückt war...
{
TasterModus++; // TasterModus wird um +1 erhöht
Tastergedruekt = 0; // setzt gedrückten Taster zurück
Stabler = 1;
}
 
////////// Motoransteuerung //////////
 
if ( HallZeit.running()== false )
{
// Zeit abgelaufen, Ausgang toggeln und Zeit neu aufziehen
if ( digitalRead(HallPin) ==LOW && Stabler == 1)
{
HallZeit.setTime( 300 );
StablerRunde++;
}
else {
//digitalWrite( blinkerP[i], HIGH );
//Blinkzeit[i].setTime( blinkOn[i] );
//StablerRunde++;
}
}

if(StablerRunde > 1 && Stabler == 1)
{
StablerRunde=0;
Stabler = 0;
TasterModus = 0;
}

digitalWrite(MotorPin,Stabler);
//if (Stabler == 1) RegisterNeu[0]|=(1<<6); else RegisterNeu[0]&= ~(1<<6); // Lagerbeleuchtung rechts
if (Stabler == 1 )
{
RegisterNeu[0]|=(1<<6);
}
else
{
if (Serv[2].read()== ServPosZu[2]-1 && HalleMe2 == 1)
{
RegisterNeu[0]&= ~(1<<6);
HalleMe2 = 0;
}
}
 
////////// Toransteuerung //////////
 
if (Stabler == 1)
{
Serv[0].write ( ServPosAuf[0]); // Tor recht öffnen
}
else
{

Serv[0].write ( ServPosZu[0]); // Tor recht schließen

}
 
if ( Serv[0].read() == ServPosAuf[0]-1)
{
Serv[1].write ( ServPosAuf[1]);
}
else
{
if ( Serv[1].read() == ServPosAuf[1]-1)
{
Serv[1].write ( ServPosZu[1]);
}
else
{

}
}
if ( Serv[0].read()== ServPosAuf[0]-1 && Serv[1].read()== ServPosAuf[1]-1)
{
Serv[2].write ( ServPosAuf[2]);
HalleMe2 = 1;
}
else
{
if ( Serv[0].read()== ServPosZu[0]-1 && Serv[1].read()== ServPosZu[1]-1)
{
Serv[2].write ( ServPosZu[2]);
}
}
 
/////////////////////////////////// Beleuchtung ///////////////////////////////////////////////////////////////////
 
// if (Funktionswert[14] == 1) RegisterNeu[0]|=(1<<6); else RegisterNeu[0]&= ~(1<<6); Beispiel ein/aus
 
/////////////////////////////////// Außenbeleuchtung //////////////////////////////////////////////////////////////

if (Funktionswert[1] == 1)
{
Stabler = 1;
}

if (Funktionswert[7] == 1) // Außenbeleuchtung
{
if( AussenMe1 < 30 )
{
for (int i=0;i<5; i++) // Startflakern
{
if (AussenNeon[i].running()== false)
{
if ( bitRead (RegisterNeu[0],i) == 1)
{
RegisterNeu[0]&= ~(1<<i); //LOW
AussenNeon[i].setTime(random( 300) );
}
else
{
RegisterNeu[0]|=(1<<i); //HIGH
AussenNeon[i].setTime(random( 100));
}
}
}
AussenMe1++;
Serial.println(AussenMe1);
}
else
{
for (int i=0;i<5;i++)
{
if ( bitRead (RegisterNeu[0],i) == 0) // alle Lampen an nach startflakern
{
RegisterNeu[0]|=(1<<i);
}
}

AussenMe2 = random(20);
AussenMe3 = 1;
Serial.println(AussenMe2);
}

 
}
else
{
RegisterNeu[0]&= ~(1<<0); // Lampen aus
RegisterNeu[0]&= ~(1<<1);
RegisterNeu[0]&= ~(1<<2);
RegisterNeu[0]&= ~(1<<3);
RegisterNeu[0]&= ~(1<<4);
AussenMe3 = 0;
AussenMe1 = 0;
//RegisterNeu[0]&= ~(1<<5);
}
 
/////////////////////////////////// Torbeleuchtung ////////////////////////////////////////////////////////////////
if (Funktionswert[8] == 1) // Torbeleuchtung
{
if (TorMe3 == 0)
{
 
if( TorMe1 < 80 )
{
for (int i=0;i<4; i++) // Startflakern
{
if (TorNeon[i].running()== false)
{
if ( bitRead (RegisterNeu[1],i) == 1)
{
RegisterNeu[1]&= ~(1<<i); //LOW
TorNeon[i].setTime(random( 10,130) );
}
else
{
RegisterNeu[1]|=(1<<i); //HIGH
TorNeon[i].setTime(random( 130,10 ));
}
}
}
TorMe1++;
Serial.println(TorMe1);
}
else
{
for (int i=0;i<4;i++)
{
if ( bitRead (RegisterNeu[1],i) == 0) // alle Lampen an nach startflakern
{
RegisterNeu[1]|=(1<<i);
}
}
RegisterNeu[0]|=(1<<5); // Beleuchtung Bürotür an
TorMe2 = random(6);
TorMe3 = 1;
Serial.println(TorMe2);
}
}
else
{
if(TorMe2 < 4) // defekte Neonröhre
{
if (TorNeon[4].running()== false)
{
if ( bitRead (RegisterNeu[1],TorMe2) == 1)
{
RegisterNeu[1]&= ~(1<<TorMe2); //LOW
TorNeon[4].setTime(random( 100,300) );
}
else
{
RegisterNeu[1]|=(1<<TorMe2); //HIGH
TorNeon[4].setTime(random( 130,4000 ));
}
}
}
}
}
else
{
RegisterNeu[1]&= ~(1<<0); // Lampen aus
RegisterNeu[1]&= ~(1<<1);
RegisterNeu[1]&= ~(1<<2);
RegisterNeu[1]&= ~(1<<3);
TorMe3 = 0;
TorMe1 = 0;
RegisterNeu[0]&= ~(1<<5);
}
/////////////////////////////////// Zimmerbeleuchtung /////////////////////////////////////////////////////////////
 
if (Funktionswert[9] == 1)
{
RegisterNeu[1]|=(1<<4); // Büro rechts

if ( Zimmer[1].running()== false ) // Büro links
{
if (bitRead( RegisterNeu[1],5 ) == 1 )
{
RegisterNeu[1]&= ~(1<<5);
Zimmer[1].setTime(random(6000,10000));
}
else
{
RegisterNeu[1]|=(1<<5);
Zimmer[1].setTime(random(20000,40000));
}
}
}
else
{
RegisterNeu[1]&= ~(1<<4);
RegisterNeu[1]&= ~(1<<5);
}

if (bitRead( RegisterNeu[1],5 ) == 1 ) // PC
{
if ( Zimmer[2].running()==false)
{
if (bitRead (RegisterNeu[1],7) == 1)
{
RegisterNeu[1]&= ~(1<<7);
}
else
{
RegisterNeu[1]|=(1<<7);
}
Zimmer[2].setTime(20);
}
}
else
{
RegisterNeu[1]&= ~(1<<7);
}

if (bitRead( RegisterNeu[1],4 ) == 1 )
{
if ( Zimmer[3].running()== false ) // WC
{
if (bitRead( RegisterNeu[1],6 ) == 1 )
{
RegisterNeu[1]&= ~(1<<6);
Zimmer[3].setTime(random(26000,100000) );
}
else
{
RegisterNeu[1]|=(1<<6);
Zimmer[3].setTime(random(6000,9000 ));
}
}
}
else
{
RegisterNeu[1]&= ~(1<<6);
}
/////////////////////////////////// Lagerbeleuchtung //////////////////////////////////////////////////////////////
 
if (Funktionswert[10] == 1)
{
if ( Halle[0].running() == false ) // Hallenlicht links
{
if (bitRead( RegisterNeu[0],7 ) == 1 )
{
RegisterNeu[0]&= ~(1<<7);
}
else
{
RegisterNeu[0]|=(1<<7);
}
Halle[0].setTime( 20000 );
}
}
else
{
RegisterNeu[0]&= ~(1<<7); // LOW aus
}
 
if (Halle[1].running()== false) // Schweißlicht Halle links
{
if (HalleMe1 == 1)
{
HalleMe1 = 0;
Halle[1].setTime(random(50,4000)); // Scheißlicht aus
}
else
{
HalleMe1 = 1;
Halle[1].setTime(random(6000)); // Schweißlicht an
}
}

if(HalleMe1 == 1 & bitRead( RegisterNeu[0],7 ) == 1 )
{
if ( Halle[2].running()== false )
{
if ( bitRead( RegisterNeu[2],1 ) == 1 )
{
RegisterNeu[2]&= ~(1<<1);
Halle[2].setTime(random(10,130) );
}
else
{
RegisterNeu[2]|=(1<<1);
Halle[2].setTime(random( 130,10));
}
}
}
else
{
if ( bitRead( RegisterNeu[2],1 ) == 1 )
{
RegisterNeu[2]&= ~(1<<1); // Rücksetzen bei Aus
}
}
 

/////////////////////////////////// Gesamtbeleuchtung /////////////////////////////////////////////////////////////
//if (Funktionswert[0] == 1) in Bearbeitung
 
/////////////////////////////////// ENDE - Beleuchtung ////////////////////////////////////////////////////////////
 
Serial.print (Funktionswert[7]);
Serial.print (" ");
Serial.print (TasterModus);
Serial.print (" ");
Serial.print (Stabler);
Serial.print (" ");
Serial.println (StablerRunde);
 
ShiftoutLEDs(); // Ausgabe auf SPI-Bus

 
} // Ende Loop ##############################################################################
 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Unterprogramme, die von der DCC Library aufgerufen werden:
// Die folgende Funktion wird von Dcc.process() aufgerufen, wenn ein Funktionstelegramm empfangen wurde
// Funktionstelegramm ======================================================================
 
#ifdef OLD_NMRADCC
void notifyDccFunc( uint16_t Addr, FN_GROUP FuncNum, uint8_t FuncState)
{
#else
void notifyDccFunc( uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncNum, uint8_t FuncState)
{
#endif
if ( (Addr&0x3fff) == myAddr )
{
// Funktionstelegramm mit eigener Adresse erhalten
// In einem Telegramm wird immer nur ein Teil der Funktionswerte übertragen. (Bitweise codiert
// in der übergebenen Variable 'FuncState)
// Die folgenden Tabellen enthalten - abhängig von der Funktionsgruppe (FuncNum)
// jeweils die kleinste und höchste in FuncState übergebene Funktionsnummer
static byte FGrStart[] = {0,1,5, 9,13,21}; // Offset Funktionsgruppe -> kleinste Funktionsnummer
static byte FGrEnde[] = {0,4,8,12,20,28}; // Offset Funktionsgruppe -> letzte Funktionsnummer
uint8_t fMsk, i, fIxStart, fIxMax;
if ( FuncNum == FN_0_4 || FuncNum == FN_0 )
{
// Sonderfall Funktion0 ausfiltern
Funktionswert[0] = FuncState&FN_BIT_00;
}
if ( FuncNum != FN_0 )
{
// in der Gruppe FN_0 wird NUR die Funktion 0 übertragen, d.h. wir sind mit
// der obigen Auswertung fertig. In allen anderen Gruppen werden
// auch weitere Funktionen, codiert ab Bit0 übertragen, die in der folgenden
// for-Schleife ausgewertet werden.
fIxStart = FGrStart[FuncNum];
fIxMax = FGrEnde[FuncNum];
fMsk= 0b00000001; // Maske zum herausfiltern der Funktionsbits in FuncState
for ( i=fIxStart; i<= fIxMax && i<=FKTMAX; i++ )
{
// Funktionsstatus in das Array Funktionswert eintragen
Funktionswert[i] = FuncState & fMsk;
fMsk = fMsk<<1; // Maske für nächste Bitposition
}
}
}
}
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Unterprogram für die Ausgabe über SPI-Bus
 
void ShiftoutLEDs()
{
boolean ledSwitched = false;
for (int i = 0; i < Register; i++) // Prüfen, ob Änderung im LED-Muster ...
{
if (RegisterNeu[i] != RegisterAlt[i])
{
ledSwitched = true;
}
}
if (ledSwitched ) // nur falls Änderung seit letztem Schreibvorgang ...
{
digitalWrite(LatchPin, LOW); // latchPin LOW, damit sich die LEDs während des Sendens der Daten nicht ändern
 
for (int i = Register-1; i >= 0; i--)
{
shiftOut(DataPin, ClockPin, MSBFIRST, RegisterNeu[i]); // Ausgabe der Bits für Schieberegister i
RegisterAlt[i] = RegisterNeu[i]; // Sichern des aktuellen Werts für Schieberegister i
}
digitalWrite(LatchPin, HIGH); // latchPin HIGH, damit LEDs aufleuchten
}
}]
 


viele Grüße von der Ostseeküste

Klaus


 
Woge
Regionalbahn (RB)
Beiträge: 41
Registriert am: 13.03.2016
Spurweite H0
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#436 von Domapi , 09.02.2020 08:23

Welcher Dekoder ist in der ESU-Lok verbaut? Auf welche Adresse ist der eingestellt?
Nutzt Du RailCom und ist es im Dekoder aktiviert?
Evtl. mal RC abschalten.


Viele Grüße
Martin

- Mein Trennungsbahnhof: viewtopic.php?f=64&t=152275
- Drehscheibensteuerung auf Arduinobasis "LocoTurn": https://wiki.mobaledlib.de/anleitungen/b...v10/150_inhalte


 
Domapi
CityNightLine (CNL)
Beiträge: 1.631
Registriert am: 22.09.2015
Ort: Nämberch
Gleise Ohne Pickel
Spurweite H0
Steuerung Mit Hirn und Verstand
Stromart DC, Digital


RE: Arduino MobaTools: V2.3.1 released

#437 von Woge , 09.02.2020 19:56

Hallo Martin,
Die Lok ist mit einem ESU Lok Sound V.4.0 M4 ausgestattet und auf die Adresse 94 eingestellt. Meine Zentrale ist eine Z21 und ich betreibe sie ohne Änderung der Werkseistellungen, also auspacken, anschließen, losfahren.


viele Grüße von der Ostseeküste

Klaus


 
Woge
Regionalbahn (RB)
Beiträge: 41
Registriert am: 13.03.2016
Spurweite H0
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#438 von MicroBahner , 10.02.2020 09:56

Hallo Klaus,

Zitat

Die Auswertung und Ansteuerung der einzelnen Leuchtmittel erfolgen an einem Gebäude auf der Softwarebasis von Version 5.4 Geoff Bunza und an einem anderen Gebäude auf Deiner Softwarebasis aus diesem Forum.

Welche 'Softwarebasis' meinst Du da. Einfach nur, dass Du die MobaTools einsetzt, und in der Variante von Geoff Bunza eben nicht?

Zitat

1
 
MobaTools 1.1.0; NmraDcc 1.4.2
 



Setzt du tatsächlich noch diese Versionen ein, oder hast Du schon auf die aktuellen Versionen umngestellt? Die MobaTools 1.1.0 sind auch gesperrt und sollten nicht verwendet werden ( siehe HInweis im Eingangspost ).

Leider habe ich keine ESU-Lok, und kann daher auch nicht testen oder feststellen, was da anders ist als bei den anderen Loks.

Grundsätzlich hat ein Funktionsdecoder den Nachteil, dass er das DCC-System wesentlich stärker belastet, als ein Zubehördecoder. Ein Funktionsdecoder ist ja für Loks und Wagen gedacht, die nicht unbedingt ständig mit der Zentrale verbunden sind. Deshalb werden diese Telegramme ständig auf dem Bus übertragen - unabhängig davon ob sich was ändert oder nicht. Bei fest angeschlossenen Decodern ist das eigentlich überflüssig. An Zubehördecoder wird deshalb nur ein Telgramm gesendet, wenn sich was ändert.
Das hat aber jetzt sicher nichts mit deinem Problen zu tun - ist nur so ein allgemeiner Hinweis.


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 MobaTools: V2.3.1 released

#439 von Woge , 13.02.2020 16:13

Hallo Franz Peter,

Danke für Deine Antwort. Auf meiner kleinen Anlage habe ich in der letzten Zeit (Jahre) alle meine Beleuchtungen mit einem Nano nachgerüstet. Die ersten Objekte wurden auf der Basis Deiner Zubehörvariante ausgeführt. Da ich die Lampen und Funktionen vorerst alle einzeln ansprechen möchte (ca. je 14 Stück), erschien mir das Schaltern über je eine Weichenadressen sehr zeitaufwendig und umständlich. Also habe ich mich mal an die Multifunktionsvariant herangewagt (Deine Anmerkung war mir bewust). Dabei stieß ich dann auf die schon angesprochene Software. Durch viel experimentieren und lesen ist es mir dann gelungen , diese auf meine Wünschen im ersten Objekt anzupassen. Das Ergebnis füge ich mal hier ein.

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
 
[[code]
// DCC Steuerung von Licht und Servos für das Objektes "Firma" mit einem NANO
// Für Objekt zugeschitten Version 1.0 Klaus Schwampe 2019
// Struktur des Programmes meiner Sichchtweise angepast
// Programm auf 3 Servos(F1,F2,F3); 13 LED (F0,F4-F15) Ein/Aus ; 1 LED (F16) Blinken eingestellt
// Grundlage:
// Production 17 Function DCC Decoder Version 5.4 Geoff Bunza 2014,2015,2016
// Software restructuring mods added from Alex Shepherd and Franz-Peter
// With sincere thanks
 
//#define DECODER_LOADED // "//" entfernen, damit alle CV´s auf jedes POWER UP zurück gesetzt wird
 
//#define DEBUG // "//" entfernen, um Information auf Serillen Monitor zu sehen
 
//Decoder_Addresse ==> 31
 
#include <NmraDcc.h>
#include <SoftwareServo.h>
 
SoftwareServo servo[17];
#define servo_start_delay 50
#define servo_init_delay 7
#define servo_slowdown 3 // Servo-Loop-Zählergrenze
int servo_slow_counter = 0; // Servoschleifenzähler zum Verlangsamen des Servotransfers
 
int tim_delay = 500;
int numfpins = 17;
byte fpins [] = {3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
const int FunctionPin0 = 3;
const int FunctionPin1 = 4;
const int FunctionPin2 = 5;
const int FunctionPin3 = 6;
const int FunctionPin4 = 7;
 
const int FunctionPin5 = 8;
const int FunctionPin6 = 9;
const int FunctionPin7 = 10;
const int FunctionPin8 = 11;
 
const int FunctionPin9 = 12;
const int FunctionPin10 = 13;
const int FunctionPin11 = 14; //A0
const int FunctionPin12 = 15; //A1
 
const int FunctionPin13 = 16; //A2
const int FunctionPin14 = 17; //A3 & LOAD ACK
const int FunctionPin15 = 18; //A4
const int FunctionPin16 = 19; //A5
NmraDcc Dcc ;
DCC_MSG Packet ;
uint8_t CV_DECODER_MASTER_RESET = 120;
int t; // temp
#define This_Decoder_Address 31
struct QUEUE
{
int inuse;
int current_position;
int increment;
int stop_value;
int start_value;
};
QUEUE *ftn_queue = new QUEUE[16];
 
struct CVPair
{
uint16_t CV;
uint8_t Value;
};
CVPair FactoryDefaultCVs [] =
{
{CV_MULTIFUNCTION_PRIMARY_ADDRESS, This_Decoder_Address},
{CV_ACCESSORY_DECODER_ADDRESS_MSB, 0},
{CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, 0},
{CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, 0},
{CV_DECODER_MASTER_RESET, 0},
{30, 0}, //F0 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{31, 1}, //F0 Rate Blink=Eate,PWM=Rate,Servo=Rate
{32, 1}, //F0 Start Position F0=0
{33, 4}, //F0 End Position F0=1
{34, 1}, //F0 Current Position (aktuelle Position)
{35, 2}, //F1 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{36, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{37, 28}, // Start Position Fx=0
{38, 140}, // End Position Fx=1
{39, 28}, // Current Position
{40, 2}, //F2 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{41, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{42, 10}, // Start Position Fx=0
{43, 160}, // End Position Fx=1
{44, 10}, // Current Position
{45, 0}, //F3 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{46, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{47, 1}, // Start Position Fx=0
{48, 4}, // End Position Fx=1
{49, 28}, // Current Position
{50, 0}, //F4 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{51, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{52, 1}, // Start Position Fx=0
{53, 4}, // End Position Fx=1
{54, 1}, // Current Position
{55, 0}, //F5 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{56, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{57, 1}, // Start Position Fx=0
{58, 4}, // End Position Fx=1
{59, 1}, // Current Position
{60, 0}, //F6 Config Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{61, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{62, 1}, // Start Position Fx=0
{63, 4}, // End Position Fx=1
{64, 1}, // Current Position
{65, 0}, //F7 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{66, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{67, 1}, // Start Position Fx=0
{68, 4}, // End Position Fx=1
{69, 1}, // Current Position
{70, 0}, //F8 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{71, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{72, 1}, // Start Position Fx=0
{73, 4}, // End Position Fx=1
{74, 1}, // Current Position
{75, 0}, //F9 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{76, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{77, 1}, // Start Position Fx=0
{78, 4}, // End Position Fx=1
{79, 1}, // Current Position
{80, 0}, //F10 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{81, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{82, 1}, // Start Position Fx=0
{83, 4}, // End Position Fx=1
{84, 1}, // Current Position
{85, 0}, //F11 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{86, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{87, 1}, // Start Position Fx=0
{88, 4}, // End Position Fx=1
{89, 1}, // Current Position
{90, 0}, //F12 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{91, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{92, 1}, // Start Position Fx=0
{93, 4}, // End Position Fx=1
{94, 1}, // Current Position
{95, 0}, //F13 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{96, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{97, 1}, // Start Position Fx=0
{98, 4}, // End Position Fx=1
{99, 2}, // Current Position
{100, 0}, //F14 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{101, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{102, 1}, // Start Position Fx=0
{103, 4}, // End Position Fx=1
{104, 1}, // Current Position
{105, 0}, //F15 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{106, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{107, 1}, // Start Position Fx=0
{108, 4}, // End Position Fx=1
{109, 1}, // Current Position
{110, 1}, //F16 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{111, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{112, 1}, // Start Position Fx=0
{113, 100}, // End Position Fx=1
{114, 1}, // Current Position
//für erweiteren Gebrauch in der Zukunft
{115, 0}, //F17 Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{116, 1}, // Rate Blink=Eate,PWM=Rate,Servo=Rate
{117, 28}, // Start Position Fx=0
{118, 50}, // End Position Fx=1
{119, 28}, // Current Position
};
 
uint8_t FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);
void notifyCVResetFactoryDefault()
{
// Make FactoryDefaultCVIndex non-zero and equal to num CV's to be reset
// to flag to the loop() function that a reset to Factory Defaults needs to be done
FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);
};
 
void setup() //******************************************************
{
#ifdef DEBUG // wird aufgerufen, wenn oben #define DEBUG freigegeben wird
Serial.begin(115200);
#endif

int i;
uint8_t cv_value;
// initialize the digital pins as outputs
for (int i=0; i < numfpins; i++)
{
pinMode(fpins[i], OUTPUT);
digitalWrite(fpins[i], 0);
}
for (int i=0; i < numfpins; i++)
{
digitalWrite(fpins[i], 1);
delay (tim_delay/10);
}
delay( tim_delay);
for (int i=0; i < numfpins; i++)
{
digitalWrite(fpins[i], 0);
delay (tim_delay/10);
}
delay( tim_delay);

// Setup which External Interrupt, the Pin it's associated with that we're using
// Festlegen, welcher Pin für den External Interrupt verwendet wird
Dcc.pin(0, 2, 0); // PIN 5 => D2 (Nano)

// Call the main DCC Init function to enable the DCC Receiver
// Aufruf der DCC-Init-Hauptfunktion, um den DCC-Empfänger zu aktivieren
Dcc.init( MAN_ID_DIY, 100, FLAGS_MY_ADDRESS_ONLY, 0 );
delay(800);

#if defined(DECODER_LOADED)
if ( Dcc.getCV(CV_DECODER_MASTER_RESET)== CV_DECODER_MASTER_RESET )
#endif
{
for (int j=0; j < FactoryDefaultCVIndex; j++ )
Dcc.setCV( FactoryDefaultCVs[j].CV, FactoryDefaultCVs[j].Value);
digitalWrite(fpins[14], 1);
delay (1000);
digitalWrite(fpins[14], 0);
}
for ( i=0; i < numfpins; i++)
{
cv_value = Dcc.getCV( 30+(i*5)) ;
 
#ifdef DEBUG
Serial.print(" cv_value: ");
Serial.println(cv_value, DEC) ;
#endif

switch ( cv_value )
{
case 0: // LED on/off
ftn_queue[i].inuse = 0;
break;
case 1: // LED Blink
{
ftn_queue[i].inuse = 0;
ftn_queue[i].current_position = 0;
ftn_queue[i].start_value = 0;
ftn_queue[i].increment = int (char (Dcc.getCV( 31+(i*5))));
digitalWrite(fpins[i], 0);
ftn_queue[i].stop_value = int(Dcc.getCV( 33+(i*5))) ;
}
break;
case 2: //servo
{
ftn_queue[i].current_position =int (Dcc.getCV( 34+(i*5)));
ftn_queue[i].stop_value = int (Dcc.getCV( 33+(i*5)));
ftn_queue[i].start_value = int (Dcc.getCV( 32+(i*5)));
ftn_queue[i].increment = -int (char (Dcc.getCV( 31+(i*5))));
// attaches servo on pin to the servo object
servo[i].attach(fpins[i]);
 
#ifdef DEBUG
Serial.print("InitServo ID= ");
Serial.println(i, DEC) ;
#endif

servo[i].write(ftn_queue[i].start_value);
for (t=0; t<servo_start_delay; t++)
{
SoftwareServo::refresh();delay(servo_init_delay);
}
ftn_queue[i].inuse = 0;
servo[i].detach();
}
break;
case 3: // Doppelbeleuchtung LED blinkt
{
ftn_queue[i].inuse = 0;
ftn_queue[i].current_position = 0;
ftn_queue[i].start_value = 0;
ftn_queue[i].increment = Dcc.getCV( 31+(i*5));
digitalWrite(fpins[i], 0);
digitalWrite(fpins[i+1], 0);
ftn_queue[i].stop_value = int(Dcc.getCV( 33+(i*5)));
}
break;
case 4: // Einfache gepulste Ausgabe basierend auf der gespeicherten Rate = 10 * Rate in Millisekunden
{
ftn_queue[i].inuse = 0;
ftn_queue[i].current_position = 0;
ftn_queue[i].increment = 10 * int (char (Dcc.getCV( 31+(i*5))));
digitalWrite(fpins[i], 0);
}
break;
case 5: // Fade On (einblenden)
{
ftn_queue[i].inuse = 0;
ftn_queue[i].start_value = 0;
ftn_queue[i].increment = int (char (Dcc.getCV( 31+(i*5))));
digitalWrite(fpins[i], 0);
ftn_queue[i].stop_value = int(Dcc.getCV( 33+(i*5))) *10.;
}
break;
case 6: // NEXT FEATURE to pin
break;
default:
break;
}
}
 
}
void loop() //**********************************************************************
{
// MUST call the NmraDcc.process() method frequently (MUSS die NmraDcc.process () -Methode häufig aufrufen)
// from the Arduino loop() function for correct library operation (von der Arduino-Funktion loop () für den korrekten Bibliotheksbetrieb)
Dcc.process();
SoftwareServo::refresh();
delay(4);
for (int i=0; i < numfpins; i++)
{
if (ftn_queue[i].inuse==1)
{
switch (Dcc.getCV( 30+(i*5)))
{
case 0:
break;
case 1:
ftn_queue[i].current_position = ftn_queue[i].current_position + ftn_queue[i].increment;
if (ftn_queue[i].current_position > ftn_queue[i].stop_value)
{
ftn_queue[i].start_value = ~ftn_queue[i].start_value;
digitalWrite(fpins[i], ftn_queue[i].start_value);
ftn_queue[i].current_position = 0;
ftn_queue[i].stop_value = int(Dcc.getCV( 33+(i*5)));
}
break;
case 2:
{
if (servo_slow_counter++ > servo_slowdown)
{
ftn_queue[i].current_position = ftn_queue[i].current_position + ftn_queue[i].increment;
if (ftn_queue[i].increment > 0)
{
if (ftn_queue[i].current_position > ftn_queue[i].stop_value)
{
ftn_queue[i].current_position = ftn_queue[i].stop_value;
ftn_queue[i].inuse = 0;
servo[i].detach();
}
}
if (ftn_queue[i].increment < 0)
{
if (ftn_queue[i].current_position < ftn_queue[i].start_value)
{
ftn_queue[i].current_position = ftn_queue[i].start_value;
ftn_queue[i].inuse = 0;
servo[i].detach();
}
}
servo[i].write(ftn_queue[i].current_position);
servo_slow_counter = 0;
}
}
break;
case 3:
ftn_queue[i].current_position = ftn_queue[i].current_position + ftn_queue[i].increment;
if (ftn_queue[i].current_position > ftn_queue[i].stop_value)
{
ftn_queue[i].start_value = ~ftn_queue[i].start_value;
digitalWrite(fpins[i], ftn_queue[i].start_value);
digitalWrite(fpins[i]+1, ~ftn_queue[i].start_value);
ftn_queue[i].current_position = 0;
ftn_queue[i].stop_value = int(Dcc.getCV( 33+(i*5)));
}
i++;
break;
case 4: // Simple Pulsed Output based on saved Rate =10*Rate in Milliseconds
{
ftn_queue[i].inuse = 0;
ftn_queue[i].current_position = 0;
ftn_queue[i].increment = 10 * int (char (Dcc.getCV( 31+(i*5))));
digitalWrite(fpins[i], 0);
}
break;
case 5: // Fade On
 
break;
case 6: // NEXT FEATURE to pin
break;
default:
break;
}
}
}
}
 
void notifyDccFunc( uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)
{
switch(FuncGrp)
{
case FN_0_4: //Function Group 1 F0 F4 F3 F2 F1
exec_function( 0, FunctionPin0, (FuncState & FN_BIT_00)>>4 );
exec_function( 1, FunctionPin1, (FuncState & FN_BIT_01));
exec_function( 2, FunctionPin2, (FuncState & FN_BIT_02)>>1);
exec_function( 3, FunctionPin3, (FuncState & FN_BIT_03)>>2 );
exec_function( 4, FunctionPin4, (FuncState & FN_BIT_04)>>3 );
break;

case FN_5_8: //Function Group 1 S FFFF == 1 F8 F7 F6 F5 & == 0 F12 F11 F10 F9 F8
exec_function( 5, FunctionPin5, (FuncState & FN_BIT_05));
exec_function( 6, FunctionPin6, (FuncState & FN_BIT_06)>>1 );
exec_function( 7, FunctionPin7, (FuncState & FN_BIT_07)>>2 );
exec_function( 8, FunctionPin8, (FuncState & FN_BIT_08)>>3 );
break;

case FN_9_12:
exec_function( 9, FunctionPin9, (FuncState & FN_BIT_09));
exec_function( 10, FunctionPin10, (FuncState & FN_BIT_10)>>1 );
exec_function( 11, FunctionPin11, (FuncState & FN_BIT_11)>>2 );
exec_function( 12, FunctionPin12, (FuncState & FN_BIT_12)>>3 );
break;
 
case FN_13_20: //Function Group 2 FuncState == F20-F13 Function Control
exec_function( 13, FunctionPin13, (FuncState & FN_BIT_13));
exec_function( 14, FunctionPin14, (FuncState & FN_BIT_14)>>1 );
exec_function( 15, FunctionPin15, (FuncState & FN_BIT_15)>>2 );
exec_function( 16, FunctionPin16, (FuncState & FN_BIT_16)>>3 );
break;

case FN_21_28:
break;
}
}
void exec_function (int function, int pin, int FuncState)
{

#ifdef DEBUG
Serial.print("F-Taste: ");
Serial.print(function, DEC) ;
Serial.print(" PIN: ");
Serial.print(pin, DEC) ;
Serial.print(" Zustand ");
Serial.println(FuncState, DEC) ;
#endif

switch ( Dcc.getCV( 30+(function*5)) ) // Config 0=On/Off,1=Blink,2=Servo,3=DBL LED Blink,4=Pulsed,5=fade
{
case 0: // On - Off LED
digitalWrite (pin, FuncState); // FuncState ON = 1 OFF = 0
ftn_queue[function].inuse = 0;
break;
case 1: // Blinking LED
if ((ftn_queue[function].inuse==0) && (FuncState==1))
{
ftn_queue[function].inuse = 1;
ftn_queue[function].start_value = 0;
digitalWrite(pin, 0);
ftn_queue[function].stop_value = int(Dcc.getCV( 33+(function*5)));
}
else
{
if ((ftn_queue[function].inuse==1) && (FuncState==0))
{
ftn_queue[function].inuse = 0;
digitalWrite(pin, 0);
}
}
break;
case 2: // Servo
if (ftn_queue[function].inuse == 0)
{
ftn_queue[function].inuse = 1;
servo[function].attach(pin);
}
if (FuncState==1) ftn_queue[function].increment = char ( Dcc.getCV( 31+(function*5)));
else ftn_queue[function].increment = - char(Dcc.getCV( 31+(function*5)));
if (FuncState==1) ftn_queue[function].stop_value = Dcc.getCV( 33+(function*5));
else ftn_queue[function].stop_value = Dcc.getCV( 32+(function*5));
break;
case 3: // Blinking LED PAIR
if ((ftn_queue[function].inuse==0) && (FuncState==1))
{
ftn_queue[function].inuse = 1;
ftn_queue[function].start_value = 0;
digitalWrite(fpins[function], 0);
digitalWrite(fpins[function+1], 1);
ftn_queue[function].stop_value = int(Dcc.getCV( 33+(function*5)));
}
else
{
if (FuncState==0)
{
ftn_queue[function].inuse = 0;
digitalWrite(fpins[function], 0);
digitalWrite(fpins[function+1], 0);
}
}
break;
case 4: // Pulse Output based on Rate*10 Milliseconds
if ((ftn_queue[function].inuse==0) && (FuncState==1)) //First Turn On Detected
{
digitalWrite(fpins[function], 1);
delay (10*ftn_queue[function].increment);
digitalWrite(fpins[function], 0);
ftn_queue[function].inuse = 1; //inuse set to 1 says we already pulsed
}
else
if (FuncState==0) ftn_queue[function].inuse = 0;
break;
case 5: // Fade On
#define fadedelay 24
if ((ftn_queue[function].inuse==0) && (FuncState==1))
{
ftn_queue[function].inuse = 1;
for (t=0; t<ftn_queue[function].stop_value; t+=ftn_queue[function].increment)
{
digitalWrite( fpins[function], 1);
delay(fadedelay*(t/(1.*ftn_queue[function].stop_value)));
digitalWrite( fpins[function], 0);
delay(fadedelay-(fadedelay*(t/(1.*ftn_queue[function].stop_value))));
}
digitalWrite( fpins[function], 1 );
}
else
{
if ((ftn_queue[function].inuse==1) && (FuncState==0))
{
ftn_queue[function].inuse = 0;
digitalWrite(fpins[function], 0);
}
}
break;
case 6: // Future Function
ftn_queue[function].inuse = 0;
break;
default:
ftn_queue[function].inuse = 0;
break;
}
}
[/code]]
 
Beim zweiten Objekt habe ich Deine vorgestellte Variante auf meine Wünsche umgestrickt. In der Bastelecke funktionierte alles super. Doch im Zusammenspiel auf der Anlage kam dann die beschriebene Überraschung.
 
Es kommt noch verflixter. Im nach hinein ist mir folgendes aufgefallen. Setze ich die ESU-Lok auf meine Anlage, werden an meinem Problemobjekt keine Funktionen ausgeführt . Doch etwa 2 Minuten später reagieren alle Funktionen wunderbar. ???
 
Ja, ich verwende zur Zeit immer noch die Variante 1.1.0. Bei der Fehlersuche zu meinem jetzigen Problem hatte ich schon mal kurzfristig Deine neuste Version benutzt, doch da wurde der zweit und dritte Servo nicht so angesteuert wie vorher. Also erst einmal alles schnell wieder zurück. Die Ursache muß ich dann später noch herausfinden
 


viele Grüße von der Ostseeküste

Klaus


 
Woge
Regionalbahn (RB)
Beiträge: 41
Registriert am: 13.03.2016
Spurweite H0
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#440 von md95129 , 13.02.2020 18:21

Klaus,
ich hatte ein aehnliches Problem. Es stellte sich heraus, dass die DCC Routinen recht empfindlich gegen Stoerungen (Spikes) auf den Leitungen sind. Ich konnte den Fehler nie genau einkreisen, da bei Belastung mit einem Oszilloskop alles funktionierte. Ich habe dann einfach die Eingangsschaltung des Oszilloskops "nachgebildet" (ca. 100pf Kondensator vom Ausgang des Optokopplers gegen Masse) und seitdem habe ich keine Probleme mehr . Vielleicht solltest Du mal ein Testprogramm schreiben, das nur die empfangenen DCC Telegramme anzeigt. Wenn diese nicht mehr durchkommen, wenn die Lok auf den Gleisen ist, liegt das Problem bei der Hardware.


Henner,
ex-Donkey Doktor der EDH Lumber
Schamlose Selbstbeweihräucherung: Eigenbauten eines alten Neulings.
US Waldbahnen/Echtdampf-Eigenbau


 
md95129
EuroCity (EC)
Beiträge: 1.078
Registriert am: 15.01.2017
Ort: Berlin
Gleise IIm Echtdampf,H0m
Steuerung DCC Eigenbau
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#441 von Domapi , 13.02.2020 18:49

Genau für diesen Zweck habe ich meinen DCC-Monitor entwickelt.
Der läuft übrigens auch auf einem Arduino:

viewtopic.php?f=5&t=176550#p2064506

Damit kann man wunderbar sehen, was so am Gleis von der Zentrale ankommt.


Viele Grüße
Martin

- Mein Trennungsbahnhof: viewtopic.php?f=64&t=152275
- Drehscheibensteuerung auf Arduinobasis "LocoTurn": https://wiki.mobaledlib.de/anleitungen/b...v10/150_inhalte


 
Domapi
CityNightLine (CNL)
Beiträge: 1.631
Registriert am: 22.09.2015
Ort: Nämberch
Gleise Ohne Pickel
Spurweite H0
Steuerung Mit Hirn und Verstand
Stromart DC, Digital


RE: Arduino MobaTools: V2.3.1 released

#442 von MicroBahner , 16.02.2020 22:10

Hallo Klaus,

Zitat

Ja, ich verwende zur Zeit immer noch die Variante 1.1.0. Bei der Fehlersuche zu meinem jetzigen Problem hatte ich schon mal kurzfristig Deine neuste Version benutzt, doch da wurde der zweit und dritte Servo nicht so angesteuert wie vorher. Also erst einmal alles schnell wieder zurück. Die Ursache muß ich dann später noch herausfinden

Die Ursache kann ich dir vermutlich sagen: Die Version 2.0.0 enthält leider einen Bug, der genau zu dem Verhalten führt ops: .
Mit der aktuellen 2.1.1 sollte das nicht mehr auftreten.

Dass es nach 2 Minuten wieder funktioniert ist schon selsam... . Und dann geht es auch, wenn Du die ESU Lok ansteuerst und mit ihr fährst?


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 MobaTools: V2.3.1 released

#443 von Woge , 17.02.2020 16:59

Hallo Franz-Peter
Ich werde auf alle Fälle demnächst mit MobaTools-Version 2.1.1 und NmraDcc 1.4.2 arbeiten. In der Zukunft wird eine Aktualisierung auf alle Fälle beachten.
Beim lesen der Dokumentation zur Version 2.1 war ich beeindruckt, was man nun alles mit deinem Moba-Tool noch ausrichten kann. Wenn wieder etwas Zeit bei mir übrig ist, werde ich mal die eine oder andere Funktion ausprobieren. Besonders die Stepperfunktionen sind da in meinen Fokus gerückt.
Ich kann nur sagen:

Mach bitte weiter so.
Und Ja, wenn eine gewisse Zeit nach dem Hochfahren des Nano`s vergangen ist, sind alle Funktionen ansprechbar. Bei der ESU-Lok werden alle Funktionen von Anfang super ausgeführt.


viele Grüße von der Ostseeküste

Klaus


 
Woge
Regionalbahn (RB)
Beiträge: 41
Registriert am: 13.03.2016
Spurweite H0
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#444 von Woge , 17.02.2020 17:17

Zitat


Ich habe dann einfach die Eingangsschaltung des Oszilloskops "nachgebildet"



Bei mir hat dieses nicht zum Erfolg geführt. Hab aber Dank für die Tip.


viele Grüße von der Ostseeküste

Klaus


 
Woge
Regionalbahn (RB)
Beiträge: 41
Registriert am: 13.03.2016
Spurweite H0
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#445 von Woge , 17.02.2020 17:29

Zitat

Genau für diesen Zweck habe ich meinen DCC-Monitor entwickelt.
Der läuft übrigens auch auf einem Arduino:




Für diese Möglichkeit fehlen mir zurzeit doch noch einige Grundkenntnisse im Umgang mit dem DCC-Signal.
Aber dein Moto „ Der Weg ist das Ziel !“ gefällt mir. Danke, ich bleibe dran.


viele Grüße von der Ostseeküste

Klaus


 
Woge
Regionalbahn (RB)
Beiträge: 41
Registriert am: 13.03.2016
Spurweite H0
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#446 von md95129 , 18.02.2020 22:01

Ich wuerde den Monitor von Martin auf die gleiche Hardware laden und sehen, ob die Telegramme durchkommen. Es kann durchaus sein, dass Du Spikes hast, die anders aussehen als bei mir.


Henner,
ex-Donkey Doktor der EDH Lumber
Schamlose Selbstbeweihräucherung: Eigenbauten eines alten Neulings.
US Waldbahnen/Echtdampf-Eigenbau


 
md95129
EuroCity (EC)
Beiträge: 1.078
Registriert am: 15.01.2017
Ort: Berlin
Gleise IIm Echtdampf,H0m
Steuerung DCC Eigenbau
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#447 von Lanz-Franz , 26.02.2020 11:14

Hallo zusammen.

Nur ganz kurz vorweg.
Ich habe mich mit Arduino noch wenig beschäftigt.
Programmieren ist auch nicht gerade meine Stärke.
Habe auch nur einige kleine Testaufbauten ausprobiert.
Die Programme nur kopiert und kleine Änderungen ausprobiert.

Ich hoffe ihr werdet dennoch Hilfestellung geben.

Aufgabe/Problem

Ein Bekannter möchte gerne Lokschuppentore mit einem Servo bewegen.

Ausprobiert habe ich bisher zwei Programme.

„Servo mit 2 Tasten schnell“

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
 
#include <Servo.h>
 

 
Servo W1; //Weiche 1
 

 
int T1 = 2; //Taste 1
 
int T2 = 3; //Taste 2
 

 
void setup() {
 
pinMode(T1, INPUT);
 
pinMode(T1, INPUT);
 
}
 

 
void loop() {
 
if(digitalRead(T1) == HIGH) { //Taste 1 gedrückt?
 
W1.attach(9); //Servo auf Pin 9 aktivieren
 
W1.write(0); //Servo auf 0° stellen
 
delay(500); //warten bis Servo fertig ist
 
W1.detach(); //Servo deaktivieren
 
}
 
if(digitalRead(T2) == HIGH) { //Taste 2 gedrückt?
 
W1.attach(9); //Servo auf Pin 9 aktivieren
 
W1.write(180); //Servo auf 180° stellen
 
delay(500); //warten bis Servo fertig ist
 

W1.detach(); //Servo deaktivieren
 

}
 
}
 




Das Servo dreht mit der „normalen“ Geschwindigkeit.
Startposition bei 0 Grad, Endposition bei 180 Grad.
Servo wird nach erreichen der Start und Endposition „abgeschaltet“. „W1.detach(); //Servo deaktivieren“
Man kann dann wieder eine Taste betätigen und das Servo dreht in die andere Richtung.
Für ein Lokschuppentor ist die Geschwindigkeit natürlich zu groß.

Das andere Programm stammt aus den MobaTools

SKETCH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
#include <MobaTools.h>
 
// Die Taster müssen so angeschlossen sein, dass der Eingang bei gedrücktem
// Taster auf LOW (=0) geht. Ansonsten muss im loop auf HIGH abgefragt werden
const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
const int servoPin = 9; // Anschluß für den Servo, möglich sind 9 oder 10
// bei Werten, die sich im Programm nie verändern, sollte immer 'const' vorangestellt
// werden
 

int tasterStatus1, tasterStatus2;
Servo2 meinServo;
 
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); //tasterPin1 (Pin 2)
pinMode(tasterPin2, INPUT_PULLUP); //tasterPin2 (Pin 3)
meinServo.attach(servoPin); //Servo an Pin 9
meinServo.setSpeed( 20 ); // Das ist ein neuer Aufruf, mit dem die Geschwindigkeit
// eingestellt wird. Je größer die Zahl, umso größer
// die Geschwindigkeit. Bei 0 (defaultwert) verhält es
//sich wie bei der Standard Bibliothek
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH) {
meinServo.write(0); //wird langsam drehen
delay(50);
//Servo deaktivieren
}
 
if (tasterStatus2 == HIGH) {
meinServo.write(180); //wird langsam drehen
delay(50);
//Servo deaktivieren
}
 
delay(20);
 
}
 




Dabei gibt es zwei Probleme.


1. Die Endposition 180 Grad wird nicht erreicht, nur etwa 150 Grad.
Wird wohl zum Öffnen der Tore ausreichen, wäre dennoch interressant zu wissen, warum 180 Grad nicht erreicht werden.

2. Das Servo bleibt in der Start und Endposition „eingeschaltet“, leichtes Summen.

Beim Einfügen von
„meinServo.detach(); //Servo deaktivieren“
kann das Programm zwar hochgeladen werden, aber dann tut sich nichts mehr.

SKETCH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
#include <MobaTools.h>
 
// Die Taster müssen so angeschlossen sein, dass der Eingang bei gedrücktem
// Taster auf LOW (=0) geht. Ansonsten muss im loop auf HIGH abgefragt werden
const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
const int servoPin = 9; // Anschluß für den Servo, möglich sind 9 oder 10
// bei Werten, die sich im Programm nie verändern, sollte immer 'const' vorangestellt
// werden
 

int tasterStatus1, tasterStatus2;
Servo2 meinServo;
 
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); //tasterPin1 (Pin 2)
pinMode(tasterPin2, INPUT_PULLUP); //tasterPin2 (Pin 3)
meinServo.attach(servoPin); //Servo an Pin 9
meinServo.setSpeed( 20 ); // Das ist ein neuer Aufruf, mit dem die Geschwindigkeit
// eingestellt wird. Je größer die Zahl, umso größer
// die Geschwindigkeit. Bei 0 (defaultwert) verhält es
//sich wie bei der Standard Bibliothek
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH) {
meinServo.write(0); //wird langsam drehen
delay(50);

meinServo.detach(); //Servo deaktivieren
}
 
if (tasterStatus2 == HIGH) {
meinServo.write(180); //wird langsam drehen
delay(50);

meinServo.detach(); //Servo deaktivieren
}
 
delay(20);
 
}
 



Ziel wäre Stellung 180 Grad ereichen und Servo nach dem erreichen der Endpositionen "abzuschalten"

Entschuldigt bitte wenn nicht alle Ausdrücke fachgerecht sind.
Bedanke mich für eure Hilfe.
MfG Werner


mfG Werner -und immer 50mA Reserve imTrafo
Schmalspur 1:87 : Die Birkenbahn https://www.stummiforum.de/viewtopic.php?f=50&t=133452
Gartenbahn : https://www.stummiforum.de/viewtopic.php?...578793#p1578793


 
Lanz-Franz
InterCityExpress (ICE)
Beiträge: 2.346
Registriert am: 19.01.2016
Ort: zwischen D-dorf und Köln
Gleise diverse
Spurweite H0m, G
Steuerung z21;Massoth_1210Z;RC
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#448 von Domapi , 26.02.2020 11:31

Du musst in der Loop vor jedem Servo-Write einen attach-Befehl setzen.
Aktuell wird nur detached und nie eingeschalten.

Dass die Endpositionen nicht erreicht werden, liegt wahrscheinlich an den Servos und mit welchen PWM-Signalen sie versorgt werden. Normalerweise reagieren Servos auf Impulse zwischen 1ms und 2ms. Je nach Modell aber auch schon bei 650 bis 2500 microsekunden. Evtl. muss das PWM-Signal anders gesetzt werden. Der attach-Befehl der normalen Arduino-Servobibliothek hat noch 2 zusätzliche Parameter min und Max. Damit kann man die Servoposition anpassen, z.B. http://www.netzmafia.de/skripten/hardwar...ervo/index.html


Viele Grüße
Martin

- Mein Trennungsbahnhof: viewtopic.php?f=64&t=152275
- Drehscheibensteuerung auf Arduinobasis "LocoTurn": https://wiki.mobaledlib.de/anleitungen/b...v10/150_inhalte


 
Domapi
CityNightLine (CNL)
Beiträge: 1.631
Registriert am: 22.09.2015
Ort: Nämberch
Gleise Ohne Pickel
Spurweite H0
Steuerung Mit Hirn und Verstand
Stromart DC, Digital


RE: Arduino MobaTools: V2.3.1 released

#449 von Lanz-Franz , 26.02.2020 12:38

Hallo Martin.
Danke für die schnelle Hilfe.
Ich werde die Sache mal Schrittweise angehen und die 180Gradposition hinten an stellen.

Deinen Rat habe ich umgesetzt.

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
 
#include <MobaTools.h>
 
// Die Taster müssen so angeschlossen sein, dass der Eingang bei gedrücktem
// Taster auf LOW (=0) geht. Ansonsten muss im loop auf HIGH abgefragt werden
const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
const int servoPin = 9; // Anschluß für den Servo, möglich sind 9 oder 10
// bei Werten, die sich im Programm nie verändern, sollte immer 'const' vorangestellt
// werden
 

int tasterStatus1, tasterStatus2;
Servo2 meinServo;
 
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); //tasterPin1 (Pin 2)
pinMode(tasterPin2, INPUT_PULLUP); //tasterPin2 (Pin 3)
meinServo.attach(servoPin); //Servo an Pin 9
meinServo.setSpeed( 10 ); // Das ist ein neuer Aufruf, mit dem die Geschwindigkeit
// eingestellt wird. Je größer die Zahl, umso größer
// die Geschwindigkeit. Bei 0 (defaultwert) verhält es
//sich wie bei der Standard Bibliothek
}
 
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
 
if (tasterStatus1 == HIGH) {
meinServo.attach(servoPin);

meinServo.write(0); //wird langsam drehen
delay(100);
meinServo.detach(); //Servo deaktivieren

}
 
if (tasterStatus2 == HIGH) {
 
meinServo.attach(servoPin);
 

meinServo.write(180); //wird langsam drehen
delay(100);
meinServo.detach(); //Servo deaktivieren

}
 
delay(20);
 
}
 



Dabei zeigt sich aber, das die Funktion
"meinServo.setSpeed( 10 ); "
keinen Einfluss mehr hat. Das Servo dreht dann wieder schnell.

Probiert habe bereis in der Schleife hinter den Attach-Befehlen noch mals "meinServo.setSpeed( 10 ); " einzufügen. Ändert aber auch nichts an der Geschwidigkeit.
Kannst du/ihr da weiterhelfen?

MfG Werner


mfG Werner -und immer 50mA Reserve imTrafo
Schmalspur 1:87 : Die Birkenbahn https://www.stummiforum.de/viewtopic.php?f=50&t=133452
Gartenbahn : https://www.stummiforum.de/viewtopic.php?...578793#p1578793


 
Lanz-Franz
InterCityExpress (ICE)
Beiträge: 2.346
Registriert am: 19.01.2016
Ort: zwischen D-dorf und Köln
Gleise diverse
Spurweite H0m, G
Steuerung z21;Massoth_1210Z;RC
Stromart Digital


RE: Arduino MobaTools: V2.3.1 released

#450 von Domapi , 26.02.2020 12:55

Wahrscheinlich musst Du nach jedem attach auch den Speed-Befehl verwenden.
Im setup() kannst Du attach und Speed weglassen.

Einfach mal ausprobieren.


Viele Grüße
Martin

- Mein Trennungsbahnhof: viewtopic.php?f=64&t=152275
- Drehscheibensteuerung auf Arduinobasis "LocoTurn": https://wiki.mobaledlib.de/anleitungen/b...v10/150_inhalte


 
Domapi
CityNightLine (CNL)
Beiträge: 1.631
Registriert am: 22.09.2015
Ort: Nämberch
Gleise Ohne Pickel
Spurweite H0
Steuerung Mit Hirn und Verstand
Stromart DC, Digital


   

Innenbeleuchtung für Fleischmann 742080 BR 642
Alte Märklin Transformator ersetzen

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