Arduino Steuerung Sägewerk

#1 von stefan79 , 27.05.2021 14:34

Hallo zusammen,

könnte mir jemand helfen bei der Programmierung eines Arduino Nano für mein Sägewerk

Bin noch relativ neu in Sachen Programmierung.

In der Steuerung sollte folgende Sachen drin sein:

1 x Schrittmotor 28byj-48 in einer Richtung drehend
1 x Leuchtstoffröhre Simulation
1x wenn es möglich ist Gaslampen Simulation

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

#2 von Matthias_h0 , 27.05.2021 14:53

Hallo Stefan
Ich kann dir das gerne nachher mal programmieren.
Allerdings bräuchte ich dazu noch ein paar Infos:

Soll das Ganze von außen gesteuert werden? Über DCC? Taster?

Soll der Schrittmotor sich dauerhaft drehen? Oder nur in bestimmten Zeitintervallen?

Viele Grüße,
Matthias


MobaLedLib Wiki


Hardi 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

#3 von stefan79 , 27.05.2021 15:05

Hallo Matthias,

Danke schon mal für deine Hilfe im voraus.

Also per DCC wäre schon praktisch dann kann ich alles über die Z21 steuern.

Der Motor per Zufall ist auch ok dann ist ein bisschen Abwechslung drin.

Dankeschön
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

#4 von Matthias_h0 , 27.05.2021 15:51

Hallo Stefan,
ich habe jetzt mal ein kleines Programm geschrieben. Du kannst dir ja mal ansehen, ob es so passt. Die Simulation der Neonröhren und Gaslampen ist jetzt noch sehr einfach gehalten, das kann man sicherlich noch verbessern. Es funktioniert aber bereits ganz gut.
Das ganze Programm wird über eine DCC Adresse eingeschaltet. Die DCC Adresse kann im Programmcode geändert werden.
Der Steppermotor wird zufällig immer wieder ein und ausgeschaltet. Wie oft das passiert, kann ebenfalls angepasst werden. Angeschlossen wird der Steppermotor über die Pins 3,4,5 und 6 des Arduinos. Die Gaslampe wird an Pin 11 angeschlossen. Neonröhren können über Pin A0-A4 angeschlossen werden. Das DCC Signal wird über Pin 2 angeschlossen.
Einen Schaltplan für den Anschluss von DCC an einen Arduino findest du hier.

Hier ist das Programm. Ich habe es mal versteckt, damit der Post nicht so lang wird:

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
 

 
#include <MobaTools.h>
MoToStepper Step1(2048, FULLSTEP);
 
//Anschlusspins
const byte stPn[] = { 3, 5, 4, 6 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4}; //Pins für die Neonleuchten
#define Gaslampe 11 //Pin für die Gaslampe
 
#define DccAdresse 5 //DCC Addresse
 
#define Stepperspeed 60 //Geschwindigkeit des Steppermotors
 
#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 0; //Offset für Weichenadressen
 

unsigned long previousmillis = 0;
bool Neonleuchten_State = 0;
bool Stepperstate = 0;
int RandStepperTime = 0;
bool InputState = 1;
bool OldStepperState = 0;
void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
for (int i = 0; i < 5; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
pinMode(Gaslampe, 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 (InputState == LOW) {
if (currentmillis - previousmillis > RandStepperTime) {
Stepperstate = !Stepperstate;
RandStepperTime = random(5000, 10000);
previousmillis = currentmillis;
}
if (Stepperstate == HIGH&&OldStepperState == LOW) {
Step1.rotate(1);
OldStepperState = HIGH;
}
else if (Stepperstate == LOW){
Step1.stop();
OldStepperState = LOW;
}
}
else {
Step1.stop();
}
if (InputState == LOW && Neonleuchten_State == LOW) {
for (int i = 0; i < 100; i++) {
if (random(0, 3) < 2) {
digitalWrite(Neonleuchten_Pins[random(0, 5)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 5)], LOW);
}
delay(random(5, 20));
}
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
Neonleuchten_State = HIGH;
//Gaslampe
analogWrite(Gaslampe, 50);
delay(50);
analogWrite(Gaslampe, 0);
delay(10);
for (int i = 0; i < 255; i++) {
analogWrite(Gaslampe, i);
delay(50);
}
digitalWrite(Gaslampe, HIGH);
}
if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}
digitalWrite(Gaslampe, 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;
} else {
InputState = HIGH;
}
}
}
 

 

 



