RE: Arduino Steuerung Sägewerk

#26 von stefan79 , 30.05.2021 20:36

Hallo Matthias

Das Sägewerk Programm läuft jetzt erste Sahne. Super Arbeit.
Dankeschön nochmal.

Das Soundmodul konnte ich noch nicht testen meine MP3-TF-16P Player laufen irgendwie damit nicht.

Wenn du zeit und Lust hast

Kirmes DCC
Stepper rechts links rum mit Pause
Lauflicht /Blitzer

Siedlung DCC
Alle Ausgänge was mach bar ist
zufällig ein und aus

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Matthias_h0 hat sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#27 von Matthias_h0 , 31.05.2021 14:46

Hallo Stefan,
du kannst dein Soundmodul einfach mal ohne Arduino testen, dann weißt du, ob es am Arduino bzw. der Verkabelung oder am Soundmodul selbst liegt. Dazu kannst du nur die Spannungsversorgung und den Lautsprecher an das Soundmodul anschließen. Dann kannst du einen Taster an IO_1 und GND anschließen. Die Pinbelegung findest du hier: Pinbelegung Soundmodul
Wenn du den Taster drückst, sollte dann bei jedem Tastendruck die nächste Sounddatei abgespielt werden. Wenn ja, dann ist ein Fehler in der Verkabelung zum Arduino oder es ist ein Fehler im Programm.
Wenn das nicht funktioniert, ist dein Soundmodul oder die SD Karte kaputt oder du hast keine Dateien auf der SD Karte.
Alternativ kannst du auch mal das Beispiel GetStarted.ino aus der DFRobotDFPlayerMini Bibliothek aufspielen und dann den seriellen Monitor der Arduino IDE öffnen. Dann werden dir eventuelle Fehler angezeigt und du kannst sehen, ob sich der Arduino korrekt mit dem Soundmodul verbindet.

Eventuell liegt der Fehler auch bei den DCC Kommandos. Du hattest geschrieben, dass du eine Z21 PG nutzt. Bei Roco Zentralen weichen die Adressen leider um 4 ab. Probiere an der Zentrale mal Adressen um +/- 4 aus. Genauer ist das im MobaLedLib Wiki beschrieben: Z21 Offset
Im Programm für dein Sägewerk hatte ich das mit der Konstante isRoco bereits berücksichtigt, im Programm für das Soundmodul ist das leider nicht mit drin.

Um die Programme für die Siedlung oder die Kirmes werde ich mich in den nächsten Tagen mal kümmern. Ein Programm für ein "belebtes Haus" habe ich sogar schon mal geschrieben, weil ich zunächst meine Häuserbeleuchtung auch mit Nanos machen wollte, bevor ich die MobaLedLib entdeckt habe. Ich muss mal schauen, ob ich das Programm noch finde. Dann muss nur noch DCC in das Programm eingebaut werden.
Ein Kirmeslauflicht sollte auch nicht so schwierig sein.

Viele Grüße
Matthias


MobaLedLib Wiki


Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#28 von Matthias_h0 , 31.05.2021 14:53

Hallo Stefan,
ich habe jetzt das Roco Offset mal in das Programm eingebaut. Du kannst ja mal testen, ob es jetzt geht.
Ansonsten bitte mal das oben beschriebene ausprobieren.

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
 

/*
Ansteuerung für ein Soundmodul mit Abrufen der Sounddatei über DCC
 
Folgende Bibliotheken müssen installiert sein: NmraDcc, SoftwareSerial, DFRobotDFPlayerMini
 
Das DCC Signal wird an Pin D2 eingelesen. Die DCC Adresse kann unten angepasst werden.
 
Die Verdrahtung wird hier gezeigt:
https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram
 
*/
 
//Folgende Einstellungen können angepasst werden
#define DCC_Adresse1 1 //DCC Adressen zum Abrufen der Sounddatei
#define DCC_Adresse2 2
#define DCC_Adresse3 3
#define DCC_Adresse4 4
#define DCC_Adresse5 5
#define DCC_Adresse6 6
#define DCC_Adresse7 7
#define DCC_Adresse8 8
#define DCC_Adresse9 9
#define DCC_Adresse10 10
 
#define Volume 10 //Lautstärke
 
#define isRoco 4
 
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet;
 
void setup() {
 
Dcc.pin(0, 2, 1); //DCC Signal ist an Pin 2 angeschlossen
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 ); //DCC initialisieren
mySoftwareSerial.begin(9600);
myDFPlayer.begin(mySoftwareSerial);
myDFPlayer.volume(Volume);
 
}
 
void loop() {
Dcc.process();
 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco;
if ( wAddr == DCC_Adresse1 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(1);
}
else {
myDFPlayer.play(2);
}
}
if ( wAddr == DCC_Adresse2 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(3);
}
else {
myDFPlayer.play(4);
}
}
if ( wAddr == DCC_Adresse3 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(5);
}
else {
myDFPlayer.play(6);
}
}
if ( wAddr == DCC_Adresse4 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(7);
}
else {
myDFPlayer.play(8);
}
}
if ( wAddr == DCC_Adresse5 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(9);
}
else {
myDFPlayer.play(10);
}
}
if ( wAddr == DCC_Adresse6 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(11);
}
else {
myDFPlayer.play(12);
}
}
if ( wAddr == DCC_Adresse7 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(13);
}
else {
myDFPlayer.play(14);
}
}
if ( wAddr == DCC_Adresse8 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(15);
}
else {
myDFPlayer.play(16);
}
}
if ( wAddr == DCC_Adresse9 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(17);
}
else {
myDFPlayer.play(18);
}
}
if ( wAddr == DCC_Adresse10 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(19);
}
else {
myDFPlayer.play(20);
}
}
}
 
 


