Projekt: Sonnenaufgangswecker

Grüßt euch und willkommen beim nächsten Weckerprojekt.
Das ist nach einem klassischen 3x3x3 LED Würfel mein erstes wirkliches Arduinoprojekt und ich werkle jetzt seit etwa einem Jahr daran herum. Alles hat mit einem 20x2 VFD Display von Ebay begonnen (Samsung 20L201DA3). Drumherum sollte ein Wecker entstehen, mit folgenden Eigenschaften:

-Funkgesteuerter Zeitempfang
-Plexiglasgehäuse
-Sonnenaufgangssimulation durch interne LED (3x Cree XP-G R4, insg. max 1000 Lumen)
-Weckton durch eine Klangschale die mittels Zugmagnet angeschlagen wird
-Bedienung durch einen einzigen Drehencoder mit Taster

Das Gehäuse ist inzwischen fast fertig, die Hardware läuft auch soweit. Was noch fehlt ist die Klangschale inkl. Schlagmechanismus. Leider stört das VFD den Empfang des Zeitsignals komplett, so dass ich es per Mosfet kurzzeitig abschaltbar machen musste. Mit diesem wird dann ein DS1307 gestellt, der im Normalbetrieb die Zeit liefert. Die letzten Tage habe ich mit Eagle verbracht, um die Schaltung demnächst auch ätzen zu können. Herausgekommen ist dabei dieser Schaltplan:

Für jeden Hinweis auf Fehler und Unklarheiten in dem Plan wäre ich mehr als dankbar, möchte ungern Platinen verschwenden. Hier noch zwei Bilder vom aktuellen Stand des Gehäuses und des Displays:

Besten Dank bereits an dieser Stelle, werde mich in den kommenden Tagen auch in Sachen Code noch an euch wenden.

Der Schaltplan sagt nicht alles. Wenn Du Deine Platine beurteilt haben willst solltest Du vieleicht besser gleich die vollständigen Eagle Files einstellen.

Was mir auffällt: Dein Controller läuft mit 16 MHz. Wenn die Zeit eh per RTC / DCF77 erfasst wird kannst Du eigentlich auch mit internem 8MHz Oszillator arbeiten --> 3 Teile gespart.

Weiterhin könnte man auch auf die Idee kommen den RTC per Kondensator zu puffern und damit die Batterie überflüssig zu machen.

Weiterhin würde ich VCC analog mit VCC verbinden. Damit könntest Du ggf. die Betriebsspannung zur Laufzeit überwachen. Brauchst Du mit Wahrscheinlichkeit 99% nicht, schadet aber auch nicht.

Falls Du eine induktive Last schalten willst ist eine Freilaufdiode bei den Transitoren vieleicht nicht schlecht.

Was Deine Transistoren angeht: was willst Du denn damit schalten? Sind Deine Leiterbahnen für den Strom ausgelegt oder sollen die als Sicherung fungieren :wink:

Besten Dank, das bringt mich schon viel weiter.
Hab die Schaltung mal auf 8Mhz Betrieb gekürzt und VCC analog mit VCC verbunden. Außerdem sind die Drain-Anschlüsse der Mosfets jetzt mit 1mm Leiterbahnen an die Anschlussklemme geführt. Eine Freilaufdiode ist vorgesehen, die will ich aber direkt an der Magnetspule verbauen, um nicht noch die von dieser benötigten 12V auf die Platine führen zu müssen. Die Batterielösung bevorzuge ich gegenüber einem Kondensator aus dem einfachen Grund, dass ich schon Batterien und Halter hier habe. Weiter finde ich es ganz nett, den Wecker auch mal eine ganze Weile abgesteckt lagern bzw. transportieren zu können und sofort wieder die passende Zeit zu haben.

Habe mal die .sch und .brd Dateien angehängt, hoffe das reicht um nachzuvollziehen was ich meine.

alarm-8mhz.brd (30.4 KB)

alarm-8mhz.sch (89.9 KB)