Das Programm verwendet folgende Bibliotheken:
-MobaTools
-NmraDcc
Diese musst du installieren, damit es funktioniert

Wenn du Fragen hast, kannst du dich gerne melden.

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

zuletzt bearbeitet 28.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#5 von stefan79 , 27.05.2021 19:22

Hallo Matthias,

Sieht schon super aus aber Ich kann ihn nicht über DCC schalten die Funktionen laufen sofort also auch ohne Anschluss vom DCC signal.

Könnte man noch bei der Gaslampe ein kurzes Blitzen einbauen und das die dann langsam hell werden ?

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 27.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#6 von Matthias_h0 , 28.05.2021 11:33

Hallo Stefan
Der Fehler beim Einlesen der DCC Signale sollte jetzt behoben sein, ich habe das Programm oben schon geändert. Es tut mir leid, dass es nicht richtig funktioniert hat, ich hatte noch eine Variable falsch gesetzt, wodurch das Programm sofort loslief.
Das mit der Gaslampe schaue ich mir gleich mal an.
Edit: Ich habe das Programm für die Gaslaterne jetzt mal angepasst, meintest du das so? Ich habe es jetzt so programmiert, dass die Laterne erst kurz aufblitzt und dann langsam heller wird.
Du kannst ja mal testen, ob es bei dir jetzt funktioniert. Wenn es nicht klappt, solltest du die Konstante isRoco mal auf 0 oder auf 4 setzen, da bei Roco die Weichenadressen abweichen.
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 28.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#7 von stefan79 , 28.05.2021 14:32

Hallo Matthias,

Fantastisch was du da zauberst .

Hab jetzt noch ein bisschen über die delays das Flackern und das Hochfahren von den Lampen eingestellt.

Kann man für die Gaslampen noch 3 weitere Outputs belegen?
Der Schrittmotor läuft relativ langsam und hat keine Kraft kann man da auch noch was dran machen ?

Sowas könnte ich mir auch noch für meine kirmes vorstellen und belebte Siedlung mit Straßenbeleuchtung.

Kirmes
1x Schrittmotor Softanlauf bis Endgeschwindigkeit
1 x Lauflicht

Siedlung
Ausgängen schalten durcheinander an aus
Straßenbeleuchtung als Neonrohre

Kann leider nicht das große System nehmen das ich nicht alles umstricken möchte .

Bilder oder Videos folgen noch.

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

#8 von Matthias_h0 , 28.05.2021 15:55

Hallo Stefan

Zitat von stefan79 im Beitrag #7

Der Schrittmotor läuft relativ langsam und hat keine Kraft kann man da auch noch was dran machen ?


Die Geschwindigkeit des Schrittmotors kann mit dieser Zeile verändert werden, du kannst die Geschwindigkeit z.B. mal auf 100 setzen, dann sollte sich der Motor schon deutlich schneller drehen. Da musst du einfach mal ein bisschen experimentieren.

1
 
#define Stepperspeed 60        //Geschwindigkeit des Steppermotors
 



Zitat von stefan79 im Beitrag #7
Hallo Matthias,
Kann man für die Gaslampen noch 3 weitere Outputs belegen?


Ich werde mal sehen, was möglich ist, aber es stehen leider nur 6 PWM Ausgänge zur Verfügung. Das sind Pin 3, 5, 6, 9, 10 und 11. Pin 9 und 10 können nicht verwendet werden, da die PWM Signale an diesen Pins vom Timer 1 des Arduinos generiert werden. Dieser Timer wird aber für die Ansteuerung der Schrittmotoren verwendet. Pin 3, 5 und 6 werden derzeit vom Schrittmotor belegt. Ich muss mal testen, ob man den Schrittmotor auch an anderen Pins anschließen kann, dann hätte man 3 weitere PWM Ausgänge frei. Ich werde das mal ausprobieren. Es ist notwendig, einen PWM Ausgang dafür zu verwenden, damit man die Led dimmen kann.

