RE: Hilfe zu Mobatools Servo ansteuern Dcc

#1 von mondmann25 , 08.11.2020 09:36

Hallo,
ich habe nun auch mal versucht die Mobatools zu verwenden.
Dazu habe ich ein Servo an einen Arduino UNO und als Zentrale die Roco Z21.
Leider habe ich keinen Erfolg, das Servo bewegt sich einfach nicht.
Einstellung Z21: Weiche Adresse 6 Dcc.
Arduino: Servo hängt an Pin 4.

Ich habe schon versucht auf den Pin 2 über den seriellen Monitor zu schauen.
Die Zahlen die ich erhalte ändern sich aber nicht egal was ich drücke oder ob ich die Spannung komplett abschalte.
Könnte da jemand mal drüber schauen was ich falsch mache. Danke schon mal

Hier der Code:

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
 

#include <NmraDcc.h>
#include <MobaTools.h>
 
// Demo: ein ganz einfacher Dcc-Servodecoder //
//------------------------------------------ //
// die NmraDcc - Library gibt es unter https://github.com/mrrwa/NmraDcc/archive/master.zip
 
// anzupassende Konstante:
const byte isROCO = 0 ; // wegen unterschiedlicher Weichenadressberechnung bei Roco (sonst = 0)
const byte weichenAdr[] = { 6, }; // DCC-Weichenadressen
const byte servoPins[] = { 4, }; // output-pin der Servos
const int geradePulse[] = {1200,1200,1200,1200,1200,1200,1200,1200}; // Pulslänge geradeaus
const int abzweigPulse[]= {1800,1800,1800,1800,1800,1800,1800,1800}; // Pulslänge abzweigend
 
const int speed = 8;
const byte autoOff = 1;
const byte ServoZahl = sizeof(weichenAdr);
Servo8 weicheS[ServoZahl];
NmraDcc Dcc;
///////////////////////////////////////////////////////////////
void setup() {
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
 
for ( byte i=0; i<ServoZahl; i++ ) {
// Weichenservos initiieren
weicheS[i].attach( servoPins[i], autoOff );
weicheS[i].setSpeed( speed );
}
Serial.begin(9600);

}
////////////////////////////////////////////////////////////////
void loop() {
Dcc.process(); // Hier werden die empfangenen Telegramme analysiert

Serial.println(MAN_ID_DIY );
Serial.println(FLAGS_OUTPUT_ADDRESS_MODE);
Serial.println(FLAGS_DCC_ACCESSORY_DECODER);
delay(5);

}
//////////////////////////////////////////////////////////////
// Unterprogramme, die von der DCC Library aufgerufen werden:
// Die folgende Funktion wird von Dcc.process() aufgerufen, wenn ein Weichentelegramm empfangen wurde
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ){
// Weichenadresse berechnen
word wAddr = Addr+isROCO; // Roco zählt ab 0, alle anderen lassen die ersten 4 Weichenadressen frei
// Testen ob eigene Weichenadresse
for ( byte i = 0; i < ServoZahl; i++ ) {
if ( wAddr == weichenAdr[i] ) {
// ist eigene Adresse, Servo ansteuern
if ( OutputAddr & 0x1 ) {
weicheS[i].write( geradePulse[i] );
} else {
weicheS[i].write( abzweigPulse[i] );
}
break; // Schleifendurchlauf abbrechen, es kann nur eine Weiche sein
}
}
}
 
 


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#2 von mondmann25 , 09.11.2020 20:46

Ich habe jetzt rausgefunden das es an der NmraDcc Bibliothek liegt. Es funktioniert nur mit der Version 1.2.1.
Vielleicht finde ich jetzt auch noch raus was da der unterschied ist.


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#3 von MoBa_Alfred , 10.11.2020 14:57

Hallo,
frag doch einfach mal den Autor im Thread https://stummiforum.de/viewtopic.php?f=21&t=127899
Von ihm bekommst Du bestimmt die passende Antwort.

Grüße
Alfred


=================================
Mä-M-Gleisanlage und C-Gleisanlage, Digital mit MoBaSbS und TrainController 9
H0e Module mit DR5000 und multiMAUS
und aus Altbeständen 6021, IB und MobileStation
=================================


 
MoBa_Alfred
InterCity (IC)
Beiträge: 539
Registriert am: 19.10.2006
Gleise C-Gleis, M-Gleis, Roco H0e Gleis
Spurweite H0, H0e, Z
Steuerung MoBaSbS
Stromart Digital, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#4 von MicroBahner , 10.11.2020 19:55