Was in den Dateien noch auffällt:

  • N$18 und N$16 sind unnötig eng zusammen. Wenn Du die Platine ätzen lässt kein Problem, wenn Du sie selber machst kommt es darauf an wie gut Du den Prozess unter Kontrolle hast.

  • Die Batterie kann man auch platzsparender platzieren

  • Du hast keine Montagelöcher vorgesehen

  • Du machst scharfe Knicke und Abzweigungen und 10er Leiterbahnen. Solange Du so viel Platz hast kannst Du doch auch 16er nehmen. Das gibt mehr Spielraum für Schwächen in der Produktion. Man geht nicht ohne Not auf dünne Leiterbahnen. Ja, 10er ist heute kein Problem mehr. Wenn Du selber ätzt kannst Du Dir aber in Eagle auch mehr Spielraum designen.

  • N$18 und n$16 führen zu Kurzschlüssen --> lass mal ERC und DRC laufen

  • C1 ist als Stützkondensator zu weit weg von beiden Chips, ansonsten ist er nutzlos
    --> Du brauchst 3 Kondensatoren und diese müssen so nahe wie nur möglich an die Chips dran. Oder Du kannst sie gleich weglassen. Die korrekte Vorgehensweise ist jeden digitalen IC mit einem ~100nF Kondensator NAHE an VCC/GND zu stützen.

  • Du hast unheimlich viel Platz und machst dann trotzdem sehr kleine Vias, warum?

Mir ist gerade noch aufgefallen, daß beim Verschieben der ICs Kreise stehen bleiben. Für was soll das gut sein?

Hm, alles sehr gute Punkte, werde mich nochmal dransetzen und deine Hinweise einarbeiten. Bisher ist das Board hauptsächlich ein Produkt des Autorouters und dessen Standardeinstellungen. Ich will die Platine selbst ätzen und gehe nicht davon aus, da zunächst irgendwas unter Kontrolle zu haben. Die Kreise unter den ICs kommen vom Script "drill-aid", das die Mittelpunkte der Pads fürs spätere Bohren markiert. Spielerei meinerseits.

The DS32kHz is a temperature-compensated crystal oscillator (TCXO) with an output frequency of 32.768kHz. This device addresses applications requiring better timekeeping accuracy, and can be used to drive the X1 input of most Dallas Semiconductor real-time clocks (RTCs), chipsets, and other ICs containing RTCs. This device is available in commercial (DS32kHz) and industrial (DS32kHz-N) temperature versions.

Und der DS 1307 braucht die gar nicht. Beide ICs haben nix mit 'ner Funk-Uhr ( DCF 77 ) zu tuen.

Das sind RTC's ( Real Time Clock ) 's. !!! i.E. Echtzeit-Uhren. Aber niemals "Funk-Uhren" !

RTCs sind schon viel besser als Timer-programmierte Uhren, weil sie unabhängig vom Controller laufen, und die Temperatur-Abhängigkeit wurde vermindert.
Aber zum DCF 77 - gehört auch ein Empfänger + Decoder.

MfG

Orang hat nicht die ganze Schaltung offengelegt. So wie er das geschrieben hat will er per DCF77 die RTC einstellen. Davon abgesehen: wer schon den Schlaumeier raushängt macht sich voher hier schlau: http://www.apostrophitis.de/

Mir ging es hier vor allem um die Platine und ein brauchbares Layout zum anschließenden Ätzen. Wie Udo schon geschrieben hat, ist in meinem ersten Post nicht die ganze Schaltung zu sehen, da einiges extern über die Anschlussklemme angebunden wird.
Mein DCF77 Empfänger von Conrad hängt an Analogpin 1. Über diesen wird das Zeitsignal empfangen, der RTC Chip gestellt und im Anschluss daran das VFD Display über einen der beiden Mosfets eingeschaltet. Ich kann nicht durchgehend die Zeit per Funk empfangen, da das Display den Empfang komplett stört. Mit der Kombination aus temperaturstabilisiertem Quarz und DS1307, bleibt die Abweichung in der Zwischenzeit auf einem für mich sehr vertretbaren Niveau. Vertretbar in dem Sinne, dass ich einfach Freude an möglichst genau laufenden Uhren habe. :wink:
Wo ich schon dabei bin, kann ich ja noch schnell aufklären was noch wo angeschlossen ist:

  • Analog 1: DCF77 Empfänger
  • Digital 1: VFD
  • Digital 4: Encodertaster
  • Digital 6: LED
  • Digital 9 und 10: Encoder
  • Digital 12: VFD-Mosfet
  • Digital 13: Elektromagnet-Mosfet