Zitat von stefan79 im Beitrag #7

Sowas könnte ich mir auch noch für meine kirmes vorstellen und belebte Siedlung mit Straßenbeleuchtung.

Kirmes
1x Schrittmotor Softanlauf bis Endgeschwindigkeit
1 x Lauflicht

Das sollte eigentlich kein Problem sein.

Zitat von stefan79 im Beitrag #7
Kann leider nicht das große System nehmen das ich nicht alles umstricken möchte .

Was meinst du damit?

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

#9 von Matthias_h0 , 28.05.2021 16:20

Hallo Stefan
Ich habe die Pinbelegung jetzt geändert, dadurch können jetzt 4 Gaslaternen angeschlossen werden. Die Pinbelegung sieht jetzt so aus:

Steppermotor: Pin 7, 8, 9, 10
Gaslaternen: Pin 11, 3, 5, 6
Neonlampen: Pin A0, A1, A2, A3, A4
Dcc: Pin 2

Theoretisch wären jetzt noch ein paar Pins frei, die man mit weiteren Neonröhren o.ä. belegen könnte.

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
142
143
144
145
146
147
148
149
150
151
152
153
 

 
#include <MobaTools.h>
MoToStepper Step1(2048, FULLSTEP);
 
//Anschlusspins
const byte stPn[] = { 7, 9, 8, 10 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4}; //Pins für die Neonleuchten
 
#define Gaslampe1 11 //Pin für die Gaslampe
#define Gaslampe2 3
#define Gaslampe3 5
#define Gaslampe4 6
 

#define DccAdresse 1 //DCC Addresse
 
#define Stepperspeed 80 //Geschwindigkeit des Steppermotors
 
#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 Stepperstate = 0;
int RandStepperTime = 0;
bool InputState = 1;
bool OldStepperState = 0;
void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
for (int i = 0; i < 5; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
pinMode(Gaslampe1, OUTPUT);
pinMode(Gaslampe2, OUTPUT);
pinMode(Gaslampe3, OUTPUT);
pinMode(Gaslampe4, 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 (InputState == LOW) {
if (currentmillis - previousmillis > RandStepperTime) {
Stepperstate = !Stepperstate;
RandStepperTime = random(5000, 10000);
previousmillis = currentmillis;
}
if (Stepperstate == HIGH&&OldStepperState == LOW) {
Step1.rotate(1);
OldStepperState = HIGH;
}
else if (Stepperstate == LOW){
Step1.stop();
OldStepperState = LOW;
}
}
else {
Step1.stop();
}
if (InputState == LOW && Neonleuchten_State == LOW) {
for (int i = 0; i < 100; i++) {
if (random(0, 3) < 2) {
digitalWrite(Neonleuchten_Pins[random(0, 5)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 5)], LOW);
}
delay(random(5, 20));
}
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
Neonleuchten_State = HIGH;
//Gaslampe
analogWrite(Gaslampe1, 50);
delay(50);
analogWrite(Gaslampe1, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe1, i);
delay(30);
}
digitalWrite(Gaslampe1, HIGH);
analogWrite(Gaslampe2, 50);
delay(50);
analogWrite(Gaslampe2, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe2, i);
delay(30);
}
digitalWrite(Gaslampe2, HIGH);
analogWrite(Gaslampe3, 50);
delay(50);
analogWrite(Gaslampe3, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe3, i);
delay(30);
}
digitalWrite(Gaslampe3, HIGH);
analogWrite(Gaslampe4, 50);
delay(50);
analogWrite(Gaslampe4, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe4, i);
delay(30);
}
digitalWrite(Gaslampe4, HIGH);

}
if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}
delay(500);
digitalWrite(Gaslampe1, LOW);
delay(100);
digitalWrite(Gaslampe2, LOW);
delay(150);
digitalWrite(Gaslampe3, LOW);
delay(300);
digitalWrite(Gaslampe4, 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;
} else {
InputState = HIGH;
}
}
}
 

 
 



Ich habe die Geschwindigkeit des Schrittmotors jetzt direkt auch ein bisschen erhöht.

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