Bei der nmra-Lib gabs mal eine inkompatible Änderung. Das muss ich nochmal nachschauen - genau weis ich das nicht mehr auswendig.


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#5 von MicroBahner , 11.11.2020 15:39

Hallo,
zum einen:
Bei der aktuellen nmraDcc Lib, muss die 'pin'-Methode vor dem init aufgerufen werden:

1
2
3
 
    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 );
 
 



zum anderen:
was versprichst Du dir von den Ausgaben im loop():

1
2
3
4
5
6
7
8
 
void loop() {
Dcc.process(); // Hier werden die empfangenen Telegramme analysiert

Serial.println(MAN_ID_DIY );
Serial.println(FLAGS_OUTPUT_ADDRESS_MODE);
Serial.println(FLAGS_DCC_ACCESSORY_DECODER);
delay(5);
}
 

Es wird doch immer wieder in schneller Folge dasselbe ausgegeben. Insbesondere bei 9600 Baud bremst Du da den loop auch extrem aus, und dcc.process() wird nicht mehr häufig genug aufgerufen. Selbst das delay(5) ist eigentlich schon zu viel, denn da bist Du schon in der Größenordnung der Zeit, die ein DCC-Telegramm braucht. Und damit keine verloren gehen, muss dcc.process häufiger aufgerufen werden als es der Telegrammzeit entspricht


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#6 von mondmann25 , 11.11.2020 21:19

Zitat

was versprichst Du dir von den Ausgaben im loop():

1
2
3
4
5
6
7
8
 
void loop() {
Dcc.process(); // Hier werden die empfangenen Telegramme analysiert

Serial.println(MAN_ID_DIY );
Serial.println(FLAGS_OUTPUT_ADDRESS_MODE);
Serial.println(FLAGS_DCC_ACCESSORY_DECODER);
delay(5);
}
 

Es wird doch immer wieder in schneller Folge dasselbe ausgegeben. Insbesondere bei 9600 Baud bremst Du da den loop auch extrem aus, und dcc.process() wird nicht mehr häufig genug aufgerufen. Selbst das delay(5) ist eigentlich schon zu viel, denn da bist Du schon in der Größenordnung der Zeit, die ein DCC-Telegramm braucht. Und damit keine verloren gehen, muss dcc.process häufiger aufgerufen werden als es der Telegrammzeit entspricht




Ich wollte nur wissen ob überhaupt ein DCC Signal ankommt. Habe dann den DCC Monitor für Arduino gefunden. Damit konnte ich es testen.

Aber mein eigentliches Ziel ist es mit einen Nano und einen NANO I/O IO Expansion Sensor Schild bis zu 16 Servos anzusteuern.
Danke schon mal für eure Hilfe.


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#7 von MicroBahner , 11.11.2020 21:36

Zitat

Ich wollte nur wissen ob überhaupt ein DCC Signal ankommt.

Mit den Print-Befehlen im loop kannst Du das aber nicht feststellen. Wenn Du eine andere Lösung gefunden hast ist ja alles gut.

Zitat

Aber mein eigentliches Ziel ist es mit einen Nano und einen NANO I/O IO Expansion Sensor Schild bis zu 16 Servos anzusteuern.

Hast Du dir schonmal meinen DCC-Zubehördecoder angeschaut?


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#8 von mondmann25 , 12.11.2020 19:45

Hallo Franz-Peter,

den DCC Zubehördecoder habe ich mir angeschaut. Kann ich mit den bis zu 16 Servos mit einen Nano ansteuern?
Müsste man wahrscheinlich anpassen.
Also ich muss sagen das ich mit der Programmiersprache noch nicht so ganz durchsteigen aber vielleicht wird es ja irgendwann besser.
Beste Grüße Martin


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#9 von MicroBahner , 13.11.2020 17:59

Hallo Martin,

Zitat

Müsste man wahrscheinlich anpassen.

Dazu musst Du nur die Konfig-Datei anpassen. Am Code musst Du nichts ändern.


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#10 von mondmann25 , 11.01.2021 17:19

Hallo ich habe jetzt den Arduinobasierter DIY Zubehördecoder 6.2 am testen.
Leider bewegen sich die Servos immer in eine Endlage und dann gleich wieder zurück in die Mittelstellung.
Was mache ich falsch?



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 

#define STATICRISE (250/50 << 4) // Softled riseTime = 250
#define COILMOD NOPOSCHK|CAUTOOFF
#define SERVOMOD SAUTOOFF|NOPOSCHK|SDIRECT
#define STATICMOD CAUTOOFF|BLKSOFT|BLKSTRT|STATICRISE // Wechselblinker mit beiden Leds an beim Start
const byte iniTyp[] = { FSERVO, FSERVO, FSERVO };
const byte out1Pins[] = { 3, 4, 5 }; // output-pins der Funktionen
const byte out2Pins[] = { NC, NC, /*gn*/NC };
const byte out3Pins[] = { NC, NC, /*ge*/ NC };