Hoffe das bringt etwas mehr Klarheit in mein Vorhaben.
Schönen Sonntag noch!

Die Apostrophenkatastrophe

Vielen Dank an Udo Klein; Jetzt kann ich mich auf den Einschlag vorbereiten: ;;;;;;;;;;;;;;;;;;;; :grin:

Aaahh; Jetzt verstehe ich auch Orang; Zumindest seine Ziele ;

@Orang: Bitte informiere hier weiter über deine Fortschritte den DS1307 mit DCF77 zu takten, oder gar zu decodieren.

Das interessiert mich sehr, arbeite ähnlich ( ohne DCF77 ), an einem ähnlichen Projekt.

MfG

So, hab mich an eine neue Version der Platine gemacht.
Statt der Klemmleiste setze ich jetzt auf 3 Buchsenleisten mit je 4 Polen, sollte für meine Zwecke reichen. Damit hat sich auch das Routing drastisch vereinfacht. Sonstige Änderungen:

  • Montagelöcher hinzugefügt
  • Leiterbahnen auf 16er Breite vergrößert
  • Kondensatoren hinzugefügt und näher an die ICs gebracht
  • Vias vergrößert

@Gurkengraeber:
Die DCF77-Dekodierung überlasse ich dieser Library. Angefangen habe ich mit einem Link aus dem Playground, der zu dieser Seite führt, dort ist ebenfalls Code und ein paar Erklärungen zu finden. Die erstgenannte Library funktioniert für meine Zwecke jedoch besser. Muss meinen Code die nächsten Tage noch etwas aufräumen, dann poste ich ihn ebenfalls hier.

alarm-8mhz-buchsen.brd (19.6 KB)

alarm-8mhz-buchsen.sch (87.4 KB)

Hallo Orang,

kann ich dich um ein paar Infos zu deinem VFD-Display bitten? Ich habe das gleiche Samsung 20L201DA3, habe aber noch Probleme das ganze mit dem Arduino zu verheiraten:

  1. So viel ich verstanden habe, benötigt das Display eine externe Spannungsquelle da I > 800mA
  2. Das Display erwartet auf RX 12V? Wie hast du das Display mit dem Arduino-Board verbunden? Das Board liefert doch nur 5V an den Outputs?
  3. Wie sendest du Daten zu Display? Kann das über die NewSoftSerial-Library erfolgen? Also eine ganze normale Serielle Verbindung mit z.B. dem Befehl Display.print("Hallo");?

Würde mich um deine Hilfe freuen.

Grüße

tarabas

Tarabas:
... kann ich dich um ein paar Infos zu deinem VFD-Display bitten? Ich habe das gleiche Samsung 20L201DA3, habe aber noch Probleme das ganze mit dem Arduino zu verheiraten:

  1. So viel ich verstanden habe, benötigt das Display eine externe Spannungsquelle da I > 800mA
  2. Das Display erwartet auf RX 12V? Wie hast du das Display mit dem Arduino-Board verbunden? Das Board liefert doch nur 5V an den Outputs?
  3. Wie sendest du Daten zu Display? Kann das über die NewSoftSerial-Library erfolgen? Also eine ganze normale Serielle Verbindung mit z.B. dem Befehl Display.print("Hallo");?
    ...

Hallo Tarabas

  1. die VFD displays brauchen viel Strom, leuchten aber dann schön selbständig. Du brauchst umbedingt eine externe Stromquelle, ein Netzteil 5V 1,5A.

  2. Die Signalpegel auf RX sind -12V und +12V ( H und L Pegel, genaugesagt zuwishen -3 und -25V für H und +3 bis 25V für L) um von 0V - 5V die aus dem Arduino kommen auf -10/+10V zu kommen gibt es zb den MAX232. Der hat einen Spannungswandler ( mit 4 Kondensatoren) und Treiber um von 0/5V auf -12/12V zu kommen und umgehehrt.
    Auf dem Bild
    links unten ist ein 14 poliges IC. Das könnte ein MAX232 oder ähnliches sein, der das RS232 Signal auf Mikroprozessortauglice 0/5V bringt. Schau dir mal das Datenblatt Deines ICs an. Wenn es wirklich ein RS232 Pegelwandler ist, dann kannst Du den Auslöten und das 0/5V signal vom Arduino direkt dort einspeisen.

  3. Senden überNewSoftSerial-Library geht gut, es gibt aber sicher einige Steuerzeichen mit denen Du zB die Cursorposition bestimmst usw. Mit der Funktion Display.print("Hallo"); bekommst Du zwar das "Hallo" drauf aber wie schreibst Du dann etwas anderes drauf?