MobaLedLib Wiki


stefan79 hat sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital

zuletzt bearbeitet 31.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#29 von stefan79 , 01.06.2021 09:35

Hallo Matthias

Ich hab jetzt alles versucht zu machen das Beispiel Programm läuft .
Habe auch noch andere Sachen getestet die nicht liefen.

Ich hab mir jetzt neue bestellt kommen morgen originale Dfplayer habe gelesen das die mp3-ft p16 Probleme haben mit der TX/RX Verbindung haben .

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Matthias_h0 hat sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#30 von Matthias_h0 , 01.06.2021 11:54

Hallo Stefan,
es ist schade, dass das nicht geht. Hoffentlich funktioniert es dann mit den von dir bestellten Modulen. Ich habe aber auch keine originale, ich habe nur billige Module von hier und von hier. Mit beiden Modulen funktioniert es bei mir problemlos.

Ich habe in der Zwischenzeit mal das Programm für deine Siedlung programmiert. Wenn alle Pins des Nanos verwendet werden, kommt man immerhin auf 17 Pins. Dabei werden D3-D13 und A0-A5 verwendet. A6 und A7 können leider nur als Eingänge verwendet werden, daher habe ich diese freigelassen.

Hier ist das Programm:

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
 

/*
belebtes Haus mit einem Arduino Nano
An einen Arduino Nano können bis zu 17 Leds angeschlossen werden. Gesteuert wird das Haus über DCC. Die Dcc Addresse kann unten eingestellt werden.
WICHTIG: Bei Roco Zentralen(z.B. Z21) die Konstante isRoco auf 4 setzen, sonst funktioniert es nicht.
*/
 
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
const byte Out[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1, A2, A3, A4, A5}; //Arduino Pins
 
#define MinTime 2 //Minimale Zeit bis zur nächsten Änderung (in Sekunden)
#define MaxTime 3 //Maximale Zeit bis zur nächsten Änderung (in Sekunden)
 
#define DccAdresse 1 //Dcc Addresse
const byte isRoco = 0; //Bei Roco Zentralen auf 4 setzen, sonst auf 0
 

 
#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet;
 
bool Inp = LOW;
unsigned long prevHaus = 0;
long RandTime = 0;
byte RandState = 0;
byte RandPin = 0;
void setup() {
 
for (int i = 0; i < 17; i++) {
pinMode(Out[i], OUTPUT);
}
 
randomSeed(millis());
RandTime = random(MinTime * 1000, MaxTime * 1000);
RandState = random(0, 2);
RandPin = random(0, 17);
 
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
}
 
void loop() {
Dcc.process();
unsigned long currentmillis = millis();
if (currentmillis - prevHaus > RandTime) {
prevHaus = currentmillis;
if (Inp == HIGH) {
if (RandState == 0) {
digitalWrite(Out[RandPin], LOW);
}
else {
digitalWrite(Out[RandPin], HIGH);
}
}
else {
digitalWrite(Out[RandPin], LOW);
}
RandTime = random(MinTime * 1000, MaxTime * 1000);
RandState = random(0, 2);
RandPin = random(0, 17);
}
 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco; //Offset für Roco wird eingerechnet, da Roco die Weichenadressen anders zählt
if ( wAddr == DccAdresse) {
if ( OutputAddr & 0x1 ) {
Inp = HIGH;
} else {
Inp = LOW;
}
}
}
 
 



Ich hoffe, dass es bei dir funktioniert und dass es so funktioniert, wie du es dir vorgestellt hast.

Viele Grüße
Matthias


MobaLedLib Wiki


stefan79 hat sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#31 von stefan79 , 02.06.2021 16:12

Hallo Matthias,

Das Programm für die Siedlung ist super DANKE bin jetzt grade dabei es in meine Stadt Reihe einzubauen.

Mit dem Soundmodul muss ich leider noch bis Freitag warten dann kommen erst die neuen Module hoffe es klappt.

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Matthias_h0 hat sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#32 von stefan79 , 05.06.2021 16:52

Hallo Matthias

Die neuen Module sind heute gekommen und was soll ich sagen die laufen 😀.

Dein Soundprogramm läuft auch ohne Probleme nur kann man daran was ändern wenn ich bei der Z21 Software ein Sound als Taster belege spielt das Modul den sound kurz an und danach komplett durch.
Als wen der ein kurzen doppel Impulse bekommt.

Ach so und er spielt auch nur 5 Datei ab und nach der 5 Datei immer das gleiche bis Adresse 10.

Als wen der ein kurzen doppel Impulse bekommt.
Danke für die super Arbeit
Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Matthias_h0 hat sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital

zuletzt bearbeitet 06.06.2021 | Top

RE: Arduino Steuerung Sägewerk

#33 von Matthias_h0 , 06.06.2021 18:27

Hallo Stefan,

Zitat von stefan79 im Beitrag #32
Dein Soundprogramm läuft auch ohne Probleme nur kann man daran was ändern wenn ich bei der Z21 Software ein Sound als Taster belege spielt das Modul den sound kurz an und danach komplett durch.
Als wen der ein kurzen doppel Impulse bekommt.

