Uhr Steuerung Polarität invertieren

Hallo zusammen,
ich möchte eine alte Uhr mit Klappanzeigen reanimieren.
Wenn ich die 2 Anschlüsse des Motors kurz an 20V Gleichstrom anschliesse, dreht sich der Motor eine halbe Umdrehung weiter, und die nächste Minute klappt um.
Danach muss ich die Polarität tauschen, um eine weitere halbe Umdrehung zu bewirken usw..
Die Stunden, Tage, Wochentage, Monate laufen mechanisch entsprechend mit.
Ich brauche also eine Schaltung, die mir jede Minute für ca. 1 Sekunde 20 Volt ausgibt und das mit abwechselnder Polarität.
("Läuft" der Arduino eigentlich so genau, dass ich das so steuern kann, sprich ist ne Stunde in Millisekunden auch exakt ne Stunde, oder läuft das dann nach einigen Tagen / Wochen auseinander?)
Die Spule am Motor hat 1Kohm, der fliessende Strom sollte also 20mA sein (???), ist mit meinem Multimeter aber nicht messbar (warum eigentlich nicht ???)...

Weiter unten 2 jpgs mit dem Steckbrett und dem dazugehörigen Schaltplan meiner Schaltungsidee.
Jetzt würde ich gerne wissen, ob meine Schaltung Sinn macht.
Die Batterie soll meine 20V Stromversorgung und das Relais meinen Motor darstellen.
Wenn D0 auf HIGH steht (D1 LOW) liegt bei dem Relais links Plus und rechts über den Widerstand Masse an.
Wenn D1auf HIGH steht (D0 LOW) liegt bei dem Relais rechts Plus und links über den Widerstand Masse an.
Wenn beide Outputs LOW sind, liegen beide Relaispole an Masse und nichts passiert.

Muss ich bei dem Motor (hier das Relais) eigentlich auch Schutzdioden integrieren ??? die müssten dann ja auch in beide Richtungen gehen, damit wäre deren Sinn dahin... ???

Oder:
gibts dafür evtl. ne viel einfachere Lösung?

Freue mich über jede Hilfe!
Beste Dank schonmal für Ratschläge!
Schöne Grüße!

Hi Tomas,

tolles Projekt!
Ich kann Dir leider nur einen Hinweis zum Thema genau genug mit auf den Weg geben: http://arduino.cc/forum/index.php/topic,50240.0.html

Gruß

Sebastian

Aus meinem Bauchgefühl heraus würde ich sagen, dass die Ansteuerung über Relais nicht optimal ist. Letztlich kann man das Umpolen ja mit einer normalen H-Brücke machen, beispielsweise mit dem günstigen L293D. Dann gibt es auch kein nerviges Klackern und die Löschdioden fürs Relais können auch entfallen.

[edit] Hast du mal ein Bild deiner Uhr zur Hand?

Hallo!
Ein Foto von dem schönen Stück gibts gerne heute Abend - bin grad in der Arbeit ...
Bezüglich des Relais hab ich mich vermutlich ungenau ausgedrückt.
Das Relais ist nur mein "Platzhalter" für die Motorspule, die Ansteuerung würde über die Transistoren laufen.
"H-Brücke - L293D" sagt mir gar nichts, aber da mach ich mich mal schlau - Danke für den Tip!

Grüße!

Natürlich kannst du dir erst mal das Datenblatt zum beschriebenen IC ansehen, sehr gut finde ich die Erklärung auf dieser Seite: Getriebemotoren Ansteuerung – RN-Wissen.de

Hallo zusammen,

da meine Uhr schon seit Monaten läuft, will ich hiermit das fertige Projekt vorstellen, evtl. hilft das ja jemandem weiter.
Manches würde ich mittlerweile, mit etwas mehr gesammelter Erfahrung vermutlich anders lösen, dennoch läuft das Ganze und das ist ja das Wichtigste.

Die Schaltung im Groben:

Stromversorgung:
Trafo sec.2x12V in Reihe also ca. 24V
gleichgerichtet und geglättet zum L293 als Schaltspannung der Uhr
und zum Spannungsregler 5V als Stromversorgung des Arduino und des L293