zuletzt bearbeitet 28.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#10 von stefan79 , 28.05.2021 17:00

Hallo Matthias

Ja der Motor dreht schneller das hatte ich auch schon raus gefunden wo das geht aber die Kraft fehlt noch.

Ich hatte jetzt einfach mal auf ein anderes Board das Beispiel Stepper Slider aus der MobaTools.h auf gespielt und das läuft der Motor super mit Kraft dahinter und set.speed hab ich da auf 100 gestellt.

Mit großem Programm meinte ich MobaLedLib.

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

#11 von Matthias_h0 , 28.05.2021 17:46

Hallo Stefan

Ich glaube ich weiß jetzt, worin das Problem besteht.
In meinem Programm habe ich diese Einstellung für den Steppermotor verwendet:

1
 
MoToStepper Step1(2048, FULLSTEP);
 



In dem von dir genannten Beispiel wird diese Einstellung verwendet:

1
 
MoToStepper Step1(4096, HALFSTEP)
 



Mit dieser Einstellung wird eine feinere Auflösung der Schritte generiert und der Motor hat mehr Kraft. Du kannst diese Zeile ja mal so ändern.

Das Programm sieht dann so 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
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
 

#include <MobaTools.h>
MoToStepper Step1(4096, HALFSTEP);

//Anschlusspins
const byte stPn[] = { 7, 9, 8, 10 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4}; //Pins für die Neonleuchten

#define Gaslampe1 11 //Pin für die Gaslampe
#define Gaslampe2 3
#define Gaslampe3 5
#define Gaslampe4 6

 
#define DccAdresse 1 //DCC Addresse

#define Stepperspeed 80 //Geschwindigkeit des Steppermotors