Ja, das ist seltsam. Ich muss mir mal ansehen, wie man das ändern kann. Theoretisch müsste es reichen, hinter dem myDFPlayer.play Befehl ein kurzes delay von z.B. 200 ms einzufügen. Ich kann das gerade aber leider nicht testen, vielleicht kannst du das mal ausprobieren. Ggf. muss auch das delay etwas erhöht werden. Sonst kann ich mir das in den nächsten Tagen mal ansehen, aber da morgen die Schule wieder beginnt muss ich mal sehen, wann ich dazu komme.

Zitat von stefan79 im Beitrag #32
Ach so und er spielt auch nur 5 Datei ab und nach der 5 Datei immer das gleiche bis Adresse 10.

Kann es sein, dass du nur 5 MP3 Dateien auf deiner SD Karte hast?

Viele Grüße,
Matthias


MobaLedLib Wiki


Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#34 von stefan79 , 06.06.2021 20:03

Hallo Matthias
Ja ich kann es mal versuchen was du da meinst mit dem delay.

Also ich habe 10 Sounds aud der Karte von 001-010
durchnummeriert.


Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#35 von Pussy123 , 07.06.2021 18:51

Hallo,
könnte mir jemand bitte den Sketch so umstricken, dass dieser nur für eine Gaslampe gilt.
Also kein Motor, keine 5 Neonlampen und keine vier Gaslampen, sondern nur eine Gaslampe, die wunderschön langsam angehen soll.
Das wäre echt super.
Danke und Grüße
Andreas


Pussy123  
Pussy123
S-Bahn (S)
Beiträge: 18
Registriert am: 31.03.2015


RE: Arduino Steuerung Sägewerk

#36 von Matthias_h0 , 07.06.2021 20:57

Hallo Stefan
Das werde ich mir morgen mal ansehen.

Hallo Andreas,
Das kann ich auch gerne morgen mal machen.

Viele Grüße,
Matthias


MobaLedLib Wiki


Pussy123 und stefan79 haben sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#37 von stefan79 , 07.06.2021 22:23

Hallo Matthias

Danke schön.

Kannst das Modul auch gerne mit mehreren Gaslampen machen . Könnte ich auch gebrauchen für mein Bonner Hauptbahnhof. :-)

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Matthias_h0 hat sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#38 von Matthias_h0 , 08.06.2021 14:16

Hallo Stefan, hallo Andreas,

zum Soundmodul:
Ich habe es so konfiguriert, dass du mit jeder DCC Adresse 2 Sounddateien abrufen kannst, also immer über Rot die eine und über Grün die zweite Sounddatei. So können mit 10 DCC Adressen 20 Dateien wiedergegeben werden. Wenn du also nur 10 Dateien auf dem Modul hast, funktionieren nur die ersten 5 DCC Adressen. Wenn du 20 Dateien auf das Modul lädst, lassen sich alle 10 Adressen verwenden.

Wichtig: Bei Roco Zentralen wie der Z21 muss in dieser Zeile:

1
 
const byte isRoco = 0;        //Offset für Weichenadressen
 

statt der 0 eine 4 eingetragen werden.

nun zu den Gaslampen:

Hier wäre ein Programm für eine Gaslampe:

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
 

//Programm für eine Gaslampe
 

#define Gaslampe1 3 //Pin für die Gaslampe
 

#define DccAdresse 1 //DCC Addresse
 

#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 0; //Offset für Weichenadressen
 

 
bool InputState = 1;
 
byte Gaslampe1State = 0;
unsigned long prevGaslampe1Millis = 0;
byte Gaslampe1Helligkeit = 0;
 

void setup() {
 

pinMode(Gaslampe1, OUTPUT);
randomSeed(millis());
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
 
}
 

 
void loop() {
Dcc.process();
unsigned long currentmillis = millis();
if (Gaslampe1State == 1) {
if (currentmillis - prevGaslampe1Millis > 50) {
analogWrite(Gaslampe1, 0);
Gaslampe1State = 2;
prevGaslampe1Millis = currentmillis;
}
}
if (Gaslampe1State == 2) {
if (currentmillis - prevGaslampe1Millis > 30) {
if(Gaslampe1Helligkeit<255){
Gaslampe1Helligkeit++;
analogWrite(Gaslampe1, Gaslampe1Helligkeit);
}
else{
Gaslampe1State = 0;
Gaslampe1Helligkeit = 0;
}
prevGaslampe1Millis = currentmillis;
}
}
 
if (InputState == HIGH) {
digitalWrite(Gaslampe1, LOW);
}
 

 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco; //Offset für Roco wird eingerechnet, da Roco die Weichenadressen anders zählt
if ( wAddr == DccAdresse) {
if ( OutputAddr & 0x1 ) {
InputState = LOW;
Gaslampe1State = 1;
analogWrite(Gaslampe1, 50);
} else {
InputState = HIGH;
}
}
}
 
 


Die eine Gaslampe wird dabei an Pin 3 angeschlossen.


Und hier ist ein Programm für 6 Gaslampen (mehr sind leider nicht möglich, da nicht genug PWM Ausgänge vorhanden sind):

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
 

 
//Programm für 6 Gaslampen
 
#define Gaslampe1 3 //Pin für die Gaslampe
#define Gaslampe2 5
#define Gaslampe3 6
#define Gaslampe4 9
#define Gaslampe5 10
#define Gaslampe6 11
 
#define DccAdresse 1 //DCC Addresse
 

#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 0; //Offset für Weichenadressen
 

 
bool InputState = 1;
 
