Eine sprechende Uhr oder
die Zeitansage der Bundespost für zu Hause!


Quelle: Screenshot Youtube
Meine Version im Gehäuse eines alten Spielzeugs

 

Sprechende Elektronik Gadgets waren in den 80er Jahren sehr in Mode.
In den USA hat Radio Shack die recht populäre "Vox Clock 2", einen Würfel mit Lautsprecher ohne Display und nur mit einer einzigen Taste zur Zeitansage vertrieben.

Das wollte ich nachbauen, aber nicht mit der synthetischen Stimme des Originals,
sondern mit der Stimme der ehemaligen telefonischen Zeitansage der Bundespost / Fernmeldeamt!

Beim nächsten Ton ist es xx Uhr xx Minuten und xx Sekunden ... Piep.
Die Stimme stammt von der Sprecherin Elvira Bader und wurde ab 1958 beim Anruf der Telefonischen Zeitansage abgespielt.

Abseits von der Entwicklung eines netten Spielzeugs geht es hier um die Skills
- Audiowidergabe mit einem Mikrocontroller ohne zusätzliche Hardware
- Lesen von SPI Speicherbausteinen
- Umgang mit I2C Echtzeituhren

Die Funktion:
Wie schon erwähnt, wird durch den Druck auf den Taster die aktuelle Uhrzeit angesagt.

Auf der Platine gibt es drei weitere Taster zum Einstellen der Uhrzeit.
Zwei Taster stellen die Minuten vor oder zurück, der dritte Taster stellt die Stunden vor.
Die Änderung wird nach dem Drücken der jeweiligen Taste angesagt (nur Minuten / Stunden).

Die Taster können entweder kurz gedrückt werden um je eine Minute / Stunde zu verstellen oder gehalten werden, um die Zeit kontinuierlich zu verstellen.
Beim Stellen der Minuten werden auch die Sekunden auf "0" gesetzt.
Damit kann die Uhr sekundengenau gestellt werden.

Eine Alarmfunktion habe ich (noch) nicht implementiert.

Umsetzung:
Beim Druck auf den Wiedergabeknopf wird die aktuelle Uhrzeit aus einem Echtzeit Uhren Modul (RTC) abgerufen und dann die nächsten vollen 10 Sekunden + 8 Sekunden für die Ansage ermittelt.
Lautet die Uhrzeit z.B. 12:59:55 ist die nächste mögliche Ansage 13:00:10, da die Ansage der Stunden+Minuten+Sekunden ca. 8 Sekunden beansprucht.
Das wird über eine "select case" Bedingungsabfrage bewerkstelligt.
Das Programm startet dann mit der Ansage und wartet mit der Wiedergabe des "Piep" Tons bis die nächsten vollen 10 Sekunden erreicht sind.

Die Uhrzeit wird von einem DS3231 RTC Baustein geliefert, der über einen I2C Datenbus angebunden ist.
Diese Bausteine sind recht praktisch, da sie ab Werk kalibriert sind und zudem sehr wenig Energie benötigen.
Sie werden auf Breakout Boards, oft zusammen mit anderen Komponenten wie den für I2C Bus nötigen Pull-Up Widerständen und einem Halter für eine Pufferbatterie angeboten.

Die Daten liefern die RTC Bausteine in der Regel im BCD Format, welches zur einfacheren Verarbeitung in einer Hochsprache wie Bascom wieder in Dezimal umgewandelt werden muss.
Man muss also zum Stellen der Uhrzeit Dezimal nach BCD und zum Lesen der Uhrzeit BCD nach Dezimal wandeln.
Bascom hat dafür (natürlich) passende Befehle.

Um einen I2C Uhrenbaustein zu nutzen, muss man das Datenblatt bemühen.
Dort ist dokumentiert, wie die Register einzustellen sind und an welchen Speicheradressen sich die relevanten Daten befindedn.
Der I2C Datenbus kann über Bascom recht einfach angesprochen werden:
Mit "Config Scl/Sda" werden die Pins für die Kommunikation festgelegt, mit I2cstart die Kommunikation gestartet, mit I2cwbyte geschrieben, mit I2crbyte gelesen und mit I2cstop die Kommunikation beendet.

Die einzelnen Satzfragmente (Audiodaten) sind im Format 8 Bit PCM mit 8 KHz Samplerate (Abtastrate ISDN) abgespeichert.
Über eine Lookup Tabelle im Code des Mikrocontrollers wird Start und Ende des jeweils nötigen Satzfragmentes ermittelt.
Das benötigt recht viel Speicher, daher sind die Sprachdaten in einem externen 8Mb SPI Flash Speicher gespeichert.