#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 Stepperstate = 0;
int RandStepperTime = 0;
bool InputState = 1;
bool OldStepperState = 0;
void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
for (int i = 0; i < 5; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
pinMode(Gaslampe1, OUTPUT);
pinMode(Gaslampe2, OUTPUT);
pinMode(Gaslampe3, OUTPUT);
pinMode(Gaslampe4, 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 (InputState == LOW) {
if (currentmillis - previousmillis > RandStepperTime) {
Stepperstate = !Stepperstate;
RandStepperTime = random(5000, 10000);
previousmillis = currentmillis;
}
if (Stepperstate == HIGH&&OldStepperState == LOW) {
Step1.rotate(1);
OldStepperState = HIGH;
}
else if (Stepperstate == LOW){
Step1.stop();
OldStepperState = LOW;
}
}
else {
Step1.stop();
}
if (InputState == LOW && Neonleuchten_State == LOW) {
for (int i = 0; i < 100; i++) {
if (random(0, 3) < 2) {
digitalWrite(Neonleuchten_Pins[random(0, 5)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 5)], LOW);
}
delay(random(5, 20));
}
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
Neonleuchten_State = HIGH;
//Gaslampe
analogWrite(Gaslampe1, 50);
delay(50);
analogWrite(Gaslampe1, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe1, i);
delay(30);
}
digitalWrite(Gaslampe1, HIGH);
analogWrite(Gaslampe2, 50);
delay(50);
analogWrite(Gaslampe2, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe2, i);
delay(30);
}
digitalWrite(Gaslampe2, HIGH);
analogWrite(Gaslampe3, 50);
delay(50);
analogWrite(Gaslampe3, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe3, i);
delay(30);
}
digitalWrite(Gaslampe3, HIGH);
analogWrite(Gaslampe4, 50);
delay(50);
analogWrite(Gaslampe4, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe4, i);
delay(30);
}
digitalWrite(Gaslampe4, HIGH);

}
if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}
delay(500);
digitalWrite(Gaslampe1, LOW);
delay(100);
digitalWrite(Gaslampe2, LOW);
delay(150);
digitalWrite(Gaslampe3, LOW);
delay(300);
digitalWrite(Gaslampe4, 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;
} else {
InputState = HIGH;
 
 



Ich hoffe, dass das die Lösung ist.

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

#12 von stefan79 , 28.05.2021 18:35

Hallo Matthias

ne war noch nicht ganz richtig hab da jetzt selber mal versucht und verglichen woran es liegen kann.

Hab da noch Kleinigkeiten geändert.

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
 
#include <MobaTools.h>
MoToStepper Step1(4096); // HALFSTEP

//Anschlusspins
const byte stPn[] = { 7, 9, 8, 10 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4}; //Pins für die Neonleuchten

#define Gaslampe1 11 //Pin für die Gaslampe
#define Gaslampe2 3
#define Gaslampe3 5
#define Gaslampe4 6


#define DccAdresse 5 //DCC Addresse

 

#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 Stepperstate = 0;
int RandStepperTime = 0;
bool InputState = 1;
bool OldStepperState = 0;
void setup() {
Step1.attach( 7,8,9,10 );
Step1.setSpeed(100);
for (int i = 0; i < 5; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
pinMode(Gaslampe1, OUTPUT);
pinMode(Gaslampe2, OUTPUT);
pinMode(Gaslampe3, OUTPUT);
pinMode(Gaslampe4, 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 (InputState == LOW) {
if (currentmillis - previousmillis > RandStepperTime) {
Stepperstate = !Stepperstate;
RandStepperTime = random(5000, 10000);
previousmillis = currentmillis;
}
if (Stepperstate == HIGH&&OldStepperState == LOW) {
Step1.rotate(1);
OldStepperState = HIGH;
}
else if (Stepperstate == LOW){
Step1.stop();
OldStepperState = LOW;
}
}
else {
Step1.stop();
}
if (InputState == LOW && Neonleuchten_State == LOW) {
for (int i = 0; i < 100; i++) {
if (random(0, 3) < 2) {
digitalWrite(Neonleuchten_Pins[random(0, 5)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 5)], LOW);
}
delay(random(5, 20));
}
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
Neonleuchten_State = HIGH;
//Gaslampe
analogWrite(Gaslampe1, 50);
delay(50);
analogWrite(Gaslampe1, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe1, i);
delay(30);
}
digitalWrite(Gaslampe1, HIGH);
analogWrite(Gaslampe2, 50);
delay(50);
analogWrite(Gaslampe2, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe2, i);
delay(30);
}
digitalWrite(Gaslampe2, HIGH);
analogWrite(Gaslampe3, 50);
delay(50);
analogWrite(Gaslampe3, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe3, i);
delay(30);
}
digitalWrite(Gaslampe3, HIGH);
analogWrite(Gaslampe4, 50);
delay(50);
analogWrite(Gaslampe4, 0);
delay(10);
for (int i = 0; i < 150; i++) {
analogWrite(Gaslampe4, i);
delay(30);
}
digitalWrite(Gaslampe4, HIGH);

}
if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}
delay(500);
digitalWrite(Gaslampe1, LOW);
delay(100);
digitalWrite(Gaslampe2, LOW);
delay(150);
digitalWrite(Gaslampe3, LOW);
delay(300);
digitalWrite(Gaslampe4, 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;
} else {
InputState = HIGH;
}
}
}
 



geändert hab ich die Zeilen

MoToStepper Step1(4096); // HALFSTEP

#define Stepperspeed 80 //Geschwindigkeit des Steppermotors
den hab ich ganz gelöscht

Step1.attach( 7,8,9,10 );
Step1.setSpeed(100);


Jetzt Läuft es fast zu 100% was mir jetzt noch aufgefallen ist ich muss mehrmals die Funktion betätigen damit der Arduino Startet und
abschalten macht er nur wenn der Motor nicht läuft.

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 28.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#13 von Matthias_h0 , 28.05.2021 18:43

Hallo Stefan
Im Prinzip hast du da ja nur die Geschwindigkeit erhöht, der Rest ist gleich.
Das Einschalten über DCC geht bei mir immer.
Warum das Abschalten nur geht, wenn der Motor nicht läuft, weiß ich auch nicht. Vermutlich blockiert der Schrittmotor das Programm.

Vielleicht kann sich das mal einer der Arduino Experten hier im Forum ansehen, dafür kenne ich mich nicht gut genug damit aus.

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

#14 von stefan79 , 28.05.2021 19:02