byte Gaslampe1State = 0;
unsigned long prevGaslampe1Millis = 0;
byte Gaslampe1Helligkeit = 0;
byte Gaslampe2State = 0;
unsigned long prevGaslampe2Millis = 0;
byte Gaslampe2Helligkeit = 0;
byte Gaslampe3State = 0;
unsigned long prevGaslampe3Millis = 0;
byte Gaslampe3Helligkeit = 0;
byte Gaslampe4State = 0;
unsigned long prevGaslampe4Millis = 0;
byte Gaslampe4Helligkeit = 0;
byte Gaslampe5State = 0;
unsigned long prevGaslampe5Millis = 0;
byte Gaslampe5Helligkeit = 0;
byte Gaslampe6State = 0;
unsigned long prevGaslampe6Millis = 0;
byte Gaslampe6Helligkeit = 0;
 
void setup() {
 

pinMode(Gaslampe1, OUTPUT);
pinMode(Gaslampe2, OUTPUT);
pinMode(Gaslampe3, OUTPUT);
pinMode(Gaslampe4, OUTPUT);
pinMode(Gaslampe5, OUTPUT);
pinMode(Gaslampe6, OUTPUT);
randomSeed(millis());
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
 
}
 

 
void loop() {
Dcc.process();
unsigned long currentmillis = millis();
if (Gaslampe1State == 1) {
if (currentmillis - prevGaslampe1Millis > 50) {
analogWrite(Gaslampe1, 0);
Gaslampe1State = 2;
prevGaslampe1Millis = currentmillis;
}
}
if (Gaslampe1State == 2) {
if (currentmillis - prevGaslampe1Millis > 30) {
if(Gaslampe1Helligkeit<255){
Gaslampe1Helligkeit++;
analogWrite(Gaslampe1, Gaslampe1Helligkeit);
}
else{
Gaslampe1State = 0;
Gaslampe1Helligkeit = 0;
Gaslampe2State = 1;
Gaslampe2Helligkeit = 0;
}

prevGaslampe1Millis = currentmillis;
}
}
 
if (Gaslampe2State == 1) {
if (currentmillis - prevGaslampe2Millis > 50) {
analogWrite(Gaslampe2, 0);
Gaslampe2State = 2;
prevGaslampe2Millis = currentmillis;
}
}
if (Gaslampe2State == 2) {
if (currentmillis - prevGaslampe2Millis > 30) {
if(Gaslampe2Helligkeit<255){
Gaslampe2Helligkeit++;
analogWrite(Gaslampe2, Gaslampe2Helligkeit);
}
else{
Gaslampe2State = 0;
Gaslampe2Helligkeit = 0;
Gaslampe3State = 1;
Gaslampe3Helligkeit = 0;
}

prevGaslampe2Millis = currentmillis;
}
}
 
if (Gaslampe3State == 1) {
if (currentmillis - prevGaslampe3Millis > 50) {
analogWrite(Gaslampe3, 0);
Gaslampe3State = 2;
prevGaslampe3Millis = currentmillis;
}
}
if (Gaslampe3State == 2) {
if (currentmillis - prevGaslampe3Millis > 30) {
if(Gaslampe3Helligkeit<255){
Gaslampe3Helligkeit++;
analogWrite(Gaslampe3, Gaslampe3Helligkeit);
}
else{
Gaslampe3State = 0;
Gaslampe3Helligkeit = 0;
Gaslampe4State = 1;
Gaslampe4Helligkeit = 0;
}

prevGaslampe3Millis = currentmillis;
}
}
 
if (Gaslampe4State == 1) {
if (currentmillis - prevGaslampe4Millis > 50) {
analogWrite(Gaslampe4, 0);
Gaslampe4State = 2;
prevGaslampe4Millis = currentmillis;
}
}
if (Gaslampe4State == 2) {
if (currentmillis - prevGaslampe4Millis > 30) {
if(Gaslampe4Helligkeit<255){
Gaslampe4Helligkeit++;
analogWrite(Gaslampe4, Gaslampe4Helligkeit);
}
else{
Gaslampe4State = 0;
Gaslampe4Helligkeit = 0;
Gaslampe5State = 1;
Gaslampe5Helligkeit = 0;
}

prevGaslampe4Millis = currentmillis;
}
}
 
if (Gaslampe5State == 1) {
if (currentmillis - prevGaslampe5Millis > 50) {
analogWrite(Gaslampe5, 0);
Gaslampe5State = 2;
prevGaslampe5Millis = currentmillis;
}
}
if (Gaslampe5State == 2) {
if (currentmillis - prevGaslampe5Millis > 30) {
if(Gaslampe5Helligkeit<255){
Gaslampe5Helligkeit++;
analogWrite(Gaslampe5, Gaslampe5Helligkeit);
}
else{
Gaslampe5State = 0;
Gaslampe5Helligkeit = 0;
Gaslampe6State = 1;
Gaslampe6Helligkeit = 0;
}

prevGaslampe5Millis = currentmillis;
}
}
if (Gaslampe6State == 1) {
if (currentmillis - prevGaslampe6Millis > 50) {
analogWrite(Gaslampe6, 0);
Gaslampe6State = 2;
prevGaslampe6Millis = currentmillis;
}
}
if (Gaslampe6State == 2) {
if (currentmillis - prevGaslampe6Millis > 30) {
if(Gaslampe6Helligkeit<255){
Gaslampe6Helligkeit++;
analogWrite(Gaslampe6, Gaslampe6Helligkeit);
}
else{
Gaslampe6State = 0;
Gaslampe6Helligkeit = 0;

}

prevGaslampe6Millis = currentmillis;
}
}
 

 

if (InputState == HIGH) {
digitalWrite(Gaslampe1, LOW);
digitalWrite(Gaslampe2, LOW);
digitalWrite(Gaslampe3, LOW);
digitalWrite(Gaslampe4, LOW);
digitalWrite(Gaslampe5, LOW);
digitalWrite(Gaslampe6, LOW);
}
 

 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco; //Offset für Roco wird eingerechnet, da Roco die Weichenadressen anders zählt
if ( wAddr == DccAdresse) {
if ( OutputAddr & 0x1 ) {
InputState = LOW;
Gaslampe1State = 1;
analogWrite(Gaslampe1, 50);
} else {
InputState = HIGH;
}
}
}
 
 