const byte iniFmode[] = {SERVOMOD, SERVOMOD, SERVOMOD };
const byte iniPar1[] = { 30, 30, 30 }; //Endlage Servo
const byte iniPar2[] = { 150, 150, 150 };// Endlage Servo
const byte iniPar3[] = { 8, 8, }; //Geschwindigkeit bei Servos
const byte iniPar4[] = { 0, 0, 0 }; // nur für Lichtsignale!
//------------------------------------------------------------------------------------
 


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#11 von MicroBahner , 11.01.2021 21:55

Hast Du die Einstellungen per Encoder aktiviert, und wie ist da der Tastereingang beschaltet? In die Mittelstellung fährt er eigentlich nur, wenn Der Taster am Encoder gedrückt wird.


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#12 von mondmann25 , 12.01.2021 17:16

Hallo Franz-Peter,
ich habe keinen Drehencoder dran und das define auskommentiert siehe Code.
Oder braucht man unbedingt einen Encoder?
Welche Encoder verwendest Du?
Die Encoder (KY-040 360 Degrees Dreh-Encoder) die ich habe haben keinen Taster dran.

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
 
//#define ENCODER_DOUBLE  // Eigenschaften des Drehencoders (Impulse per Raststellung)
 

// vom Anwender änderbare Parameter um den Zubehördecoder an die verwendete HW anzupassen
 
// Beispiel für Variante mit Licht-Ausfahrsignal mit Vorsignal, mit Betriebsmode Led an Pin 13 (interne Led)
// für Arduino Nano
 
//----------------------------------------------------------------
// Hardwareabhängige Konstante ( nicht per CV änderbar)
//----------------------------------------------------------------
// Eingänge analog: ( Bei Nano und Mini - Versionen kann hier auch A7 und A6 verwendet werden, um mehr
// digital nutzbare Ports freizubekommen.
// beim UNO sind A7+A6 nicht vorhanden! )
//#define FIXMODE NORMALMODE // Ist dieses define aktiv, wird der Betriebsmode fest gesetzt, betrModeP wird dann
// nicht gelesen und ignoriert. Mögliche Werte:
// NORMALMODE, POMMODE, INIMODE, ADDRMODE
const byte betrModeP = A5; // Analogeingang zur Bestimmung des Betriebsmodus. Wird nur beim
// Programmstart eingelesen!
const byte resModeP = A4; // Rücksetzen CV-Werte + Mittelstellung Servos
 
// Eingänge digital (die Ports A0-A5 lassen sich auch digital verwenden): ---------
 
// Drehencoder zur Servojustierung ...........
//#define ENCODER_AKTIV // Wird diese Zeile auskommentiert, wird der Encoder nicht verwendet.
// Die Encoder-Ports werden dann ignoriert, und können anderweitig
// verwendet werden.
const byte encode1P = A3; // Eingang Drehencoder zur Justierung.
const byte encode2P = A2;
// ............................................
//-------------------------------------------------------------------------------------------------------
// Betriebswerte ( per CV änderbar ) Diese Daten werden nur im Initiierungsmodus in die CV's geschrieben.
// Der Initiierungsmodus lässt sich per Mode-Eingang aktivieren oder er ist automatisch aktiv, wenn keine
// sinnvollen Werte im CV47 stehen.
//-------------------------------------------------------------------------------------------------------
const int DccAddr = 6; // DCC-Decoderadresse
const byte iniMode = 0x50 | AUTOADDR /*| ROCOADDR*/; // default-Betriebsmodus ( CV47 )
const int PomAddr = 50; // Adresse für die Pom-Programmierung ( CV48/49 )
// mit LocoNet-Schnittstelle ist dies die LocoNetId
#define NOACK // Diese Zeile aktivieren, wenn keine HW zum CV auslesen vorhanden ist
// ( kein Ack-Pin ) Der in Interfac.h definierte Pin wird dann zwar als OUTPUT
// gesetzt, kann aber für beliebige Funktionen in der Tabelle unten genutzt werden
 

// Ausgänge: mit NC gekennzeichnete Ausgänge werden keinem Port zugeordnet. Damit können Ports gespart werden,
// z.B. wenn bei einem Servo kein Polarisierungsrelais benötigt wird
const byte modePin = 13; // Anzeige Betriebszustand (Normal/Programmierung) (Led)
 