Hallo Matthias

Vorher lief der auch nur ohne Kraft hat zwar gedreht aber der Power hat gefehlt. Nachdem ich die Zeile Step1.attach( 7,8,9,10 ); geänderten hatte lief es komischer Weise. Du hattest da noch was anderes stehen .

Werde es morgen mal mit meiner DCC++ testen mit dem einschalten.

Aber ich danke dir sehr dafür bringt wieder Leben in meine Anlage

Mit den anderen zwei Sachen hat noch etwas Zeit.

Hat du eventuell noch mal den Sketch vom Soundmodul mit dem dfplayer Modul. Der hier im Forum ist geht nicht.

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 28.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#15 von MicroBahner , 29.05.2021 11:02

Zitat von Matthias_h0 im Beitrag #13
Das Einschalten über DCC geht bei mir immer.
Warum das Abschalten nur geht, wenn der Motor nicht läuft, weiß ich auch nicht. Vermutlich blockiert der Schrittmotor das Programm.

Hallo ihr zwei
Ich habe mir das Programm mal angeschaut. Der Grund, dass das Empfangen der DCC-Befehle nicht zuverlässig funktioniert, liegt darin, dass im loop vielfach delay() eingesetzt wird. Die blockieren das Programm, nicht der Schrittmotor. Durch die delay() wird der Durchlauf des loop gebremst, und Dcc.process wird nicht oft genug aufgerufen. Damit gehen dann viele DCC-Telegramme verloren. Wenn man mit der NmraDcc-Lib arbeitet muss man blockadefrei programmieren. Der MoToTimer der MobaTools kann dabei helfen.

Alternativ könnte man auch eine yield-Funktion einfügen:

1
2
3
 
void yield() {
Dcc.process();
}
 


Dann wird Dcc.process auch während des delay aufgerufen. Die verzögerte Reaktion durch die vielen delays hat man aber trotzdem.

P.S. notifyDccAccState() sollte man auch nicht mehr verwenden. Das ist eine alte Funktion, die nur noch aus Kompatibilitätsgründen unterstützt wird, und bei einer der nächsten Versionen der NmraDcc-Lib sicher rausfliegen wird.
Aktuell sollte man notifyDccAccTurnoutOutput() oder notifyDccAccTurnoutBoard() verwenden, je nachdem welches Adressierungsschema man verwenden will.


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


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

zuletzt bearbeitet 29.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#16 von stefan79 , 29.05.2021 12:35

Hallo Franz-Peter,

da ich da noch nicht so gut drin bin, Programme um zu schreiben könntest du es vielleicht
umstricken .

Ich hab es versucht aber es kommen immer Fehler beim prüfen.

Danke
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

#17 von Matthias_h0 , 29.05.2021 12:58

Hallo
Ich kann die delays gerne nachher mal entfernen und durch millis ersetzen. Ich dachte, dass das mit den delays kein Problem wäre, da diese nur für das Flackern beim Einschalten verwendet werden.
Aber auch nach dem Einschalten lässt sich die Funktion nicht korrekt abschalten, obwohl dann gar keine delays mehr vorkommen.
Ich werde trotzdem nachher mal die delay Befehle entfernen, vielleicht hilft das schon.

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

zuletzt bearbeitet 29.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#18 von Matthias_h0 , 29.05.2021 13:20

Zitat von stefan79 im Beitrag #14
Hat du eventuell noch mal den Sketch vom Soundmodul mit dem dfplayer Modul. Der hier im Forum ist geht nicht.


Hallo Stefan,
meinst du dieses 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
 