Die Gaslaternen werden an Pin 3, 5, 6, 9, 10 und 11 angeschlossen.

Ich hoffe, es funktioniert alles so wie ihr euch das gedacht habt.

Viele Grüße,
Matthias


MobaLedLib Wiki


Pussy123 und stefan79 haben sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#39 von Pussy123 , 08.06.2021 18:25

Hallo Matthias,
vielen Dank für deine Bemühungen.
bei mir ging die Gaslampe nicht an.
Ich habe die LED mit dem UNO und den UNO mit dem PC verbunden.
DCC kenne/habe ich nicht. Deshalb habe ich versucht im Sketch alles mit DCC zu entfernen.
Die LED leuchtet trotzdem nicht. Das Kompilieren war aber erfolgreich.
Hier der Sketch:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 

//Programm für eine Gaslampe

 
#define Gaslampe1 3 //Pin für die Gaslampe

 
bool InputState = 1;

byte Gaslampe1State = 0;
unsigned long prevGaslampe1Millis = 0;
byte Gaslampe1Helligkeit = 0;

 
void setup() {

 
pinMode(Gaslampe1, OUTPUT);
randomSeed(millis());
}

 

void loop() {
unsigned long currentmillis = millis();
if (Gaslampe1State == 1) {
if (currentmillis - prevGaslampe1Millis > 50) {
analogWrite(Gaslampe1, 0);
Gaslampe1State = 2;
prevGaslampe1Millis = currentmillis;
}
}
if (Gaslampe1State == 2) {
if (currentmillis - prevGaslampe1Millis > 30) {
if(Gaslampe1Helligkeit<255){
Gaslampe1Helligkeit++;
analogWrite(Gaslampe1, Gaslampe1Helligkeit);
}
else{
Gaslampe1State = 0;
Gaslampe1Helligkeit = 0;
}
prevGaslampe1Millis = currentmillis;
}
}

if (InputState == HIGH) {
digitalWrite(Gaslampe1, LOW);
}
}
 
 


Pussy123  
Pussy123
S-Bahn (S)
Beiträge: 18
Registriert am: 31.03.2015


RE: Arduino Steuerung Sägewerk

#40 von Matthias_h0 , 08.06.2021 19:03

Hallo Andreas,
du hast zwei Zeilen zu viel entfernt, beziehungsweise hast du die Zeilen, die für das Einschalten verantwortlich sind, gelöscht.
Diese Zeilen sorgen für das Einschalten der Gaslampe:

1
2
 
InputState = LOW;
Gaslampe1State = 1;
 


Wenn du diese in den Setup Teil einfügst, geht die Gaslampe sofort beim Einschalten an.

So sieht das Programm dann aus:

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
 

//Programm für eine Gaslampe
 

#define Gaslampe1 3 //Pin für die Gaslampe
 

bool InputState = 1;
 
byte Gaslampe1State = 0;
unsigned long prevGaslampe1Millis = 0;
byte Gaslampe1Helligkeit = 0;
 

void setup() {
 

pinMode(Gaslampe1, OUTPUT);
randomSeed(millis());
InputState = LOW;
Gaslampe1State = 1;
}
 

 
void loop() {
unsigned long currentmillis = millis();
if (Gaslampe1State == 1) {
if (currentmillis - prevGaslampe1Millis > 50) {
analogWrite(Gaslampe1, 0);
Gaslampe1State = 2;
prevGaslampe1Millis = currentmillis;
}
}
if (Gaslampe1State == 2) {
if (currentmillis - prevGaslampe1Millis > 30) {
if (Gaslampe1Helligkeit < 255) {
Gaslampe1Helligkeit++;
analogWrite(Gaslampe1, Gaslampe1Helligkeit);
}
else {
Gaslampe1State = 0;
Gaslampe1Helligkeit = 0;
}
prevGaslampe1Millis = currentmillis;
}
}
 
if (InputState == HIGH) {
digitalWrite(Gaslampe1, LOW);
}
}
 
 



Dein Programm wurde also hochgeladen und hat auch funktioniert, doch es kam kein Befehl zum Einschalten und die Lampe blieb aus. Du musst also diese zwei Zeilen einfügen.

Man könnte die Gaslampen auch über einen Taster aktivieren. Dafür braucht man folgende Zeilen:
setup:

1
 
pinMode(2, INPUT_PULLUP);
 



loop:

1
2
3
4
5
6
7
8
9
10
11
12
 

if(digitalRead(2)==LOW){
if(InputState == HIGH){
InputState = LOW;
Gaslampe1State = 1;
}
else{
InputState = HIGH;
}
delay(500);
}
 
 



Beim ersten Druck auf den Taster geht die Gaslampe an und schaltet bei erneutem Drücken wieder ab. Der Taster wird einfach gegen GND geschaltet, es ist kein Widerstand nötig.

Ich hoffe, das hilft dir weiter.

Viele Grüße
Matthias


MobaLedLib Wiki


Pussy123 hat sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital

zuletzt bearbeitet 08.06.2021 | Top