Arduino:
Der Arduino in Minimalkonfiguration
basiert hierauf: http://arduino.cc/en/Main/Standalone

Uhrsteuerung:
Die H-Brücke l293 gibt an die beiden Anschlüsse der Nebenuhr jede Minute einen kurzen Impuls von 24V mit wechselnder Polarität ab.
Mit dem Schalter kann man die Uhr stellen:
Kurz drücken gibt einen, gedrückt halten gibt mehrere Impulse nacheinander ab.

Das Ganze ist jetzt in einer Plastikkiste verstaut.

Zur Genauigkeit:
Als die Schaltung noch auf meinem Steckbrett aufgebaut war bin ich schier verzweifelt,
da die Uhr mal zu schnell, mal zu langsam gelaufen ist (nach ein paar Stunden war sie schon einige Minuten daneben).
Ich habe dann versucht das über die Programmierung auszugleichen, was aber nicht funktionierte.
Irgendwann war mir das egal und ich hab die Platine geäzt, gelötet und angeschlossen - und siehe da es funktioniert.
Ich muss jetzt die Uhr schon hin und wieder mal nachstellen - allerdings eher im Monatsrhythmus, was für mich akzeptabel ist.

Eine ganz gute Anleitung zum Ätzen der Platine gibt es hier:
http://www.analog-synth.de/selberaetzen/selberaetzen.htm
ich hab das im Copyshop auf Klarsichtfolie drucken lassen und dann doppelt genommen.
Belichter ist bei mir eine uralte Höhensonne.

Hier dann noch der Code:

#include <Bounce.h>
#include <Time.h>

int freigabePin = 6; // ehemals D9
int motorPin1 = 5;
int motorPin2 = 3; // ehemals D6
int knopfPin = 2;
// Instantiate a Bounce object with a 5 millisecond debounce time
Bounce bouncer = Bounce( knopfPin,5 ); 
// Motorsteuerung
int impulsdauer = 350;
int richtung = 0;
// Zeitsteuerung
long previousTime = now(); // in Sekunden
int impulsabstand = 60; // in Sekunden
long currentTime = now(); // in Sekunden


void setup() {
  //  Serial.begin(9600); // debuggingleiche
  pinMode(freigabePin,OUTPUT);
  pinMode(motorPin1,OUTPUT);
  pinMode(motorPin2,OUTPUT);
  pinMode(knopfPin,INPUT);
}

void loop() {
  UmfallenTask();
  BounceTask();
} 

// ruft nach Ablauf von "impulsabstand" -1 Sekunden (zählt ab 0) den "RepeatTask()" auf.
void UmfallenTask(){
  long currentTime = now();
  if(currentTime - previousTime > impulsabstand-1) {
    previousTime = currentTime;
    RepeatTask();
  }
}
// auf Knopfdruck wird:
// - "RepeatTask()" aufgerufen - um eine Minute weiterzustellen
// - "previousTime = currentTime" gesezt, um den Neuen Startpunkt eines Zyklus zu setzen ("MinutenNeustart")
void BounceTask(){
  bouncer.update ( );
  int value = bouncer.read();
  if ( value == HIGH) {
    RepeatTask();
    //long currentTime = now();
    previousTime = now();    
    // minutenCount=0;
    // stundenCount=0;

  } 
}

// hier wird der Uhrantriebsmotor um eine halbe Umdrehung gedreht
void RepeatTask(){
  switch(richtung){
  case 0:
    digitalWrite(freigabePin,HIGH);
    digitalWrite(motorPin1,HIGH);
    digitalWrite(motorPin2,LOW);
    delay(impulsdauer);
    digitalWrite(freigabePin,LOW);
    richtung=1;
    break;
  case 1:
    digitalWrite(freigabePin,HIGH);
    digitalWrite(motorPin1,LOW);
    digitalWrite(motorPin2,HIGH);
    delay(impulsdauer);
    digitalWrite(freigabePin,LOW);
    richtung=0;
    break;
  } 
}

Und hier ein Paar Fotos und das Fritzing Projekt:

fritzing.rar (67.4 KB)