/*
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_Adresse 1 //DCC Adresse zum Abrufen der Sounddatei
#define Volume 10 //Lautstärke
 

 
#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);
myDFPlayer.play(1);
 
}
 
void loop() {
Dcc.process();
 
}
 
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) {
if ( Addr == DCC_Adresse ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(1);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
}
}
}
 
 


Das sollte so jetzt funktionieren.

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

zuletzt bearbeitet 29.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#19 von MicroBahner , 29.05.2021 13:36

Zitat von Matthias_h0 im Beitrag #17
Ich dachte, dass das mit den delays kein Problem wäre, da diese nur für das Flackern beim Einschaltrn verwendet werden.

Da wird der gesamte loop() aber immerhin für fast 20 Sekunden blockiert. Und wenn InputState auf HIGH steht, ist der Loop bei jedem Durchlauf für 1 Sekunde blockiert. Da kann die NmraDcc-Lib nicht richtig funktionieren. Zumindest das mit dem yield() sollte man ( vor loop() ) einfügen. Dann werden die Telegramme zumindest erkannt, und beim beim nächsten loop-Durchlauf wird entsprechend reagiert. So wie es jetzt ist, gehen die Telegramme komplett verloren, wenn sie zum 'falschen' Zeitpunkt ankommen.


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


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

zuletzt bearbeitet 29.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#20 von Matthias_h0 , 29.05.2021 13:40

Hallo Franz-Peter
Ich werde die delays jetzt einfach komplett rausnehmen, dann sollte es damit keine Probleme mehr geben.
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

#21 von MicroBahner , 29.05.2021 14:16

Zitat von stefan79 im Beitrag #16
Hallo Franz-Peter,
Ich hab es versucht aber es kommen immer Fehler beim prüfen.


Wenn Du das yield einfügen willst, musst Du die Zeilen aus meinem Post vor dem loop einfügen. z.B. so:

1
2
3
4
5
6
7
8
9
10
 
...
} // Ende von setup
 
void yield() {
Dcc.process();
}
 
void loop() {
...
 
 


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


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

zuletzt bearbeitet 29.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#22 von stefan79 , 29.05.2021 14:52

Hallo Matthias

Ja genau werde es mal testen wieviel sounds kann ich damit abspielen ?

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

#23 von Matthias_h0 , 29.05.2021 15:07

Hallo Stefan,

ich habe jetzt aus dem Programm für das Sägewerk alle delays rausgenommen, damit funktioniert das Einschalten und Ausschalten über DCC jetzt sehr zuverlässig.

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

 
#include <MobaTools.h>
MoToStepper Step1(4096, HALFSTEP);
 
//Anschlusspins
const byte stPn[] = { 7, 8, 9, 10 }; //Anschluss Pins für den Steppermotor
const byte Neonleuchten_Pins[] = {A0, A1, A2, A3, A4}; //Pins für die Neonleuchten
 
#define Gaslampe1 11 //Pin für die Gaslampe
#define Gaslampe2 3
#define Gaslampe3 5
#define Gaslampe4 6
 

#define DccAdresse 1 //DCC Addresse
 
#define Stepperspeed 100 //Geschwindigkeit des Steppermotors
 
#include <NmraDcc.h>
NmraDcc Dcc;
DCC_MSG Packet ;
const byte isRoco = 0; //Offset für Weichenadressen
 

unsigned long previousmillis = 0;
bool Neonleuchten_State = 0;
bool Stepperstate = 0;
int RandStepperTime = 0;
bool InputState = 1;
bool OldStepperState = 0;
byte flackern = 0;
unsigned long prevflackermillis = 0;
unsigned long RandFlackerTime = 0;
 
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;
void setup() {
Step1.attach( stPn[0], stPn[1], stPn[2], stPn[3] );
Step1.setSpeed(Stepperspeed);
for (int i = 0; i < 5; i++) {
pinMode(Neonleuchten_Pins[i], OUTPUT);
}
pinMode(Gaslampe1, OUTPUT);
pinMode(Gaslampe2, OUTPUT);
pinMode(Gaslampe3, OUTPUT);
pinMode(Gaslampe4, 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 (InputState == LOW) {
if (currentmillis - previousmillis > RandStepperTime) {
Stepperstate = !Stepperstate;
RandStepperTime = random(5000, 10000);
previousmillis = currentmillis;
}
if (Stepperstate == HIGH && OldStepperState == LOW) {
Step1.rotate(1);
OldStepperState = HIGH;
}
else if (Stepperstate == LOW) {
Step1.stop();
OldStepperState = LOW;
}
}
else {
Step1.stop();
}
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, 5)], HIGH);
}
else {
digitalWrite(Neonleuchten_Pins[random(0, 5)], LOW);
}
 
}
else {
Neonleuchten_State = HIGH;
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], HIGH);
}
Gaslampe1State = 1;
analogWrite(Gaslampe1, 50);
flackern = 0;
}
prevflackermillis = currentmillis;
}

 
}
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;
}

prevGaslampe4Millis = currentmillis;
}
}
 

if (InputState == HIGH) {
Neonleuchten_State = LOW;
for (int i = 0; i < 5; i++) {
digitalWrite(Neonleuchten_Pins[i], LOW);
}

digitalWrite(Gaslampe1, LOW);
digitalWrite(Gaslampe2, LOW);
digitalWrite(Gaslampe3, LOW);
digitalWrite(Gaslampe4, 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;
} else {
InputState = HIGH;
}
}
}
 
 



Bei dem Programm für das Soundmodul lässt sich bisher leider nur ein Sound abrufen, da in dem anderen Thread nur ein Sound nötig war. Das Programm sollte sich aber problemlos auf mehrere Sounds erweitern lassen, theoretisch lassen sich so viele Sounds abspielen, wie auf deine SD Karte passen. Aber dafür muss das Programm noch etwas angepasst werden.
Ich werde das Programm gleich mal erweitern, damit man viele Sounds damit abspielen kann.

Viele Grüße
Matthias


MobaLedLib Wiki


stefan79 und Bodo 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

zuletzt bearbeitet 30.05.2021 | Top

RE: Arduino Steuerung Sägewerk

#24 von Matthias_h0 , 29.05.2021 15:23

Hallo Stefan,
ich habe das Programm jetzt mal so erweitert, dass sich bis zu 20 Sounds abrufen lassen. Dazu können 10 DCC Adressen frei vergeben werden.

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

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

 
#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 ) {
if ( Addr == DCC_Adresse1 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(1);
}
else {
myDFPlayer.play(2);
}
}
if ( Addr == DCC_Adresse2 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(3);
}
else {
myDFPlayer.play(4);
}
}
if ( Addr == DCC_Adresse3 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(5);
}
else {
myDFPlayer.play(6);
}
}
if ( Addr == DCC_Adresse4 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(7);
}
else {
myDFPlayer.play(8);
}
}
if ( Addr == DCC_Adresse5 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(9);
}
else {
myDFPlayer.play(10);
}
}
if ( Addr == DCC_Adresse6 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(11);
}
else {
myDFPlayer.play(12);
}
}
if ( Addr == DCC_Adresse7 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(13);
}
else {
myDFPlayer.play(14);
}
}
if ( Addr == DCC_Adresse8 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(15);
}
else {
myDFPlayer.play(16);
}
}
if ( Addr == DCC_Adresse9 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(17);
}
else {
myDFPlayer.play(18);
}
}
if ( Addr == DCC_Adresse10 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(19);
}
else {
myDFPlayer.play(20);
}
}
}
 
 



Wenn noch mehr Sounds abgerufen werden sollen, kann unten in der Funktion notifyDccAccState einfach immer wieder dieser Programmteil eingefügt und entsprechend angepasst werden (DCC_Adresse, myDFPlayer.play(1) und myDFPlayer.play(2) müssen geändert werden). So lässt sich das Programm sehr einfach erweitern.

1
2
3
4
5
6
7
8
 
  if (  Addr == DCC_Adresse1 ) {
if ( OutputAddr & 0x1 && State == HIGH) {
myDFPlayer.play(1);
}
else{
myDFPlayer.play(2);
}
}
 



Alternativ könnte man die Sounds auch über Taster abrufen. Das sieht dann z.B. so aus:
setup:

1
2
3
 

pinMode(3, INPUT_PULLUP);
 
 


loop:

1
2
3
4
5
 

if(digitalRead(3)==LOW){
myDFPlayer.play(1);
}
 
 



Die Möglichkeiten lassen sich natürlich auch beliebig kombinieren.


Viele Grüße
Matthias


MobaLedLib Wiki


Bertyk 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

#25 von stefan79 , 30.05.2021 11:47

Hallo Matthias

Danke werde ich später mal testen .

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


   

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