Mutteruhr mit Arduino

Liebes Forum,

ich bin neu und noch blutiger Anfänger. :’( Ich versuche eine alte Nebenuhr wieder zum laufen zu bringen, doch haben Schwierigkeiten beim Code.
Da Nebenuhren kein eigenes Uhrwerk besitzen, sind sie auf eine zentrale Mutteruhr angewiesen. Diese gibt eine Stromimpuls und schaltet so die Zeiger.
Die Nebenuhr benötigt einen Stromimpuls von 12 Volt für ca. 2 Sekunden. Nach jedem Impuls muss sich die “Polung” ändern, also erst muss + - anliegen und beim nächsten Signal - + und immer so weiter.

Ich habe das Projekt wie folgt gelöst:
ein altes Netzteil versorgt den Arduino mit Strom liefert genug Energie um die Nebenuhr zu speisen. Ich verwende 4 Relais um den Impuls zu erzeugen. Durch die 4 Relais kann die “Polung” verändert werden (+ - → - +). Bei einem Impuls werden jeweils 2 Relais (8,9) für 2 Sekunden aktiviert. Dann passier für 58 Sekunden nichts. Beim Anbruch der nächsten Minute werden die anderen 2 Relais (10,11) wieder für 2 Sekunden aktiviert und dann soll wieder für 58 Sekunden nichts passieren.
Dieser Ablauf befindet sich in einem Loop und läuft so immer weiter (grober Ablaufplan im Anhang).
Der Zeiger soll sich also jede Minute um eine Minute bewegen.

Mein bisheriger Code sieht wie folgt aus:

void setup()

{

pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);

}


void loop()

{

digitalWrite(8, HIGH);
digitalWrite(9, HIGH);

delay(2000);

digitalWrite(8, LOW);
digitalWrite(9, LOW);

digitalWrite(10, HIGH);
digitalWrite(11, HIGH);

delay(2000);

digitalWrite(10, LOW);
digitalWrite(11, LOW);

}

Das Problem besteht hier darin, dass die Ralais für 2 Sekunden aktiv sind, jedoch dann direkt zum nächsten befehl weitergehen und nicht 58 Sekunden “pausieren”.

Ich würde mich über konstruktive Kritik oder Tips freuen!

Delays sind generell keine gute Lösung, da während dieser Zeit kein Befehl mehr vom Arduino angenommen wird Möchtest du dennoch bei denn Delays bleiben, kannst du doch eine Pause per delay von 58 Sekunden eilegen.

Edit: Mit der Genauigkeit des Arduino ist es aber nicht weit her. Um eine Uhr zu steuern, sollte eine RTC verwendet werden, die eine gute Genauigkeit liefert.

Hallo und willkommen im Forum!

Was Du mit den Relais gebaut hast, nennt sich H-Brücke und wird zur Richtungsänderung von Gleichstrommotoren verwendet. Wenn Du von Relais auf Elektronik umsteigen möchtest, wäre das möglich.

Ein delay(58000); wäre natürlich möglich, aber dann geht nicht anderes mehr. Lies doch mal Ein Automat ohne delay(), das könnte Dich weiterbringen.

Wenn Du ein Uhrenmodul verwenden möchtest, nimm bitte DS3231 (Beschreibung), DS1307 ist nicht so genau.

Arduinoxx: Ich würde mich über konstruktive Kritik oder Tips freuen!

Bevor ich Dein Posting gelesen hatte, habe ich mich gefragt, was eine Mutteruhr denn sein soll. Vielleicht eine Art von Schwangerschaftsanzeiger?! Mit drei Phasen von „ein bisschen schwanger“ über „halbschwanger“ zu „schwanger“ :-)

Wenn Du in Deinen Sketch einfach noch zwei 58 Sekunden lange delay()s einbaust, funktioniert es abgesehen von der Ganggenauigkeit wie gewünscht. IMO wäre ein endlicher Automat wie das Werfen von Atombomben auf Spatzen.

Wenn Du allerdings eine Mutter im „kleinen Schwarzen“ möchtest, mit Knöpfen zum Stellen und einem Schalter zum Umstellen von Sommer- auf Winterzeit (mehr wäre bestimmt möglich), dann ist ein endlicher Automat IMO die beste Wahl.

HTH

Gregor

Moin,

danke schonmal für die vielen Antworten! Echt eine tolle und hilfsbereite Community!! :slight_smile: :slight_smile: :slight_smile:
Ich habe mir bereits gedacht, dass sich es noch effizientere Lösungsansätze gibt, jedoch habe
ich bereits die Relais usw. gekauft und würde es gerne so probieren.

Wenn ich eine Pause in Form von delay einsetze, dann “wartete” dieses Relais-Paar zwar 58 Sekunden, jedoch wird darüberhinaus den nächste Befehl ausgeführt. in der Praxis ensteht dann ein Kurzschluss.
Mir ist absolut schleierhaft warum das mit dem Delay-Befehl nicht klappt…

Zunächst soll die Uhr so einfach wie möglich aufgebaut sein. Die Sommer bzw. Winterzeit kann ich manuell nachstellen. Trotzdem danke für den Tipp!
Stellt die Ungenauigkeit des Arduinos ein großes Problem dar ?

