Zitat von Holger_s im Beitrag #621Eine Frage zu dem servo Beispiel 02 Wie bekomme ich es hin das beim betätigen des Taster 1 erst eine bestimmte Zeit vergeht bis sich die servos drehen?
Hallo Holger, ich habe das Beispiel servo02 mal entsprechend umgeschrieben. Dabei für die Taster und die Zeit auch die entsprechenden MobaTools Klassen genutzt. Die Serial.print sind nur drin, damit besser sieht, was passiert:
#include <MobaTools.h> /* Demo to move a servo slowly * Demo mit verzögerter Bewegungsauslösung */
// The pushbuttons must be connected in such a way that the input goes LOW (=0) // when the pushbutton is pressed. const byte buttonPins[] = {2,3}; //Taster an Pin 2 und 3 const int servoPin = 9; // Connection for the servo MoToServo myServo; MoToButtons myButtons( buttonPins, 2, 25, 500 ); MoToTimer servoDelay; const int delayTime = 2000;
void setup() { Serial.begin (9600); myServo.attach(servoPin); //servo at pin 9 myServo.setSpeed( 5 ); // set servo speed }
void loop() { myButtons.processButtons();
if ( myButtons.pressed(0) ) { // Taster an Pin2 wurde gedrückt, Verzögerungszeit starten Serial.println("Taster1 gedrückt"); servoDelay.setTime( delayTime ); }
if ( servoDelay.expired() ) { // Verzögerungszeit abgelaufen, Servobewegung starten Serial.println("Zeit abgelaufen"); myServo.write(40); // will turn slowly }
if ( myButtons.pressed(1) ) { // Rückbewegung sofort starten Serial.println("Taster 2 gedrückt"); myServo.write(120); // will turn slowly }
}
Vielleicht hilft dir das ja schon etwas. Ansonsten einfach fragen ;)
Was das Entprellen angeht, braucht man die MoToButtons da natürlich nicht. Aber die bieten ja auch noch mehr, z.B. die Flankenerkennung, die hier genutzt wird. Aber klar kann man das auch alles selbst programmieren.
ich habe ein Zugschlußlaterne mit einer LED und Widerstand ausgestattet. So kann die LED an einen Arduino-Ausgang angeschlossen werden. Nun suche ich einen Arduino Sketch bzw. Progtrammcode, der die LED leicht flackern lässt. Das Flackern müsste man mit Parametern im Sketch einstellen können.
Kann man das mit den MobaTools V2.4.0 realisieren und wie?
Zitat von spurxfan im Beitrag #630Kann man das mit den MobaTools V2.4.0 realisieren und wie?
Ich fürchte da werden Dir die MobaTools nicht helfen. 'Flackern' von Led's ist da nicht vorgesehen, nur das 'weiche' ein und ausschalten für die SImulation einer Glühbirne. Aber das ist ja nicht das, was Du suchst. Wenn ich mich recht erinnere, gab's sowas hier aber schonmal - beim 'belebten Haus' ( für's Fernsehen) oder als 'Schweißlicht'. Ist aber schon länger her - da müsstest Du mal nach suchen.
vielen Dank für die Tipps. Die Sketche belebtes Haus und Schweisslicht sind mir bekannt. Da werden mehrere LED ein- und ausgeschaltet, aber erfüllen nicht den Zweck einer leicht flackernd Petroleumlampe.
Hallo Franz-Peter und alle anderen Arduino Spezialisten Zuerst mal Dank an Franz-Peter für die Arbeit die Du in das Projekt gesteckt hast. Und nun zu meinem Problem: Ich bin an meiner neuen Anlage nun am werkeln die Weichen mit Servos per DCC zu schalten. Dafür verwende ich Nanos auf Servoshields Bild entfernt (keine Rechte) zur externen Stromversorgung. An jedem Arduino hängen nur 4-5 Servos ohne Relais oder sonstiges. Die Platinen zum auswerten des DCC Signals habe ich mir nach deinem Schaltplan auf Lochraster Platinen zusammen gebastelt. Die Endlagen ermittle ich durch ausprobieren und schreibe diese direkt in den Sketch weil ich das mit POM Programmierung nicht ans Laufen bekomme. Da die DCC Platinen direkt neben den Arduinos in Weichennähe schon an der Ringleitung hängen kann ich nicht ans Programmiergleis. Die Varianten mit Encoder und Taster hab ich nicht probiert, da ich es schlicht und einfach nicht verstanden hab. Mit dem Einstellen der Endlagen komme ich so gut zurecht, ist zwar etwas umständlich immer wieder den Sketch neu zu senden, aber mit Laptop und USB Kabel für mich kein Problem. Mein Problem liegt darin dass die Arduinos immer bei einem oder manchmal zwei Motoren nach dem Stromlos machen der Anlage (sprich neuem Hochfahren) andere Positionen haben. Dann sind beide Endlagen gemeinsam um einige Grad in + oder - verschoben, Der Servo drückt dann in einer Richtung voll gegen die Mechanik und in der anderen Richtung fehlt der halbe Weg. Manchmal stimmt es nach erneutem Abschalten wieder, meist muss ich aber die Endlagen Werte um einiges verändern. Und dann kann es passieren dass es bein nächsten oder übernächsten booten wieder nicht stimmt und ich die vorhergehenden Werte wieder rein schreiben muss.
Bin mit meinem Latein am Ende, mach damit schon die ganze Woche herum. Der Fehler muss doch irgendwo anders liegen. Was mach ich falsch?
Als Ursprung habe ich den Sketch DCC_Zubehoerdecoder.ino (im Anhang) verwendet. Version mit mehreren Tabs: DCC_Zubehoerdecoder / DCC_Zubehoerdecoder-Micro.h / DCC_...-STM32.h / DCC_...-h / Interface.h
INO & H Dateien nicht erlaubt. Ah, das lässt sich aus der IDE für Forum kopieren, funktioniert auch nicht, zu viele Zeichen. Dann halt jeden Tab als txt anhängen. Vernutlich stelle ich jetzt hier mehr ein als Du benötigst um meinen Fehler zu finden.
[gruen] Änderungen habe ich nur im 4. & 5. Tab vorgenommen. Hab eigentlich nur nicht viel verändert. DCC Pins geändert; Adresse; Servo Konfiguration.
Danke Franz-Peter für die Hinweise. Den separaten Decoder Thread kannte ich überhaupt nicht. Dass es da schon eine Version 7 gibt ist total an mir vorbei gegangen. Ich ging immer davon aus dass die Liste hier im Startbeitrag aktuell ist. Ich befürchte ich arbeite mit der Version V2Beta oder noch älter die eben hier im Startbeitrag mit aufgelistet sind. War das vielleicht mal ein Downloadlink? Ich meine ich hab das ganze vor einigen Jahren hier im Thread runter geladen, kann die Herkunft aber nicht mehr nachvollziehen. An A6 & 7 ist nichts angeschlossen. Ich werde mir nun erstmal die aktuelle Version holen und nochmal von vorne anfangen. Wenn es dann nicht klappt kann ich mich im richtigen Thread ja nochmal melden.
PS: Hab mir das ganze nochmal angesehen, wie es scheint ist das die Version5 was ich da nutze.
Zitat von Majestix im Beitrag #636An A6 & 7 ist nichts angeschlossen.
Das ist auf jeden Fall problematisch, denn dann ist unbestimmt, wie sich der Sketch beim Hochlauf verhält. Das ist auch bei der aktuellen Version so. Allerdings kann man da auch ein Standardverhalten festlegen, dass dann von den Eingängen unabhängig ist:
1 2 3 4
// #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
Das im Eingangspost noch Links auf die allerersten DCC-Decoder Versionen stehen, war mit gar nicht mehr bewusst . Da sollte ich wohl auch mal auf den DCC-Decoder Thread hinweisen. Edit: Ist inzwischen gemacht
bin gerade dabei eine Schrankensteuerung mit deiner „ MoBa Tools Schrittmotor Steuerung“ zu realisieren. Zur Sicherheit habe ich eine zweite Lichtschranke eingebaut, um sicher zu gehen, dass wenn aus irgendeinem Grund der Schrittmotor in die falsche Richtung fährt, über Interrupt der Schrittmotor stoppt. Jetzt habe ich festgestellt, dass wenn nach dem Stromeinschalten der Schrittmotor seinen Nullpunkt sucht, ist in dieser Zeit kein Interrupt möglich. Wenn ja, wie kann ich das abändern?
Zitat von BJS-1952 im Beitrag #638Jetzt habe ich festgestellt, dass wenn nach dem Stromeinschalten der Schrittmotor seinen Nullpunkt sucht, ist in dieser Zeit kein Interrupt möglich. Wenn ja, wie kann ich das abändern?
Ohne deine Sketch zu kennen umd mehr von deinem Aufbau zu wissem, kann man da gar nichts sagen. Normalerweise funktionierem Imterrupts immer - es sei denn man schaltet sie explizit ab
Schrankenmotor1.attach ( 8, 9, 10, 11 ); // Nr. der Pins für den Verschubmotor pinMode( TasterNullposition, INPUT_PULLUP ); // Endschalter schaltet nach Gnd pinMode( TasterAuf, INPUT_PULLUP ); // TasterAuf Pin 7 schaltet nach Gnd pinMode( TasterZu, INPUT_PULLUP ); // TasterZu Pin 6 schaltet nach Gnd
Schrankenmotor1.setSpeed(10); // Setzen der Geschwindigkeit in rpm*10 // (500) Schrankenmotor1.setRampLen(10); // Setzen der Rampenlänge // (20) Schrankenmotor1.rotate(-1); // Rotieren, bis Endschalter erreicht ( -1 = linksherum ) while ( !digitalRead(TasterNullposition) ) {} Schrankenmotor1.rotate(0); // Motor stoppen while ( Schrankenmotor1.moving() ) {}; // warten, bis Motor steht
Schrankenmotor1.setSpeed(10); // Setzen der Geeschwindigkeit in rpm*10 (20) Schrankenmotor1.setRampLen(0); // Schrankenmotor1.rotate(-1); // Rotieren, bis Endschalter frei (1) while ( digitalRead(TasterNullposition) ) {}; Schrankenmotor1.stop(); // Motor stoppen Schrankenmotor1.rotate(0); // Schrankenmotor1.setZero(); // Nullpunkt setzen delay(100);
Schrankenmotor1.writeSteps(20); // zurück zum Punkt, while ( Schrankenmotor1.moving() ); // Warten bis Stepper unten angekommen ist Schrankenmotor1.stop(); // Motor stoppen delay(100);
// Interrupt Not Stop attachInterrupt(1, NotStop, CHANGE); // Interrupt INT1 Pin 3 Not Stop
} void loop() { delay(100);
Schrankenmotor1.setSpeed(20); //Geschwindigkeit in RPM*10 Schrankenmotor1.setRampLen( 20 ); // Sanftes Anfahren und Anhalten (100)
// Taster Auf if ( digitalRead( TasterAuf ) == LOW ) // Bei Verwendung mit PULLUP, sonst auf == HIGH prüfen { Schrankenmotor1.writeSteps(1024); while ( Schrankenmotor1.moving() ); // Warten bis Stepper angekommen ist Schrankenmotor1.stop(); // Motor stoppen delay(100); Schrankenmotor1.writeSteps(1000); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100); Schrankenmotor1.writeSteps(1024); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100); Schrankenmotor1.writeSteps(1012); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100); Schrankenmotor1.writeSteps(1024); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100);
} // Taster Zu if ( digitalRead( TasterZu ) == LOW ) // Bei Verwendung mit PULLUP, sonst auf == HIGH prüfen { Schrankenmotor1.writeSteps(20); // zurück zum Punkt, while ( Schrankenmotor1.moving() ); // Warten bis Stepper unten angekommen ist Schrankenmotor1.stop(); // Motor stoppen delay(100); Schrankenmotor1.writeSteps(40); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100); Schrankenmotor1.writeSteps(20); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100); Schrankenmotor1.writeSteps(25); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100); Schrankenmotor1.writeSteps(20); while ( Schrankenmotor1.moving() ); // Schrankenmotor1.stop(); // delay(100);
da ich kein Arduino Spezialist bin und nur mit deiner MoBa Tools Bewegungen auf meiner Modellbahnanlage steuere, können solche Leichtsinnsfehler vorkommen. Jetzt funktioniert es so wie ich es mir vorgestellt habe. Danke für deinen Tipp.
Ich habe seit kurzem eine Arduino NANO Alternative in Gebrauch für die Realisierung einfacher Sketches. Ein Laden von Sketches, die die Moba Tools enthalten, funktioniert nicht, da dieses Board nicht unterstützt wird. Mit ist bekannt, dass dieses Board einen kleineren Speicher hat. Kann man dieses Board dennoch für die Moba Tools nutzbar machen ?
Zitat von Spurnullspezi im Beitrag #644Ich habe seit kurzem eine Arduino NANO Alternative in Gebrauch für die Realisierung einfacher Sketches.
Das kommt sehr darauf an, was das für ein Board ist, und ob Du einen speziellen Core dafür benötigst. Leider werden unter dem Begriff 'NANO' die unterschiedlichsten Boards mit zu Teil auch sehr unterschiedlichen Prozessoren vermarktet. Einheitlich ist dabei in der Regel nur das Format des Boards. Du müsstest also schon genauer sagen, was das für ein Board ist. Am besten einen Link zu der Beschreibung. Da die MobaTools recht intensiv die spezielle HW der unterstützten Boards nutzen, braucht's für jeden neuen Prozessor eine angepasste Variante. Derzeit steht der Nano Every ( schon länger - mir fehlt derzeit einfach die Zeit ) auf der ToDo Liste.
Hallo Christian, welchen Core verwendest Du denn für das Board? Der Prozessor hat zwar etwas weniger Peripherie als der Nano V3, aber eigentlich sollte es für die MobaTools reichen. Ich kann es zwar nicht testen, da ich kein Board mit dem Prozessor habe, aber kompilieren tut's bei mir. Da beschwert er sich nicht, dass der Prozessor nicht unterstützt wird. Ich verwende den ATTinyCore. Viel wird man damit aber nicht realisieren können. Insbesondere die 512 Byte RAM sind schon sehr knapp. Da lohnt sich aus meiner Sicht die relativ geringe Ersparnis beim Preis nicht. Ausserdem ist der Prozessor lt. dem verlinkten Datenblatt für die 16MHz gar nicht spezifiziert - lt. Datenblatt geht der nur bis 12MHz, wird auf dem Board also ausserhalb der Spezifikaiton betrieben.
Ich habe beides installiert. "einfache" Sketches laufen damit ohne Probleme. Möchte ich z.B. den arduinobasieteren DIY laden, folgt eine Fehlermeldung: MobaTools sind für das Board nicht zugelassen. Es wird AVR, ESP32 und STN.. genannt.
Das zur Info. Dr MH-Tiny hat nätürlich nicht die Eigenschaften des NANO mit AT328 Prozessor. Schon ein NANO mit AT168 Prozessor ist für den DCC Dekoder grenzwertig und wird von mir nur noch für das Tasteninterface verwendet. Und da ist halt die Frage, ob der MH-Tiny für diesen Zweck geeignet wäre.
Wenn es dann doch zuviel Aufwand bedeutet, ist die klare Erkenntnis: DCC-Weichendekoder nur mit den 3 genannt unterstützten Bordverwaltern.
Hallo Christian, ich habe mir den von dir verlinkten Core mal in einer portablen Version der IDE 1.8.19 installiert. Die erste Meldung die mich da bei der Installation stutzig machte:
ZitatWarning: non trusted contribution, skipping script execution (D:\ProgNoInstall\arduino-1.8.19-local\portable\packages\mhetlive\tools\micronucleus\2.0a4\post_install.bat)
Ok, auf der Webseite wird ja nur 1.6.X als unterstützt angegeben ( was aber schon ziemlich alt ist ). Versuche ich den DIY-Decoder zu compilieren, bekomme ich Fehlermeldungen, die darauf hindeute, dass nur ein abgespeckter C/C++ Compiler benutzt wird ( z.B. kennt er 'constexpr' nicht ). Vielleicht liegt es auch daran, dass die Installation nicht komplett gelaufen ist. Das lohnt sich aus meiner Sicht nicht, da mehr Zeit reinzustecken. Die MobaTools werden auf dem Board mit dem zugehörigen Core nicht laufen.
Zitat von MicroBahner im Beitrag #11Dazu braucht man natürlich auch noch die DCC Library, die ihr hier herunterladen könnt und die Schaltung, um das DCC-Signal an den Arduino zu bringen:
Moin,
ich hoffe, ich darf mal eine Frage zu der Schaltung stellen, analoge Elektronik ist ein wenig Raketentechnik für mich. Ich wollte die Schaltung nehmen für meine Decoder, habe jetzt aber vergessen, den Kondensator zu bestellen. Braucht man den überhaupt, die meisten anderen Schaltungen kommen ohne aus? Ansonsten habe ich welche mit 100 pF rumliegen, würden die gehen?