Sprachausgabe
von Michael Gaus
Hier
noch nachträglich ein Projekt passend zum NE556
Schaltungswettbewerb, bei dem mit dem NE556 eine Sprachausgabe
realisiert wird. Es ist sozusagen "außer Konkurrenz" zu sehen, da
zwei zusätzliche Bauteile zum Einsatz kamen und es somit die
Wettbewerbskriterien nicht voll erfüllt. Verwendet wurden die
Bauteile des Adventskalenders sowie zusätzlich ein SPI-Flash und
ein Quarzoszillator.
Die
Versorgungsspannung der Schaltung beträgt 5 V. Diese kann z.B. aus
vier in Reihe geschalteten NiMH Mignon-Akkus gewonnen werden.
Hierüber werden der Quarzoszillator sowie der NE556 versorgt. Da
das SPI-Flash mit max. 3,6 V betrieben werden darf, muss noch eine
passende Spannung erzeugt werden. Über den beiden in Serie
geschalteten grünen Leuchtdioden LED1 und LED2 fällt eine
Spannung von ca. 4 V ab, wovon dann durch die Basis-Emitter-Strecke des
Emitterfolgers nochmals ca. 0,7 V abgezogen werden, sodass am Emitter
von T1 eine Spannung von ca. 3,3V anliegt.
Timer1 des NE556
arbeitet hier als eine Art Verstärker. Die beiden Pins Trigger und
Threshold sind hierbei der Eingang. Die am Pin Control angeschlossene
rote LED3 bewirkt eine Spannung von ca. 1,8 V am negativen
Komparatoreingang des Threshold Pins. Durch den an Control
angeschlossenen internen Widerstand fließt ein Strom über
die LED nach GND und bringt diese zum Leuchten. Wenn die Spannung an
Threshold größer ist als 1,8 V (z.B. bei High-Pegel des Pins
SO von IC2), dann wird der Reset-Pin des im NE556 integrierten
Flipflops getriggert und der Ausgang (Pin 5) geht auf GND-Pegel. Die
Triggerschwelle für den positiven Komparatoreingang des
Trigger-Pins des NE556 liegt aufgrund der Innenbeschaltung bei
ungefähr der halben Threshold-Triggerschwelle, also bei ca. 0,9 V.
Wenn die Spannung an Trigger kleiner ist als 0,9 V (z.B. bei Low-Pegel
des Pins SO von IC2), dann wird der Set-Pin des im NE556 integrierten
Flipflops getriggert und der Ausgang (Pin 5) geht auf VCC-Pegel. Somit
wird praktisch ein invertierender Verstärker gebildet. Am Ausgang
ist der Piezo angeschlossen.
Timer2 des NE556 arbeitet als
relativ langsame astabile Kippstufe. Die Frequenz beträgt
ungefähr 1/(1,4 * R6 * (C3+C4+C5)). Bei der angegebenen
Dimensionierung sind das ca. 1 Hz. Die Frequenz ist über die rote
LED4 als Blinken sichtbar. Wenn die LED aus ist, dann hat der Ausgang
Pin 9 High-Pegel, wenn die LED an ist, hat Pin 9 Low-Pegel. Die LED
zeigt also invertiert den Ausgangspegel an. Der Ausgang ist auf J3
geführt und kann per Drahtbrücke mit dem Takteingang SCK des
SPI-Flashs verbunden werden. R2 sorgt dafür, dass der 5-V-Pegel
auf zulässige Werte begrenzt wird (die interne Schutzdiode gegen
Vcc im SPI-Flash wird leitend und der Strom muss begrenzt werden).
Der
Quarzgenerator QG1 liefert am Ausgang eine Frequenz von 6,144 MHz und
ist auf J3 geführt. Per Drahtbrücke kann er mit dem
Takteingang SCK des SPI-Flashs verbunden werden (der mittlere Pin 2 von
J3). An J3 gibt es drei verschiedene zulässige
Schaltmöglichkeiten:
1) eine Verbindung von Pin 1 nach Pin 2: Ausgang OUT2 des NE556 liegt an SCK des SPI-Flashs
2) eine Verbindung von Pin 3 nach Pin 2: Ausgang OUT des Quarzgenerators liegt an SCK des SPI-Flashs
3) keine Verbindung aktiv, Pin 2 ist offen: SCK des SPI-Flashs liegt über R7 auf GND Pegel
Beim
SPI-Flash (IC2) ist der Writeprotect-Eingang (Pin 3) an GND
angeschlossen, sodass der Schreibschutz aktiv ist. Es können somit
nur Daten ausgelesen und nicht versehentlich überschrieben werden.
Der low-aktive Chipselect-Pin 1 liegt über R3 auf Low-Pegel, kann
jedoch über eine Drahtbrücke an J1 auf 3,3 V gelegt und somit
deaktiviert werden. Der Dateneingang SI (Pin 5) liegt über R4 auf
High-Pegel, kann jedoch über eine Drahtbrücke an J2 auf GND
gelegt werden. Der Takteingang (Pin 6) kann über J3 entweder
langsam mit ca. 1 Hz per NE556 oder aber schnell mit 6,144 MHz per
Quarzgenerator getaktet werden. Der Datenausgang SO (Pin 2) ist
über den "Verstärker" im NE556 mit dem Piezo verbunden.
Start der Sprachausgabe
Vor dem Einschalten der Versorgungsspannung muss zuerst folgende Konfiguration vorgenommen werden:
- an J1 müssen die Pins 1 und 2 über eine Drahtbrücke verbunden sein, dadurch ist CS des SPI-Flashs inaktiv
- an J2 müssen die Pins 1 und 2 über eine Drahtbrücke verbunden sein, dadurch ist SI des SPI-Flashs auf Low-Pegel
-
an J3 müssen die Pins 1 und 2 über eine Drahtbrücke
verbunden sein, dadurch wird SCK des SPI-Flashs mit ca. 1 Hz getaktet
Nun
wird die Versorgungsspannung (5V) angelegt. LED1, LED2 und LED3
müssen leuchten, LED4 blinkt mit ca. 1 Hz. Dadurch dass der
Chipselect-Pin des SPI-Flashs inaktiv ist, werden keine Daten an SO
ausgegeben, somit ist zunächst am Piezo nichts zu hören.
Damit das SPI-Flash Daten ausgibt, muss es per Befehl in den Read-Modus
gebracht werden. Hierzu muss der Chipselect-Pin aktiviert werden und
dann insgesamt 4 Bytes (32 Bits) eingetaktet werden. Zunächst muss
als Befehl der Hexwert 03 (Read-Modus) gefolgt von der gewünschten
24-Bit Startadresse übertragen werden. Die Datenübertragung
muss jeweils mit dem höchstwertigen Bit (MSB) eines Bytes
beginnen. Nach den 32 Bits werden 1-Bits an SI eingetaktet, sodass dann
die im SPI-Flash gespeicherten Daten über SO herausgesendet
werden. Die Adresse wird dann im Flash nach jedem weiteren empfangenen
Eingangsbyte automatisch hochgezählt und bricht bei Erreichen der
höchsten Adresse wieder auf Null um. Man kann als Startadresse
z.B. die höchste Adresse wählen, das wären dann 24
1-Bits. Somit ist folgendes Bitmuster erforderlich:
00000011 11111111 11111111 11111111 ...
Es sind also nach dem Aktivieren des Chipselects genau 6 Null-Bits erforderlich und danach nur noch 1-Bits.
Dies
kann nun manuell mit folgenden Schritten erfolgen, wobei bei den
Schritten 1 und 2 das richtige Timing eingehalten werden muss:
1)
Die Drahtbrücke an J1 wird entfernt, während sich die
blinkende rote LED4 gerade in einer Leuchtphase befindet. Immer wenn
LED4 an ist, hat der Ausgang OUT2 des NE556 Low-Pegel.
Somit wird durch Entfernen der Drahtbrücke an J1 der
Chipselect-Pin des SPI-Flashs aktiviert (Low-Pegel),
während der Takteingang SCK gerade Low-Pegel hat. Nun müssen
genau 6 Blinkphasen (Wechsel von "LED an" nach "LED aus")
abgewartet werden, bevor Schritt 2 ausgeführt wird.
2) Die
Drahtbrücke an J2 wird entfernt, während sich die blinkende
rote LED4 gerade in der "Aus"-Phase nach dem insgesamt
sechsten Taktimpuls nach Aktivieren des Chipselect befindet. Immer
wenn LED4 aus ist, hat der Ausgang OUT2 des NE556 High-Pegel. Da
das SPI-Flash die Daten bei der steigenden Flanke übernimmt,
wurde das sechste Null-Bit bereits übernommen. Dadurch ist am
Dateneingang SI des SPI-Flashs ab dem siebten Taktimpuls ein
High-Pegel aktiv.
3) Der zeitkritische Teil ist nun vorbei. Es muss
nun die Drahtbrücke an J3 zwischen den Pins 1 und 2 entfernt und
stattdessen an die Pins 2 und 3 gelegt werden. Dadurch wird nun
der Takteingang SCK des SPI-Flashs statt mit dem 1 Hz Takt mit dem
6,144 MHz getaktet. Dadurch erfolgt nun die Datenausgabe des SPI-Flashs
mit der richtigen Taktfrequenz, sodass nun die Sprachausgabe
hörbar sein sollte.
Das Vorgehen hört sich
zunächst kompliziert an, nach kurzer Übung funktioniert es
aber zuverlässig. In den Videos ist der Startvorgang auch zu
sehen. Die Sprachausgabe erfolgt in einer Endlosschleife, da das
Spi-Flash intern nach Erreichen der höchsten Speicheradresse
wieder bei Adresse Null von vorn beginnt.
Sprachdaten für das Spi-Flash
Damit
die Sprachausgabe funktioniert, muss in das Spi-Flash einmalig mittels
eines geeigneten Programmers eine Binärdatei geschrieben werden,
die eine PWM-Ausgabe erzeugt. Nehmen wir an, dass wir eine WAV-Datei
mit 4 kHz Samplerate und 8-bit Auflösung mono verwenden
möchten. Um ein 8-bit Sample als PWM-Signal auszugeben sind 256
Bits erforderlich, das Bitmuster besteht je nach Samplewert x aus
insgesamt x aufeinanderfolgenden Einsen und dann die restlichen (256 -
x) Bits aus Nullen. Der Samplewert 128 wird z.B. als 128 Einsbits
gefolgt von 128 Nullbits gespeichert. Bei 4000 Hz Samplerate werden
also pro Sekunde 4000 * 256 Bits = 1024000 Bits benötigt. Jeder
PWM-Wert soll 6-mal hintereinander ausgegeben werden, sodass die
PWM-Frequenz 4000 * 6 Hz = 24 kHz beträgt. Somit ist eine
Datenrate von 1024000 * 6 Bits = 6144000 Bits pro Sekunde
erforderlich. Das ist genau die Frequenz des verwendeten
Quarzgenerators. Das Spi-Flash hat eine Speicherkapazität von 32
MBits, somit ergibt sich eine Abspieldauer von (32*1024*1024) / 6144000
= 5,4 Sekunden.
Im wav_spiflash_convert.zip
ist ein selbstgeschriebenes PC-Tool zu finden, das die Daten einer
WAV-Datei (4 kHz, 8-bit mono) in eine passende Binärdatei
konvertiert. Dort sind auch 2 Beispieldateien jeweils als WAV-Datei und
als Binärdatei enthalten. Bei einer Spieldauer kleiner als 5,4
Sekunden werden die restlichen Bytes mit PWM-Daten entsprechend dem
Samplewert 80(hex) aufgefüllt, was der Mittelstellung ("Stille")
entspricht.
Videos:
http://youtu.be/e793ZCIJPD0
http://youtu.be/WkNxu7XozCw