RE: Arduino Steuerung Sägewerk

#41 von Pussy123 , 08.06.2021 21:58

Hallo Matthias,
tausend Dank. Funktioniert einwandfrei. Top.
Grüße
Andreas


Matthias_h0 hat sich bedankt!
Pussy123  
Pussy123
S-Bahn (S)
Beiträge: 18
Registriert am: 31.03.2015


RE: Arduino Steuerung Sägewerk

#42 von stefan79 , 09.06.2021 22:28

Hallo Matthias

Mit dem Soundprogramm ist jetzt alles gut wer lesen kann ist klar im Vorteil.

Aber ich hab jetzt mal ein Spezialproramm für dich wäre das machbar ?

1 x Stepper wie beim Sägewerk nur eine Richtung
2 x Servo

Der Stepper auf eine Adresse und die beiden Servos zusammen auf eine Adresse.

Wenn das nicht geht dann nur die Servos auf eine Adresse und der Steppen darf sich erst dann drehen.

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#43 von Matthias_h0 , 10.06.2021 17:06

Hallo Stefan,
das ist kein großes Problem. Hier ist das Programm:


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
 

#include <MobaTools.h>
MoToStepper Step1(4096, HALFSTEP);
MoToServo Servo1;
MoToServo Servo2;
 
//Anschlusspins
const byte stPn[] = { 7, 9, 8, 10 }; //Anschluss Pins für den Steppermotor
 
#define DccAdresse1 1 //DCC Adresse für den Steppermotor
#define DccAdresse2 2 /DCC Adresse für die Servos
 
#define Stepperspeed 80 //Geschwindigkeit des Steppermotors
 
#define Servo1Pin 3 //Pin für Servo 1
#define Servo1Speed 20 //Geschwindigkeit Servo 1
#define Servo1Pos1 0 //Position 1 für Servo 1
#define Servo1Pos2 180 //Position 2 für Servo 1
 
#define Servo2Pin 4
#define Servo2Speed 20
#define Servo2Pos1 0
#define Servo2Pos2 180
 

#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 4; //Offset für Weichenadressen
 

 

void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
Servo1.attach(Servo1Pin, true);
Servo2.attach(Servo2Pin, true);
Servo1.setSpeed(Servo1Speed);
Servo2.setSpeed(Servo2Speed);
}
 

 
void loop() {
Dcc.process();
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco; //Offset für Roco wird eingerechnet, da Roco die Weichenadressen anders zählt
if ( wAddr == DccAdresse1) {
if ( OutputAddr & 0x1 ) {
Step1.rotate(1);
} else {
Step1.stop();
}
}
if ( wAddr == DccAdresse2) {
if ( OutputAddr & 0x1 ) {
Servo1.write(Servo1Pos1);
Servo2.write(Servo2Pos1);
} else {
Servo1.write(Servo1Pos2);
Servo2.write(Servo2Pos2);
}
}
}
 




Ich hoffe, dass alles so funktioniert, wie du dir das gedacht hast. Im Programm sind oben einige Einstellungen (die #define Zeilen), dort kannst du die Pins, Geschwindigkeiten und Endpositionen für die Servos sowie die Einstellungen für den Steppermotor einstellen. Die DCC Adressen kannst du natürlich auch verändern.

Viele Grüße
Matthias


MobaLedLib Wiki


stefan79 hat sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#44 von stefan79 , 11.06.2021 14:29

Hallo Matthias,

Danke für das Programm läuft super .

Hier mal ein kleines Video für was ich das brauchte

Hauptbahnhof Bonn



Vom Sägewerk kommt auch noch ein Video .

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Pussy123, Matthias_h0, ThKaS, fbstr und Bodo haben sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital

zuletzt bearbeitet 11.06.2021 | Top

RE: Arduino Steuerung Sägewerk

#45 von stefan79 , 12.06.2021 16:01

Hallo Matthias

Könnte man in dem Programm Stepper und Servo noch mit einer anderen Adresse z.b. Leuchtstoffröhre simulation auf ein paar Ausgängen legen .

Oder einfache Ausgängen zum schalten .

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#46 von Matthias_h0 , 12.06.2021 18:36

Hallo Stefan,
das ist kein großes Problem, ich habe einfach die entsprechenden Teile aus dem Sägewerk Programm in das Programm kopiert.
Mit einer dritten Dcc Adresse können jetzt 6 Neonröhren (Pin A0-A5) eingeschaltet werden und mit einer vierten Dcc Adresse können 5 Lichtausgänge (Pins 5, 6, 11, 12, 13) ein und ausgeschaltet werden. Die Pins kannst du natürlich auch ändern.

Hier ist das neue Programm:

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
 

#include <MobaTools.h>
MoToStepper Step1(4096, HALFSTEP);
MoToServo Servo1;
MoToServo Servo2;
 
//Anschlusspins
const byte stPn[] = { 7, 9, 8, 10 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4, A5}; //Pins für die Neonleuchten
const byte Lichtausgaenge[] = {5, 6, 11, 12, 13};
 
#define DccAdresse1 1 //DCC Addresse für den Steppermotor
#define DccAdresse2 2 //DCC Adresse für die Servos
#define DccAdresse3 3 //DCC Adresse für Neonröhren
#define DccAdresse4 4 //DCC Adresse für Lichtausgänge
 
#define Stepperspeed 80 //Geschwindigkeit des Steppermotors
 
#define Servo1Pin 3 //Pin für Servo 1
#define Servo1Speed 20 //Geschwindigkeit Servo 1
#define Servo1Pos1 0 //Position 1 für Servo 1
#define Servo1Pos2 180 //Position 2 für Servo 1
 
#define Servo2Pin 4
#define Servo2Speed 20
#define Servo2Pos1 0
#define Servo2Pos2 180
 

#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 4; //Offset für Weichenadressen
 
unsigned long previousmillis = 0;
bool Neonleuchten_State = 0;
bool InputState = 1;
bool InputState2 = 1;
byte flackern = 0;
unsigned long prevflackermillis = 0;
unsigned long RandFlackerTime = 0;
 
void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
Servo1.attach(Servo1Pin, true);
Servo2.attach(Servo2Pin, true);
Servo1.setSpeed(Servo1Speed);
Servo2.setSpeed(Servo2Speed);
for (int i = 0; i < 6; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
for (int i = 0; i < 5; i++) {
pinMode(Lichtausgaenge[i], OUTPUT);
}
}
 

 

void loop() {
Dcc.process();
unsigned long currentmillis = millis();
if (InputState2 == LOW) {
for (int i = 0; i < 5; i++) {
digitalWrite(Lichtausgaenge[i], HIGH);
}
}
else {
for (int i = 0; i < 5; i++) {
digitalWrite(Lichtausgaenge[i], LOW);
}
}
if (InputState == LOW && Neonleuchten_State == LOW) {
if (currentmillis - prevflackermillis > RandFlackerTime) {
if (flackern < 100) {
flackern++;
RandFlackerTime = random(5, 10);
if (random(0, 3) < 2) {
digitalWrite(Neonleuchten_Pins[random(0, 6)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 6)], LOW);
}
}
else {
Neonleuchten_State = HIGH;
for (int i = 0; i < 6; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
flackern = 0;
}
prevflackermillis = currentmillis;
}
}
if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 6; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}
}
 

 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco; //Offset für Roco wird eingerechnet, da Roco die Weichenadressen anders zählt