#define STATICRISE (250/50 << 4) // Softled riseTime = 250
#define COILMOD NOPOSCHK|CAUTOOFF
#define SERVOMOD SAUTOOFF|NOPOSCHK|SDIRECT
#define STATICMOD CAUTOOFF|BLKSOFT|BLKSTRT|STATICRISE // Wechselblinker mit beiden Leds an beim Start
const byte iniTyp[] = { FSERVO, FSERVO, FSERVO };
const byte out1Pins[] = { 3, 4, 5 }; // output-pins der Funktionen
const byte out2Pins[] = { NC, NC, /*gn*/NC };
const byte out3Pins[] = { NC, NC, /*ge*/ NC };

const byte iniFmode[] = {SERVOMOD, SERVOMOD, SERVOMOD };
const byte iniPar1[] = { 30, 30, 30 }; //Endlage Servo
const byte iniPar2[] = { 150, 150, 150 };// Endlage Servo
const byte iniPar3[] = { 8, 8, }; //Geschwindigkeit bei Servos
const byte iniPar4[] = { 0, 0, 0 }; // nur für Lichtsignale!
 


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#13 von mondmann25 , 12.01.2021 17:41

Hallo Franz Peter,

ich habe den Fehler gefunden.
Ich habe die ganze Zeit in der der DCC - Zubehördecoder Micro.h die Parameter geändert.
Habe es jetzt in der DCC - Zubehördecoder.h gemacht da funktioniert es.
Müsste jetzt nur noch wissen ob ich die Encoder verwenden kann


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#14 von MicroBahner , 13.01.2021 16:16

Den KY-040 solltest Du schon verwenden können. Der Taster dient nur dazu, das Servo auf Mittelstellung zu bringen. Der muss aber nicht im Drehencoder intergriert sein, da tut's auch jeder beliebige andere Taster ( Wenn man die Funktion überhaupt braucht ).

Zitat

Ich habe die ganze Zeit in der der DCC - Zubehördecoder Micro.h die Parameter geändert.
Habe es jetzt in der DCC - Zubehördecoder.h gemacht da funktioniert es.

Hab ich mir für die neue Version 7 zu Herzen genommen. Die gibt jetzt beim Kompilieren aus, welche Konfig-Datei verwendet wrid .


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#15 von mondmann25 , 05.02.2021 20:08

Hallo
ich habe jetzt schon 2 Nanos im Einsatz die die Servos steuern.
Das funktioniert Super. Danke an Franz-Peter.

Ich habe nun versucht eine Relaisplatine anzusteuern.
Habe die Tabelle wie unten geschrieben.
Leider schaltet nichts. Das erste Relais zieht auch sofort an es sollte aber denke ich "AUS" sein.
Habe ich die Tabelle so richtig geschrieben oder doch falsch?

1
2
3
4
5
6
7
8
9
10
 
const byte iniTyp[]     =   {    FSTATIC };
const byte out1Pins[] = { 3 }; // output-pins der Funktionen
const byte out2Pins[] = { 0 };
const byte out3Pins[] = { NC };

const byte iniFmode[] = { 0 };
const byte iniPar1[] = { 0 };
const byte iniPar2[] = { 0 };
const byte iniPar3[] = { 0 };
const byte iniPar4[] = { 0 }; // nur für Lichtsignale und AUTOBACK- Servos!
 


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#16 von mondmann25 , 06.02.2021 11:04

Ich habe es nach etlichen Versuchen hin bekommen.
Die Tabelle stimmte soweit, es lang an den Einstellungen in Rocrail.
Super das es funktioniert.


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#17 von MicroBahner , 06.02.2021 14:02

Hallo,
fein dass Du das Problem gefunden hast.
Aber auf einem UNO/Nano/Mega solltest Du Pin 0 nicht benutzen:

1
2
 
const byte out2Pins[]   =   {       0			 };
 
 

Die Pins 0 und 1 werden auf diesen Arduinos für die Schnittstelle zum PC genutzt. Da bekommst Du evtl. Probleme beim Hochladen, oder wenn Du die serielle Schnittstelle nutzen willst. Kann gutgehen, muss aber nicht.


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


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


RE: Hilfe zu Mobatools Servo ansteuern Dcc

#18 von mondmann25 , 07.02.2021 16:00

Ja klaro das muss natürlich NC sein


mondmann25  
mondmann25
Regionalbahn (RB)
Beiträge: 29
Registriert am: 28.01.2012
Ort: bei Apolda
Spurweite H0
Stromart DC, Analog


   

Anschluss und Wechselstrom Trafo 16-18V gesucht für IEK SIG DEC HOBBY

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