Ich verwende hier "Software SPI", was die Verwendung beliebiger Portpins erlaubt.
Die Geschwindigkeit ist für diesen Zweck völlig ausreichend.
Mit "Config Spi" werden die Anschlüsse für den SPI Bus definiert.

Das Lesen dieser seriellen SPI Speicherbausteine ist unter sehr simpel.
Man sendet das Kommando zum Lesen des Speichers (03h) gefolgt von der 24 Bit Adresse, ab der gelesen werden soll an den Chip .
Bei jedem folgenden Lesevorgang wird das gespeicherte Byte ausgegeben und die Adresse im Speicherchip automatisch fortgezählt.

Den 8 KHz Takt (Samplerate), mit dem das SPI Flash ausgelesen wird, gibt Timer1 vor.
In der entsprechenden Interruptroutine wird das SPI Flash gelesen und die gelesenen Werte an das Compare Register des Timer2 übergeben.
Timer2 erzeugt im Fast PWM Modus ein PWM Signal, welches an PB3 abgegriffen werden kann.
Das PWM Signal kann über einen Kondensator zur Gleichstromabkopplung direkt auf einen kleinen Lautsprecher gegeben werden.
Auf einen dedizierten D/A Wandler kann man so verzichten.

Ist die Ansage beendet, versetzt der Mikrocontroller das SPI Flash in den Sleep Modus, schaltet die Stromversorgung des RTC Moduls ab und geht danach selbst in den "Powerdown" Modus.
Über die Eingänge Int0 und Int1 kann der Controller wieder aufgeweckt werden.

Leider unterstützt der betagte ATMEGA8 noch keinen Pinchange Interrupt.
Daher sind zwei Dioden nötig, um die Eingänge PD0 + PD1 ebenfalls INT0 auslösen zu lassen.
Im Programmcode wird dann abgefragt, welche Taste betätigt wurde.

Die Audioqualität erreicht in etwa Telefonqualität, was auch der zur Verfügung stehenden Aufnahme entspricht.
Die Audiodaten zu gewinnen, war nicht ganz leicht, da ich keine wirklich gute Aufnahme mit allen nötigen Satzfragmenten am Stück gefunden habe.
Die verwendeten Audioaufnahmen stammen von verschiednen Quellen aus dem Internet und wurden mit Audacity aufbereitet (Pausen entfernt, Pegel normalisiert, Format umgewandelt).
Idealerweise zeigt Audacity in der Zeitleiste optional die Position in Frames an.
Das ist sehr hilfreich um später die ROM Adressen zu ermitteln!
Letztlich wurde mit Audacity eine zusammenhängende Audiodatei im 8 Bit unsigned PCM Format erzeugt, die dann ab Adresse 0 in das FLASH geschrieben wurde.

Die Elektronik:
Die ganze Uhr (oder Ansageeinheit?) besteht aus drei wesentlichen Bauteilen:
- Einem AVR Mikrocontroller ATMega8A
- Einem DS3231 Echtzeituhrmodul
- Einem SPI Flash Speicherbaustein (mindestens 1 MB (Megabyte) Speicher sind nötig, z.B. N25Q064A, MX25L3205D oder kompatible!)

Der Schaltplan: (klick für PDF!)

Die Spannungsversorgung der Schaltung kommt von zwei 1,5V Batterien oder einer 3V Lithium Batterie.
Das DS3231 Modul hat eine eigene CR2032 Knopfzelle und hält die Uhrzeit unabhängig von der Versorgungsspannung der restlichen Schaltung.
Achtung: die meisten SPI Flash Bausteine vertragen maximal 3,3V!

Die Taktversorgung des ATMega8a erfolgt von dem internen 8MHz Oszillator.
Die "Brown Out" Erkennung des ATMega8a wurde auf 2,7V eingestellt.
Das ist auch die Spannung, bis zu der die Flash Speicher zuverlässig arbeiten.

Für die Entladung der Batterien bleibt leider nicht viel Raum.
Eventuell wäre es günstiger, einen 3,3V LDO Regler einzusetzen und die Batteriespannung zu erhöhen.

Mit einem Schalter kann bei Nichtnutzung der Batterieverbrauch weiter gesenkt werden.
Das RTC Modul hat ja seine eigene Batterie!