if ( wAddr == DccAdresse1) {
if ( OutputAddr & 0x1 ) {
Step1.rotate(1);
} else {
Step1.stop();
}
}
if ( wAddr == DccAdresse2) {
if ( OutputAddr & 0x1 ) {
Servo1.write(Servo1Pos1);
Servo2.write(Servo2Pos1);
} else {
Servo1.write(Servo1Pos2);
Servo2.write(Servo2Pos2);
}
}
if ( wAddr == DccAdresse3) {
if ( OutputAddr & 0x1 ) {
InputState = LOW;
} else {
InputState = HIGH;
}
}
if ( wAddr == DccAdresse4) {
if ( OutputAddr & 0x1 ) {
InputState2 = LOW;
} else {
InputState2 = HIGH;
}
}
}
 



Wenn Neonröhren und Lichtausgänge mit einer Adresse geschaltet werden sollen, kannst du bei DccAdresse3 und DccAdresse4 einfach das Gleiche eintragen.

Viele Grüße
Matthias


MobaLedLib Wiki


stefan79 hat sich bedankt!
Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital

zuletzt bearbeitet 12.06.2021 | Top

RE: Arduino Steuerung Sägewerk

#47 von stefan79 , 15.06.2021 08:04

Hallo Matthias

Programm läuft super .

Dankeschön.

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


Matthias_h0 hat sich bedankt!
stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


RE: Arduino Steuerung Sägewerk

#48 von stefan79 , 20.06.2021 17:53

Hallo Matthias,

Kannst du mir noch ein drittes Servo was auf eine zusätzliche Adresse läuft rein setzten im letzten Programm?

Kann ruhig einer von den Lampen pins dran glauben am besten von den normalen ein/aus Varianten .

Hab was neues gebastelt dafür brauch ich noch ein Servo.

Ich bekomme es einfach nicht hin .

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital

zuletzt bearbeitet 20.06.2021 | Top

RE: Arduino Steuerung Sägewerk

#49 von Matthias_h0 , 21.06.2021 15:28

Hallo Stefan,
das ist kein Problem. Ich habe jetzt Pin 5 von den Lichtausgängen rausgenommen. An diesen Pin kann dann das Servo angeschlossen werden.

Ich versuche mal zu erklären, was ich gemacht habe. Vielleicht hilft dir das weiter.

Zunächst muss im Programm ein neues Servo angelegt werden. Das macht man mit

1
 
MoToServo Servo3;
 



Danach brauchen wir noch eine zusätzliche DCC Adresse:

1
 
#define DccAdresse5 5         //DCC Adresse für zusätzliches Servo
 



Dann brauchen wir für dieses Servo 4 Variablen, die per #define eingestellt werden. Es geht auch ohne die #define Zeilen, aber so kann man alle Parameter übersichtlich oben im Sketch einstellen.

1
2
3
4
 
#define Servo3Pin 5
#define Servo3Speed 20
#define Servo3Pos1 0
#define Servo3Pos2 180
 



Im Setup Teil müssen wir die Pins und die Geschwindigkeit des Servos angeben. Das macht man über

1
2
3
 
Servo3.attach(Servo3Pin, true);
Servo3.setSpeed(Servo3Speed);
 
 



Im Loop Teil muss nichts eingefügt werden.

In der Funktion void notifyDccAccState werden die DCC Kommandos verarbeitet. Diese Funktion wird von der NmraDcc Lib regelmäßig aufgerufen. Dort fügt man dann folgende Zeilen ein:

1
2
3
4
5
6
7
 
    if (  wAddr == DccAdresse5) {
if ( OutputAddr & 0x1 ) {
Servo3.write(Servo3Pos1);
} else {
Servo3.write(Servo3Pos2);
}
}
 