http://www.quantelectronic.de/Sonstige-Samsung_20L201DA3_VFD_Display_2x_20_Zeichen_RS232_5VDC_i169_8486.htm

und hier findest Du viel Information: VFD - maltepöggel.de

VFD - maltepöggel.de ist zwar nicht Dein Display aber es könnte die gleichen Steuerzeichen haben.

Grüße Uwe

Ich hab auch einige Zeit mit dem Display verbracht, bis ich endlich verstanden habe was es alles zu beachten gilt:

  1. Wie schon richtig angemerkt wurde, brauchst du auf jeden Fall eine externe Spannungsversorgung die laut Datenblatt bis zu 1,2 A liefert. Ich hab meines bisher an 2 kleinen Schaltnetzteilen betrieben die auf der 5V Leitung >2 A liefern. Sofern die Stromversorgung nicht zu knapp bemessen ist scheint mir die aber recht unkritisch zu sein.

  2. Es läuft problemlos mit Signalen auf 5V, ABER die müssen invertiert werden. Also 0V = HIGH, 5V = LOW. Habe einige Zeit versucht den seriellen Output am Arduino per Software zu invertieren, hat aber nie funktioniert. Daher eine sehr simple Hardwarelösung mittels NPN Transistor und einem Pull Up Widerstand gebastelt:

Zum Upload von Sketchen muss die Schaltung aber vom Arduino getrennt werden, sonst gibt dir die IDE eine Fehlermeldung aus.

  1. Wie schon erwähnt, lässt es sich wunderbar seriell ansteuern, im angehängten Datenblatt finden sich auch etliche Steuerbefehle. Die habe ich wie folgt im Einsatz, wobei Ausgaben einfach mit Serial.print aufs Display geschrieben werden:
//*********Ab hier Displayfunktionen
void clearscreen(){ 
  Serial.print(0xC, BYTE);
}
void clearline(){
  Serial.print(0x18, BYTE);
}
void homepos(){
   Serial.print(0xB, BYTE);
}
//Helligkeit regulieren: 1=40%,2=60%,3=80%,4=100% Standard:4
void brightness(int bright){ 
  Serial.print(0x1F, BYTE);
  Serial.print(0x58, BYTE);
  Serial.print(bright, BYTE);
}

Insgesamt muss man es etwas anders ansprechen als LCDs, da es bei zu schnellen Schreibintervallen unangenehm zu Flackern anfängt. Ich schreibe generell nur auf das Display, wenn sich sein Inhalt ändert. Auf diese Weise flackert nichts und man kann sich durchgehend am schönen grünen Leuchten erfreuen. 8)

vfd-datasheet.pdf (616 KB)

Vielen Dank euch beiden für die aufschlussreichen Antworten.

Display ist soweit angeschlossen...So richtig klappen tut die Ausgabe aber noch nicht. Es wird zwar was ausgegeben (Durcheinander) aber nicht das was ich will.
Angeschlossen ist TX vom Arduino und das Display über ein NPN-Transistor und zwei Widerstände, gemäß Startseite - Universität Regensburg.

Kann man das so machen oder ist die Lösung von Orang mit einem Widerstand @ 8k notwendig?

Grüße

tarabas

Kannst du auch so machen.
Hast du die Masse vom Arduino mit der Masse vom Netzteil des Displays verbunden?

Hast du die Masse vom Arduino mit der Masse vom Netzteil des Displays verbunden?

Doofe Frage von mir...muss ich dass :relaxed:

Gemeinsame Masse bietet sich in dem Fall wohl an... :wink: Ja, solltest du auf jeden Fall machen.

Zum Widerstandswert: Das ist völlig unkritisch, ob 1k oder 8k. Mit 8k sparst du etwas Strom, kannst auch 2k2, 4k7 oder 10k nehmen, was man eben zur Hand hat.

Danke euch allen :wink:

Sorry für die ganzen Anfängerfragen, aber jeder beginnt mit dem Krabbeln bis man schließlich Laufen kann.

Danke nochmal...