Leider gibt es kaum mehr größere SPI Flash Bausteine im PDIP Gehäuse.
Den hier verwendeten N25Q064A Flash Baustein habe ich von einem PC Mainboard abgelötet (Bios / Uefi Chip) und zur besseren Handhabung auf einen PDIP Adapter "transplantiert".
Ich habe noch nie Flash Bausteine gekauft, sondern immer aus Schrott ausgebaut, daher kann ich für diese speziellen Typen keine Bezugsquellen nennen.
Allerdings hat z.B. Fa. Reichelt eine große Auswahl an ähnlichen Speicherbausteinen im Angebot. Dort gibt es auch die praktischen Adapter!
Die Ansteuerung dieser 8 poligen SPI Flash Bausteine ist recht generisch.
Manche Bausteine verhalten sich scheinbar etwas "zickig". So funktionierte bei mir ein W25Q80 einmal und dann auch wieder nicht.
Ein MX25L3205D funktionierte wieder ohne Einschränkungen.


Ein gekaufter Adapter, daneben ein improvisierter PDIP Adapter.
Manchmal findet man auf älteren PC Mainboards noch gesockelte SPI Flash Bausteine im PDIP Gehäuse!

Zum Programmieren des Flash Chips verwende ich im Übrigen einen TL866II Programmieradapter.
Ich kann das Gerät nur empfehlen. Es unterstützt eine Vielzahl von Speicherbausteinen und Mikrocontrollern.

DS3231 RTC Module: Achtung! Diese Module gibt es von unzähligen Herstellern!
Bei einigen ist der Batteriehalter über eine Diode mit der Versorgungsspannung des Moduls verbunden.
Diese Verbindung muss aufgetrennt werden, wenn man eine CR2032 Zelle und keinen Akku in den Halter einsetzt!
Oft sind auch schon die für I2C nötigen Pull-Up Widerstände integriert.
Fehlen diese, müssen sie noch ergänzt werden!

Weiterhin scheint es bei den angebotenen DS3231 Modulen Produktfälschungen zu geben.
Einfach mal im Internet nach "DS3231 counterfeit" suchen ...
Die Module, die ich erworben habe, laufen relativ ungenau.
Die Abweichungen von den im Datenblatt angegebenen Werten (±2ppm = +- 63 Sekunden/Jahr!) sind deutlich!
Nach drei Tagen geht mein Exemplar bereits eine Sekunde nach!
Auffällig war, dass ein ganzes Modul, also Chip + Platine erheblich billiger waren, wie ein "nackter" DS3231 aus vertrauenswürdiger Quelle!
Ich habe die Module während der Chipkriese in der COVID Zeit gekauft.
DS3231 Chips aus vertrauenswürdiger Quelle waren zu dieser Zeit extrem teuer, wenn überhaupt verfügbar!
Im Internet habe ich eine gute Seite zum Thema Ganggenauigkeit von DS3231 Modulen gefunden: https://www.harald-sattler.de/html/ds3231_-_ungenau-.htm

Das Problem mit Fälschungen besteht vermutlich aktuell (2024) noch immer!
Viele der fertigen Module werden mit ziemlicher Sicherheit mit billigen Nachbauten des DS3231 bestückt.
Ein "original" DS3231SN kostet bei Digikey 6,30€ bei Abnahme von 1000 Stück!
Komplette DS3231 Module werden von verschiedenen Händlern unter 5€ angeboten!
Gute RTC Bausteine (auch andere) sind keine Cent Artikel, sondern haben ihren Preis!

Zusammengefasst ist das sehr ärgerlich, da man sich mit einem RTC Modul Genauigkeit "kaufen" möchte, die oft leider nicht gegeben ist.

Wie schon erwähnt, funktioniert die D/A Wandlung über Pulsweitenmodulation.
Das ist nicht perfekt, aber schön simpel und für ein Spielzeug völlig ausreichend.
An den PIN PB3 kann ein kleiner Lautsprecher über einen Kondensator direkt angeschlossen werden.
Für mehr Lautstärke sollte man das PWM Signal mit einem R/C Filter filtern und dann einem Verstärker zuführen.

Die Software (Das Programm im Quelltext / .BIN / .HEX und die Spachdaten) können hier heruntergeladen werden: Download.
Ob die Audiodaten irgendwie rechtlich geschützt sind, kann ich nicht sagen.
Ich hatte die Audiodateien schon länger herumliegen und kenne die Quellen nicht mehr.
Die private Nutzung ist aber sicherlich problemlos möglich.

Abschließend:
Wieder einmal ein nettes Spielzeug oder eine exklusive Uhr für Retro Liebhaber, welche die alte Zeitansage der Bundespost vermissen!

Zum Schluss noch ein Video:

 

 

© klaus(at)taeubl.de