Das war es schon, mehr muss nicht geändert werden. Eigentlich können die vorhandenen Programmteile einfach kopiert werden.

Hier ist das vollständige Programm:

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
 

#include <MobaTools.h>
MoToStepper Step1(4096, HALFSTEP);
MoToServo Servo1;
MoToServo Servo2;
MoToServo Servo3;
 
//Anschlusspins
const byte stPn[] = { 7, 9, 8, 10 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4, A5}; //Pins für die Neonleuchten
const byte Lichtausgaenge[] = {6, 11, 12, 13};
 
#define DccAdresse1 1 //DCC Addresse für den Steppermotor
#define DccAdresse2 2 //DCC Adresse für die Servos
#define DccAdresse3 3 //DCC Adresse für Neonröhren
#define DccAdresse4 4 //DCC Adresse für Lichtausgänge
#define DccAdresse5 5 //DCC Adresse für zusätzliches Servo
 
#define Stepperspeed 80 //Geschwindigkeit des Steppermotors
 
#define Servo1Pin 3 //Pin für Servo 1
#define Servo1Speed 20 //Geschwindigkeit Servo 1
#define Servo1Pos1 0 //Position 1 für Servo 1
#define Servo1Pos2 180 //Position 2 für Servo 1
 
#define Servo2Pin 4
#define Servo2Speed 20
#define Servo2Pos1 0
#define Servo2Pos2 180
 
#define Servo3Pin 5
#define Servo3Speed 20
#define Servo3Pos1 0
#define Servo3Pos2 180
 

#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 4; //Offset für Weichenadressen
 
unsigned long previousmillis = 0;
bool Neonleuchten_State = 0;
bool InputState = 1;
bool InputState2 = 1;
byte flackern = 0;
unsigned long prevflackermillis = 0;
unsigned long RandFlackerTime = 0;
 
void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
Servo1.attach(Servo1Pin, true);
Servo2.attach(Servo2Pin, true);
Servo3.attach(Servo3Pin, true);
Servo1.setSpeed(Servo1Speed);
Servo2.setSpeed(Servo2Speed);
Servo3.setSpeed(Servo3Speed);
for (int i = 0; i < 6; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
for (int i = 0; i < 5; i++) {
pinMode(Lichtausgaenge[i], OUTPUT);
}
}
 

 

void loop() {
Dcc.process();
unsigned long currentmillis = millis();
if (InputState2 == LOW) {
for (int i = 0; i < 5; i++) {
digitalWrite(Lichtausgaenge[i], HIGH);
}
}
else {
for (int i = 0; i < 5; i++) {
digitalWrite(Lichtausgaenge[i], LOW);
}
}
if (InputState == LOW && Neonleuchten_State == LOW) {
if (currentmillis - prevflackermillis > RandFlackerTime) {
if (flackern < 100) {
flackern++;
RandFlackerTime = random(5, 10);
if (random(0, 3) < 2) {
digitalWrite(Neonleuchten_Pins[random(0, 6)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 6)], LOW);
}
}
else {
Neonleuchten_State = HIGH;
for (int i = 0; i < 6; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
flackern = 0;
}
prevflackermillis = currentmillis;
}
}
if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 6; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}
}
 

 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
word wAddr = Addr + isRoco; //Offset für Roco wird eingerechnet, da Roco die Weichenadressen anders zählt
if ( wAddr == DccAdresse1) {
if ( OutputAddr & 0x1 ) {
Step1.rotate(1);
} else {
Step1.stop();
}
}
if ( wAddr == DccAdresse2) {
if ( OutputAddr & 0x1 ) {
Servo1.write(Servo1Pos1);
Servo2.write(Servo2Pos1);
} else {
Servo1.write(Servo1Pos2);
Servo2.write(Servo2Pos2);
}
}
if ( wAddr == DccAdresse3) {
if ( OutputAddr & 0x1 ) {
InputState = LOW;
} else {
InputState = HIGH;
}
}
if ( wAddr == DccAdresse4) {
if ( OutputAddr & 0x1 ) {
InputState2 = LOW;
} else {
InputState2 = HIGH;
}
}
if ( wAddr == DccAdresse5) {
if ( OutputAddr & 0x1 ) {
Servo3.write(Servo3Pos1);
} else {
Servo3.write(Servo3Pos2);
}
}
 

}
 



Viele Grüße
Matthias


MobaLedLib Wiki


Matthias_h0  
Matthias_h0
InterRegioExpress (IRE)
Beiträge: 277
Registriert am: 29.11.2020
Gleise Märklin C-Gleis
Spurweite H0
Steuerung MS2, MobaLedLib
Stromart Digital


RE: Arduino Steuerung Sägewerk

#50 von stefan79 , 21.06.2021 15:44

Hallo Matthias,

Dankeschön ich hab es versucht aber hat mir beim prüfen immer gleich ein Fehler angezeigt direkt in der ersten Zeile.

MoToServo Servo3;

Muss mich da wohl noch bisschen rein fuchsen

Gruß Stefan


DCC, Z21PG Atmega 2560, Z21PG Mini
Rocrail mit WIO Control


stefan79  
stefan79
RegionalExpress (RE)
Beiträge: 87
Registriert am: 21.03.2019
Ort: NRW
Gleise Fleischmann Modellgleis
Spurweite H0
Steuerung Z21PG Rocrail mit WIO Control
Stromart Digital


   

Attiny 45 an Digitalstrom anschliessen
LEDs glimmen obwohl nur ein Pol am Gleichrichter anliegt

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