Eine sprechende GPS-Uhr auf ARDUINO-Basis
In Bearbeitung
Stand: 25. Januar 2016

NEU:  Jetzt auch Version einer sprechenden Uhr mit Steuerung via Real Time Clock "DS1307" ( siehe weiter unten )

  Sprachprobe:  http://www.kh-gps.de/speak_clock.mp3  ( Reduzierte Tonqualität durch Aufnahme mit nur akustischer Signalkopplung ) 

In letzter Zeit habe ich mich speziell mit der Umsetzung elektrischer Daten in Sprachinformationen beschäftigt. Dabei entstand auch die Idee zum Sprechen von Zeit- und Datumsinformationen, so wie sie u.a. von den inzwischen sehr preiswert erhältlichen kleinen GPS-Empfangsmoduln bereitgestellt werden. Während für Navigationszwecke dabei immer immer ein sog. GPS-FIX mit Empfang von mindestens 3 Satelliten erfolgen muss, stehen die gewünschten Zeitdaten bereits bei minimalem GPS-Satellitenkontakt zur Verfügung. Zu ihrem Empfang sollte es somit immer genügen, wenn die Empfangseinheit in der Nähe eines Fensters zu platziert wird. Die daraufhin mit hoher Genauigkeit bereitgestellten Daten müssen zur Steuerung eines Sprachmoduln lediglich noch entsprechend aufgearbeitet  werden. Für diese Aufgabe wählte ich Mikrocontrollerboards des Typs ARDUINO "Pro Mini" in der 3.3V-Version. Mit ihrer Hilfe gestaltete sich auch die Zusammenschaltbarkeit mit GPS-Empfänger- und Sprachmodul besonders einfach. Weitere Angaben zu den an dieser Stelle infrage kommenden GPS-Moduln und auch zu den ARDUINO-Bausteinen "Pro Mini" finden sich z.B. hier [1].


Abb.1  Musterboard der sprechenden Uhr  ( Taster 2 und Taster 3 derzeit ohne Funktion )
GPS-Modul hier nicht sichtbar

Als Sprachmodul wurde der "DFPlayer" von Fa. DFROBOT verwendet [2],[3],[4]. Er lässt sich über seine serielle Schnittstelle ansprechen und erlaubt dabei den gezielten Aufruf von bis zu 256, vorher auf einer einsteckbaren Micro-SD-Speicherkarte ablegbaren MP3-Sprachsegmenten. Um Mess- bzw. hier Zeit- und Datumswerte als Sprachinformation ausgeben zu können, verarbeitet ein ARDUINO-Mikrocontrollerprogramm die vom GPS-Empfänger kommenden Navigations- und Zeitdaten und bereitet sie zur Steuerung der Sprachmoduln auf. Dazu werden sie in der jeweils benötigten Folge aneinandergereiht und über den seriellen Bus übertragen.
Abb.1 zeigt den Musteraufbau einer daraufhin erstellten Sprachdecodereinheit. Der Anschluss des hier nicht sichtbaren GPS-Moduls erfolgt über eine lediglich dreiadrige Kabelverbindung  ( Masse, Versorgungsspannung und Ausgangsdaten des GPS-Bausteins ).
Die Schalter "S1-S4" und der Taster "Ta1" dienen dem Aufruf der verschiedenen Betriebsfunktionen. Sind "S1" und "S2" in Stellung "OFF", erfolgt jeweils zur vollen Minute eine Sprachausgabe der Stunden und Minutenwerte. Durch Einschalten von "S2" lässt sich diese Ausgabe bei Bedarf auch unterdrücken.
Ein kurzes Niederdrücken des Tasters "Ta1" bewirkt eine einmalige Sprachausgabe von sowohl Datums-, als auch Zeitinformationen, wobei neben Stunden- und Minuten- hierbei auch die aktuellen Sekundenwerte gesprochen werden. Das Einschalten des elektrisch parallel zu "Ta1" angeordneten Schalters "S1" bewirkt eine kontinuierliche Sprachausgabe genannter Daten.
Mithilfe von "S3" und "S4" können die gesprochenen Zeitwerte an die jeweils gültigen mitteleuropäischen Verhältnisse angepasst werden. 
Die Funktionen der Schalter und des Tasters ( die in Abb.1 erkennbaren weiteren Taster sind derzeit noch ohne Funktion ) geht auch aus "Tabelle1" hervor:


