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
// Demo: ein ganz einfacher Dcc-Servodecoder // //------------------------------------------ // // die NmraDcc - Library gibt es unter https://github.com/mrrwa/NmraDcc/archive/master.zip
} ////////////////////////////////////////////////////////////// // 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 } } }
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.
================================= Mä-M-Gleisanlage und C-Gleisanlage, Digital mit MoBaSbS und TrainController 10 H0e Module mit DR5000(YD7001) und multiMAUS und aus Altbeständen 6021, IB und MobileStation =================================
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
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.
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
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?
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.
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.
//#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)
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
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 .
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?
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.