Um das Einstellen der Uhrzeit so genau wie möglich zu gestalten wäre eine Art “Start-Knopf” passend.
Nach dem Einschalten des Arduinos vergehen meist einige Sekunden und erst dann startet
der Code. Es wäre praktisch wenn der Code erst nach Drücken eines Schalters ausgeführt wird.
So ließe sich die Uhr auf wenige Sekunden genau stellen.
Leider habe ich keine Ahnung wie ich so etwas umsetzte.

Vielen Dank im Vorraus!!!

Arduinoxx: Stellt die Ungenauigkeit des Arduinos ein großes Problem dar ?

Kommt darauf an :-)

Wenn Dein Arduino sehr genau läuft, könnte es genügen, wenn Du nur 1 x täglich korrigierst. Über die ersten paar Stunden würde ich jedenfalls beobachten und die delay()s anpassen. Du kannst da ja ziemlich feine Korrekturen vornehmen.

Gruß

Gregor

Nachtrag: Plane beim bauen schon einmal zusätzliche Features ein oder ermögliche sie. Wenn Du z. B. eine individuelle Platine für die Mutter herstellst, solltest Du IMO den problemlosen Zugang zu den freien Pins durch entsprechende Leiterbahnen/Lötaugen/Bohrungen ermöglichen.

Nochn Nachtrag: Was den Startknopf angeht, nimm einen Taster und verbinde ihn auf der einen Seite mit einem freien Pin und auf der anderen mit GND. Dann schreibst Du in setup()

...
pinMode(startKnopfPin, INPUT_PULLUP);
while (digitalRead(startKnopfPin)==1) {}
...

Die while-Schleife wird dann nach dem Einschalten so lange ausgeführt, bis Du den Startknopf betätigst.

Arduinoxx: Wenn ich eine Pause in Form von delay einsetze, dann "wartete" dieses Relais-Paar zwar 58 Sekunden, jedoch wird darüberhinaus den nächste Befehl ausgeführt. in der Praxis ensteht dann ein Kurzschluss. Mir ist absolut schleierhaft warum das mit dem Delay-Befehl nicht klappt....

Wo hast du denn das delay(58000) eingebaut ? Im Grunde genommen benötigst du dieses 2 mal. In der Mitte und am Ende. Und wieso sollte dann ein Kurzschluss entstehen?

void loop()
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);

delay(2000);

digitalWrite(8, LOW);
digitalWrite(9, LOW);

delay58000();

digitalWrite(10, HIGH);
digitalWrite(11, HIGH);

delay(2000);

digitalWrite(10, LOW);
digitalWrite(11, LOW);

delay58000();
}

Stellt die Ungenauigkeit des Arduinos ein großes Problem dar ?

Nur wenn es dir nichts ausmacht, dass die Uhr pro Tag einige Sekunden falsch geht. Der Arduino hat in der Regel nur einen Keramikresonator als Taktgeber drauf, diese sind nicht sehr genau. Ein Quarz ist da besser.

Arduinoxx: Wenn ich eine Pause in Form von delay einsetze, dann "wartete" dieses Relais-Paar zwar 58 Sekunden, jedoch wird darüberhinaus den nächste Befehl ausgeführt. in der Praxis ensteht dann ein Kurzschluss. Mir ist absolut schleierhaft warum das mit dem Delay-Befehl nicht klappt....

Was für Relais benutzt du und wie schließt du sie an?

Ich habe das Projekt Arduino Mutteruhr bereits umgesetzt:

Dabei habe ich eine Elementare Einsteigererfahrung gemacht: Alles was auf dem Prozessortakt aufsetzt bring keine brauchbare Prazision für eine Uhr. Fertiger Code für eine Arduino Uhr hat mindestens 2-3 Sekunden Abweichung pro Stunde, da der Quartz nicht präzise schwingt.

Ein Uhrenchip DS3231 vom Chinesen für 1-2 Euro hat das Problem gelösst und die Uhr läuft auch bei ausgeschaltetem Arduino weiter.

Die Umpolung der Schaltspannung für den Minutenimpuls habe ich mit einer H-Bridge L298N gelösst. Kostet auch so was um die 2 Euro beim Chinesen.

Ein Display zeigt kontinuierlich die Uhrzeit an, so dass ich Gangungenauigkeiten erkennen kann.

Ich frage im Code die aktuelle Minutenuhrzeit ab. Der Triger für die Umschaltung ist die Abfrage Neue Minute? Wenn gerade dann else...

Hallo alle zusammen,

ich wollte gerne meine Nebenuhr mit einem L293d ansteuern. Diese soll in einem Projekt über einen Arduino und einer Software nach Musik...mal schnell-langsam laufen. Ich habe jetzt den Arduino Nano mit dem L293D verbunden so wie es diese Schaltung(gefunden im Netz) http://letsmakerobots.com/files/userpics/u2759/robotToni.png angibt. http://rn-wissen.de/wiki/index.php/Getriebemotoren_Ansteuerung#Ansteuerung_mit_Treiber_IC_L293_D

Habe Arduino Nano -L293D D11 und D12 15 und 18 die Uhrspannung +24V auf 8 (L293D)

GND von dem Netzteil der Stromversorgung +24V 13,12,4,5 +5V 16,9,1

dürfte das so gehen.Die Ansteuerung erfolgt dann über Abelton Communication Set

Würde mich über Hilfe freuen

Ist für eine Theateraufführung.

stimby: Würde mich über Hilfe freuen

Mach' besser einen neuen Thread auf, als in einen nicht mehr sonderlich aktuellen Thread zu schreiben.

Gruß

Gregor