OFFEN
GESCHLOSSEN
Ta1/S1
------
Sprachausgabe von Datums- und
Zeitinformation ( Std./Min./Sec. )
S2
Sprachausgabe von Zeitinfo ( Std./Min. )
zur vollen Minute
deaktiviert
S3
Zeitinfo in GMT
Zeitinfo in MEZ ( GMT+1 Stunde )
S4
Zeitinfo in GMT
Zeitinfo in MESZ ( GMT+"2 Stunden )
Tabelle 1

Abb.2 zeigt das Gesamtschaltbild der sprechenden Zeit- und Datumseinheit. Anzumerken ist dabei noch, dass die Brücke "JP1" immer dann zu öffnen ist, wenn Programme zum Prozessor auf dem "Pro Mini" hochgeladen werden sollen. Zum Thema "Programmierung des ARDUINO "Pro Mini" sei hier aber auch noch einmal auf die Ausführungen in [1] verwiesen. 


Abb.2  Gesamtschaltbild

Für den Aufbau der ersten Muster wurde das Platinenlayout nach Abb.3 entworfen. Ursprünglich war dabei beabsichtigt, den Sprachbaustein über den 3.3V-Spannungsausgang des ARDUINO-Boards zu versorgen. Erst nachdem die ersten Musterplatinen verfügbar^waren stellte sich dann aber heraus, dass die Belastbarkeit des Ausgangs von max. 150mA nicht ausreichte, um hierüber sowohl den GPS-Empängerbaustein, als auch den Sprachbaustein ( wenn dieser im oberen Lautstärkebereich betrieben wird ) versorgen zu können. Aus diesem Grunde wurden an der Platine nachträglich einige kleine, aus Abb.3 ersichtliche Änderungen vorgenommen. Danach darf die Versorgungsspannung allerdings nur noch im Bereich von 3.5-5V liegen. Wer das Arduino-Board dennoch mit einer höheren Spannung ( grundsätzlich sind am RAW-Eingang des "Pro Mini" bis zu 12V zulässig ) betreiben will, der sollte dem Sprachmodul einen separaten Spannungsregler mit ausreichender Belastbarkeit ( z.B.: 7805 ) spendieren. Zukünftige Platinenversion werden entsprechend korrigiert sein.



Abb.3  Musterboard mit Korrekturen ( durchbrochene Leiterbahn bei "X" end zusätzliche Drahtbrücke )

MP3- Sprachsegmente und ihre Nutzung

Zur Erzeugung eigener und Bearbeitung bereits vorhandener Sprachsegmente lassen sich sehr gut Programme, wie z.B. das kostenlos aus dem Internet herunterladbare AUDACITY verwenden. Es erlaubt Tonaufzeichnungen per Mikrofoneingabe, aber auch eine Weiterverarbeitung bereits vorhandener Sprachdateien. Dazu gehört z.B. eine ggf. notwendige Pegelanpassung oder auch das Abschneiden nicht benötigter Vor- und Nachlaufzeiten. Die dabei meist verwendeten Dateiformate sind WAV und MP3. Um Dateien auch im MP3-Format ablegen zu können, ist allerdings bei AUDACITY einmalig auch noch das Zusatzprogramm LAME zu installieren.
Eine weitere Möglichkeit der Sprachsegmenterzeugung ermöglichen auch spezielle Eingabeprogramme, so wie es sie beispielsweise bis vor kurzer Zeit auch noch von der amerikanischen Telefongesellschaft AT&T gab. Hiermit konnten via PC-Tastatur eingegebene Worte oder auch komplette Texte in WAV-Dateien umgesetzt und später mithilfe von z.B. AUDACITY in das MP3-Format gewandelt werden. Nachdem dieses Angebot offenbar aber leider nicht mehr zur Verfügung steht, wobei die deutsche Sprache dabei in der letzten Zeit ohnehin schon nicht mehr unterstützt wurde, gibt es als Alternativlösung aber andere Programme, mit deren Hilfe man via Tastatur eingegebene Worte oder Texte in Sprache wandeln und als Audiofile ablegen kann. Passende Suchbegriffe sind "TTS" bzw. "text to speech".  Mehr zu diesem Thema hatte ich in Zusammenhang mit einem anderen Projekt aber z.B. auch hier [5] beschrieben.

Über den seriellen Dateneingang des DFPlayer's lassen sich MP3-Files aufrufen. Dazu müssen sie
auf der zugehörigen Micro-SD-Speicherkarte in ein dort unter dem Namen "mp3" anzulegendes  Unterverzeichnis kopiert worden sein. Verwendbare Filenamen sind "0000.mp3" bis "0255.mp3".
Zum Aufruf eines bestimmten MP-Segmentes, wie z.B. "0123.mp3",  muss im  Programmcode lediglich der Befehl "mp3_play(123);" eingefügt werden. Weiterhin erforderliche Maßnahmen erledigt die zugehörige Library.

Der Inhalt der einzelnen Segmente kann entweder aus einem Wort, einem Satz, einem kompletten Romantext oder aber auch z.B. nur einer einzelnen Ziffer, bzw. einem Buchstaben bestehen.
Zur Realisierung einer Sprachausgabe von z.B.: "DIE UHRZEIT IST SECHZEHN UHR FÜNFUNDVIERZIG" können der benutzte Satz "DIE UHRZEIT IST" und auch das Wort "UHR" unter einer für sie vorher festgelegten, im zulässigen Bereich liegenden numerischen Ordnungszahl abgelegt werden, um damit ihre spätere Aufrufbarkeit zu ermöglichen. Zeitwerte sind im Programmcode dagegen   üblicherweise als numerische oder im Stringformat vorliegende Variablen verfügbar. Zur Weiterverarbeitung bietet sich für Letztere eine vorherige Wandlung in einen numerischen Wert an.
Nachdem ich z.B. die zur Sprachausgabe benötigten MP3-Segmente "NULL" bis "NEUNUNDFÜNFZIG" unter den Namen "0100.mp3" bis "0159.mp3" abgelegt hatte, gestaltete sich ihr Aufruf besonders einfach. Ist der zu sprechende Wert beispielsweise als numerische Variable mit dem Namen "Wert" verfügbar, so konnte ein  Sprachaufruf auf einfachste Weise erfolgen, indem hierzu der Codebefehl: "mp3_play(100+Wert);" verwendet wurde.


Damit sich eine für das menschliche Ohr angenehm anzuhörende Sprachwiedergabe ergibt, ist anzustreben, dass Begriffe, auch wenn sie sich aus mehreren Sprachsegmenten zusammensetzen, in der schnellstmöglichen Folge ausgegeben werden. Bei meinen ersten Programmen habe ich im Anschluss an alle Sprachausgabebefehle jeweils einen DELAY-Befehl eingefügt. Mit ein wenig zusätzlicher Reserve musste er immer entsprechend der jeweiligen Ausgabezeiten gewählt werden. Schwierig wurde es allerdings, wenn es galt aus Variablen aufgerufene Segmente abzudecken, wenn diese total unterschiedliche Längen haben konnten. Hier musste sich dann am längsten vorkommenden Segment orientiert werden, was bei allen kürzeren dann aber zu unschönen zusätzlichen Pausenzeiten führte.
Es gab aber eine Lösung, mit der sich das Problem in den Griff bekommen liess. Dazu diente das an Pin 16 des DFPlayer verfügbare Busy-Signal. Mit seiner Hilfe liess sich eine Enderkennung von Sprachsegmentausgaben realisieren. Nachdem ich im Internet auch noch eine entsprechende arduinotaugliche Routine mit offenbar zuverlässiger Funktionalität fand, stellte das einen erheblichen Fortschritt dar. Ich werde sie in alle meine entsprechenden Programme "einbauen" und hoffe damit diesen lästigen Schwachpunkt für immer beseitigt zu haben.


Version einer "sprechenden Uhr" mit RTC-Zeitbasis ( RTC = Real Time Clock )

Die oben beschriebene GPS-Version der "sprechenden Uhr" erfordert zum Empfang der für sie benötigten Zeitinformationen zumindest ein Minimum an Satellitenkontakt. Um für bestimmte Anwendungen auch hiervon unabhängig sein zu können, sollte auf jeden Fall auch noch eine Version mit nur von einem RTC-Baustein ( RTC = Real Time Clock ) stammenden und somit quarzgesteuert abgeleiteten Zeitdaten realisiert werden. Hierfür geeignet sind fertig erhältliche kleine Platinen mit darauf befindlichem RTC-Chip ( z.B. DS1307 ) und zugehörigem Steuerquarz, so wie sie z.B. für wenige Euros via EBAY erhältlich sind. Ihr Anschluss erfolgt dabei über I2C-Bus.


Abb.4   RTC-Version der "sprechenden Uhr"

Einige Probleme hatte ich anfänglich mit dem Setzen des DS1307-Moduls entsprechend der aktuellen Datums- und Zeitwerte. Hier erwies sich ein kleines INO-File, so wie es von dieser Seite [6] heruntergeladen werden kann als sehr hilfreich. Vor dem eigentlichen Uhrenprogramm ist es einmalig zum ARDUINO "Pro Mini" hochzuladen und hat dabei einzig die Aufgabe, die Datums- und Zeitwerte des RTC-Moduls ( bis zu einer ggf. später einmal erforderlich werdenden Überschreibung ) auf die gewünschten Werte zu setzen. 
Hier können alle zugehörigen ARDUINO-Sketche, sowie die verwendete MP3-Library und ein Satz der beim Musteraufbau benutzten MP3-Sprachsegmente heruntergeladen werden. Für Letztere ist auf der in Verbindung mit dem Sprachspeicherbaustein verwendeten Micro-SD-Speicherkarte ein Unterordner mit dem Namen "mp3" anzulegen. Dort hinein sind die einzelnen MP3-Dateien zu kopieren.

ANMERKUNG:
  Werden bei der GPS-Version besonders in der Einschaltphase noch ungültige Daten gesprochen, so deutet das auf unzureichenden GPS-Satellitenempfang hin. In diesem Fall gilt es einen Moment zu warten und die Empfangseinheit bei nicht eintretender Besserung ggf. an einer günstigeren Stelle zu platzieren ( Fensternähe ).



Linkliste

[1]  http://www.kh-gps.de/gps_dec.htm
[2]  http://www.dfrobot.com/index.php?route=product/product&product_id=1121#.VZrSMaSkViY
[3]  http://www.komputer.de/zen/index.php?main_page=product_info&cPath=22&products_id=298
[4]  http://www.lipoly.de/index.php?main_page=product_info&products_id=276923&zenid=r64vdq4e8ukjkgra16r8jrg4n3
[5]  http://www.kh-gps.de/speakdist.htm
[6]  http://www.frag-duino.de/index.php/maker-faq/26-ds1307-real-time-clock-modul-mit-arduino-ansteuern

E-Mail contact via: