Forum: Mikrocontroller und Digitale Elektronik Soundmodul selbstbau mit den avrs


von Philipp M. (lord-maricek)


Lesenswert?

Moin,

für mein Modellboot möchte ich ein eigenes Soundmodul bauen. Ich arbeite 
erst seit kurzem mit den ATmegas in C und bin noch am lernen. Auf dem 
Schiff wird sich für die Steuerung sowieso ein Atmega644P befinden, über 
den das Soundmodul über TWI die Befehle erhalten würde.

Für die algemeine Soundausgabe mit den Megas habe ich schon ein pdf 
gefunden, durch das ich mich erstmal durcharbeiten werde:
http://www.uni-koblenz.de/~physik/informatik/ECC/sound.pdf

Aber ich hätte da noch ein paar fragen.

Ich habe im Internet ein bissle nach Sound für mein Boot gesucht und 
rausgefunden, dass ein z.b. ein Schiffshorn ca. 6-15kb groß ist, mono 
und 8-bit ist.

Erste frage: Wie bekomme ich diese Sound in ein format, damit ich sie 
auch auf einen Mega packen kann. Ich habe schon gesucht, und gelesen, 
dass man die Sounds in das raw format konvertieren kann, aber nachdem 
ich das gemacht hatte und eine Datei geöffnet hatte, konnte ich die 
nicht auslesen.

Zweite Frage: Welchen Mega/Tiny kann ich für sowas ambesten verwenden. 
Laut google, soll der Tiny25 gut sein, weil er FastPWM hat. Da der Platz 
dadrauf begrentz ist, der Chip aber relativ klein ist, könnte ich für 
jeden Sound einen eigenen Tiny nehmen, das wären dann ca. 4-5. Die 
schließe ich dann alle über Widerstände an den Verstärker an.

Dritte Frage: Da die Sounds doch noch relativ groß sind, müsste ich sie 
wahrscheinlich noch irgenwie kompriemieren, damit sie auf einen Chip 
passen, wie stelle ich das ambesten an?

Vierte Frage: Je nachdem wie Schnell ein Boot ist, verändert sich auch 
das Motorgeräusch. Lässt sich dass auch irgentwie verändern, wenn ich 
die Bytes des Soundfiles verändere?

Fünfte Frage: Ich kenn mich in dem Bereich Verstärker nicht so aus. 
Welchen IC und Lautsprecher könnte ich dafür verwenden? Hier noch ein 
paar Eckdaten:
Spannung: 12V (mit 3,3V und 5V Spannungsreglern)
Lautstärke: Sollte lauter als Zimmerlautstärke sein
Platz: der IC sollte mit Kühlkörper nicht allzugroß sein, und der 
lautsprecher (nur einer für mono) sollte nicht größer als 7x7cm bis 
10x10cm sein.
Ich bestelle meine Teile immer bei Reichelt, es wäre also schön, wenn 
sie die Teile auch haben.

Wer natürlich ne komplett andere Idee hat, wie man das ganze einfach 
gestalten kann, immer her damit.

Ich hoffe ich bekomme zumindest auf einen Teil der Fragen antworten.
Und danke schonmal im voraus.

MfG
Philipp

von MaWin (Gast)


Lesenswert?

Als Verstärker reicht sicher ein LM386 oder vergleichbar.

Deinen Sound bekommst du nur auf dem AVR, wenn er klein
genug ist.

RAW ist schon das passende Dateiformat, da stehen dann
8 bit pro Sample zur Verfügung, und du kannst den Ton
schneller oder langsamer abspielen (mit höherer oder
niedriger Tonhöhe) wenn du die Samples in anderen
Geschwindgkeiten ausgibst. Du brauchst noch einen D/A-Wandler,
bei 8 Bit durch 8 Ausgänge des AVR und ein R2R Widerstandsnetzwertk
machbar und ausreichend, es muss kein DAC08 sein.

Um RAW in das Assembler- oder C-Programm aufzunehmen, musst
du die Bytes in Konstanten für ein ARRAY umwandeln, und
damit auch deren Schreibweise, also z.B: 0x56 0x9F, 0x51, ...

Normalerweise ollte man so was selber programmieren können.

Schwieriger wird es, wenn deine Sound RAW grösser sind als
der Speicher des Prozessors. Du musst nicht nur eine
Kompressionsmethode finden, die der AVR auch decodieren kann
(MP3 wird etwas hart), sondern auch eine die du in unterschiedlicher
Sample-Rate auslesen kannst damit du deine Geschwindigkeit
anpassen kannst. Da gibt es ADPCM und andere, die aber alle
nicht so effektiv komprimieren wie MP3.

Daher sind viele Soundmodule mit GROSSEM Speicher ausgerüstet,
den man an einen AVR natürlich auch extern anbinden könnte, z.B.
ein serielles Megabyte-EEPROM.

von Lukas K. (carrotindustries)


Lesenswert?

Philipp Maricek schrieb:
> Erste frage: Wie bekomme ich diese Sound in ein format, damit ich sie
> auch auf einen Mega packen kann. Ich habe schon gesucht, und gelesen,
> dass man die Sounds in das raw format konvertieren kann, aber nachdem
> ich das gemacht hatte und eine Datei geöffnet hatte, konnte ich die
> nicht auslesen.
Normales RIFF-WAV bekommt jeder AVR hin
> Zweite Frage: Welchen Mega/Tiny kann ich für sowas ambesten verwenden.
> Laut google, soll der Tiny25 gut sein, weil er FastPWM hat. Da der Platz
> dadrauf begrentz ist, der Chip aber relativ klein ist, könnte ich für
> jeden Sound einen eigenen Tiny nehmen, das wären dann ca. 4-5. Die
> schließe ich dann alle über Widerstände an den Verstärker an.

> Dritte Frage: Da die Sounds doch noch relativ groß sind, müsste ich sie
> wahrscheinlich noch irgenwie kompriemieren, damit sie auf einen Chip
> passen, wie stelle ich das ambesten an?
Speicherplatz bekommst du in Form von µ(SD) Karten praktisch umsonst, 
nimm die.
> Vierte Frage: Je nachdem wie Schnell ein Boot ist, verändert sich auch
> das Motorgeräusch. Lässt sich dass auch irgentwie verändern, wenn ich
> die Bytes des Soundfiles verändere?
Spiel' sie einfach schneller oder langsamer ab, wenn sich nur die 
Frequenz ändern soll.


An http://elm-chan.org/works/sd8p/report.html könntest du dich 
orientieren.

von Philipp M. (lord-maricek)


Lesenswert?

Moin,

danke schonmal für die Antworten. Eine frage noch, wofür brauche ich 
einen D/A-Wandler? Ich gebe die Bytes dann doch über PWM aus.

MfG
Philipp Maricek

von Lukas K. (carrotindustries)


Lesenswert?

Wenn du kein Hifi brauchst, dann reicht PWM durchaus aus.

von Jobst M. (jobstens-de)


Lesenswert?

Philipp Maricek schrieb:

> Erste frage: Wie bekomme ich diese Sound in ein format

sox


> Zweite Frage: Welchen Mega/Tiny kann ich für sowas ambesten verwenden.
> Laut google, soll der Tiny25 gut sein, weil er FastPWM hat.

FastPWM ist nicht nötig. Die normale PWM eines ATMega1284P reicht 
vollkommen aus. Der hat auch genug Speicher für Deine Sounds. Die SW 
wird recht winzig werden, da bleibt noch einiges über.


> Dritte Frage: Da die Sounds doch noch relativ groß sind, müsste ich sie
> wahrscheinlich noch irgenwie kompriemieren, damit sie auf einen Chip
> passen,

Nein. 15kB Soundfiles bekommst Du neben dem Programm noch ca. 8 in 128kB 
Speicher.


> Vierte Frage: Je nachdem wie Schnell ein Boot ist, verändert sich auch
> das Motorgeräusch. Lässt sich dass auch irgentwie verändern, wenn ich
> die Bytes des Soundfiles verändere?

Entweder spielst Du sie langsamer oder schneller ab. Allerdings 
verändert sich der Klang auch mit unterschiedlicher Geschwindigkeit, so 
daß Du für verschiedene Geschwindigkeiten nicht nur die 
Abspielgeschwindigkeit ändern musst, sondern evtl. auch das Soundfile.


> Fünfte Frage: Ich kenn mich in dem Bereich Verstärker nicht so aus.
> Welchen IC und Lautsprecher könnte ich dafür verwenden? Hier noch ein
> paar Eckdaten:

z.B. TDA2030. evtl. als Brücke (Schaltung im Datenblatt)
(LM3886 benötigt mindestens 20V)



Gruß

Jobst

von Dieter S. (dolivo)


Lesenswert?


von Philipp M. (lord-maricek)


Lesenswert?

Guten Morgen,

ok danke, ich werde mich damit mal auseinander setzten.
@MaWin: Jetzt hab ich gerade erst gecheckt, wofür der DAC wäre, ich 
werde das ganze dann wahrscheinlich auch mit dem DAC08 machen, weil die 
R2R Widerstandsnetzwerke laut wikipedia "Widerstandskiller" sind und 
sehr viel Platz brauchen.

Den DAC08 gibts bei Reichelt einmal mit EP und einmal mit CP. Wo ist da 
der Unterschied?

Nochmal kurz ne andere Frage, den 644p und den 1284p werde ich mit 20Mhz 
Quarzen betreiben. Was für Kerkos muss da mit anschließen? Bei 16Mhz 
habe ich bisher immer 22pf benutzt.

MfG
Philipp

von Spess53 (Gast)


Lesenswert?

Hi

Gibt es als AppNote von Atmel:

http://www.atmel.com/dyn/resources/prod_documents/doc1456.pdf

http://www.atmel.com/dyn/resources/prod_documents/avr335.zip

> weil die R2R Widerstandsnetzwerke laut wikipedia "Widerstandskiller" sind >und 
sehr viel Platz brauchen.

Gibt es fertig als Bauteil.

MfG Spess

von Frank B. (foobar)


Lesenswert?

Nimm doch einfach einen Microcontroller mit integrierten DA-Wandler. Als 
ATmega habe ich da zwar nur den ATmega64M1 mit ausreichend Flash 
gefunden, den man aber scheinbar nirgends bekommt (zumindest nicht bei 
Farnell, Digikey oder Reichelt), aber es gibt ja auch noch sowas wie 
STM32F100, was zwei 12 Bit DACs und 16 ADCs mit 12 Bit integriert hat. 
Wenn deine Bootsteuerung nicht in Serie gehen soll, dann kannst du dir 
auch ein Header-Board kaufen, um es auf Lochraster aufzubauen, z.B. 
hier:

http://www.olimex.com/dev/stm32-h103.html

und du brauchst dann nur noch den Audio-Verstärker und den Rest deiner 
Bootsteuerung anschließen und fertig ist die Schaltung. Quarze zum 
laufen zu bringen, richtiges Platinen-Layout, auf alles andere achten 
wie Abblockkondensatoren usw., ist nicht so einfach, falls du noch keine 
Erfahrung mit Microcontrollern hast.

von Philipp M. (lord-maricek)


Lesenswert?

Cool danke, werds mir mal anschauen.

Ich werde einfach mal den DAC und die Widerstandsnetzwerke testen. Mal 
gucken was besser ist.

MfG

von Frank B. (foobar)


Lesenswert?

Philipp Maricek schrieb:
> @MaWin: Jetzt hab ich gerade erst gecheckt, wofür der DAC wäre, ich
> werde das ganze dann wahrscheinlich auch mit dem DAC08 machen, weil die
> R2R Widerstandsnetzwerke laut wikipedia "Widerstandskiller" sind und
> sehr viel Platz brauchen.

Da steht Widerstandsgrab, weil du so viele davon brauchst. Widerstände 
generell sind nicht lebendig :-) Viel ist aber relativ: Du könntest ja 
mal probeweise einen 4-Bit Wandler ausprobieren. Für ein paar 
Bootsgeräusche sollte das eigentlich ausreichen. Da braucht man dann 13 
Widerstände (man verwendet wegen Genauigkeit am besten für 2 R zwei von 
den R Widerständen). Als SMD bekommst du das locker auf Daumengröße hin. 
Um die Bestückung zu vereinfachen, kannst du auch Widerstandsarrays 
verwenden:

http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=Y1103DKR-ND

Einzelne Widerstände sind allerdings preiswerter, da bekommst du 
problemlos 100 Stück für insgesamt 70 Cent:

http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=RMCF0805JT10K0CT-ND

Bei 4 Bit sollte die Genauigkeit von 5% noch ausreichen, zumal wenn die 
aus derselben Charge sind, meist sowieso genauer sind, relativ 
zueinander gesehen. Oder du selektierst die per Ohmmeter, falls es keine 
Serienproduktion werden soll. Bei höherer Auflösung besser einen 
Microcontroller mit integriertem DAC nehmen.

von Lukas K. (carrotindustries)


Lesenswert?

Wozu einen externen DAC, wenn der AVR doch mit PWM schon einen 
beinahe-DAC hat?

von Philipp M. (lord-maricek)


Lesenswert?

Wenn ich das richtig verstanden habe, bekomme ich mit einem Externen DAC 
eine bessere Soundqualität hin.

MfG
Philipp

von Frank B. (foobar)


Lesenswert?

Ich würde es mal ausprobieren. Wenn du keine HiFi-Boxen mit an Bord 
hast, dann bekommst du ggf. mit dem PWM-Ausgang genauso guten Sound hin, 
wie mit einem externen 8 Bit DAC, da der Lautsprecher und die 
akustischen Qualitäten des Boots dann die begrenzenden Faktoren sein 
könnten.

von Hannes L. (hannes)


Lesenswert?

Es muss nicht immer Kaviar sein, es geht oft auch recht einfach...

Die hier http://www.hanneslux.de/planet5b/Harzkamel/DSCN0003.JPG zu 
sehende Rucksackplatine mit ATTiny85 und LM386 enthält Geräusche für 
Anlasser, Dieselmotor, Bimmelbahnglocke und Hupe (Horn). Die "Drehzahl" 
des Diesels wird von einer Gleichspannung gesteuert, die per Tiefpass 
aus der Motor-PWM des Fahrtreglers gewonnen wird. Über 3 weitere 
Steuereingänge wird das Modul aktiviert (mit Anlasser beim Einschalten) 
und deaktiviert, bzw. Glocke und Horn ausgelöst.
Die Geräusche für Glocke, Horn und Motor können gleichzeitig erzeugt 
werden.
Die Ausgabe erfolgt über High-Speed-PWM und Tiefpasss, die Verstärkung 
mit einem LM386. Bei halb aufgedrehtem Lautstärke-Poti ist die 
Lautstärke ausreichend für eine Gartenbahn-Lok. Der LM386 wird mit 3 
Li-Zellen (11,1 V Nennspannung) betrieben, der ATTiny85 mit 5V. 
Stromversorgung und Steuerung erfolgen über Steckverbinder vom 
RC-Fahrtregler der Lok.

...

von Achim M. (minifloat)


Lesenswert?

Schau dir auch mal die Sounderzeugung der Diesel-Ente an.
http://www.hubersoft.net/elektronik/dieselente/dieselente.html
Auf der Seite gibts auch eine MP3, wie sich das dann anhört.
Die Sounderzeugung basiert nur auf an- und abschalten eines Portpins.
mfg mf

von MaWin (Gast)


Lesenswert?

> frage noch, wofür brauche ich einen D/A-Wandler?

Damit die Ausgabe auch programmtechnisch einfach zu realisieren ist, du 
hast hier den Eindruck hinterlassen, auch mit einfachsten 
Programmieraufgaben bereits überfordert zu sein.

> Ich gebe die Bytes dann doch über PWM aus

Wenn du das programmtechnisch beherrscht, dann kannst du dir den DAC 
sparen, er war nur als Vereinfachung des Programms gedacht, sozusagen 
Hardware statt Software.

> ich werde das ganze dann wahrscheinlich auch mit dem DAC08 machen,
> weil die R2R Widerstandsnetzwerke laut wikipedia "Widerstandskiller"
> sind und sehr viel Platz brauchen.

Ich weiß nicht, wie du Wikipedia liest:

"Hier wird das analoge Ausgangssignal durch je einen parallel 
geschalteten Widerstand pro Bit erzeugt, der je nach Bit gewichtet ist. 
Zur Vereinfachung der Herstellung wird meist das R2R-Netzwerk verwendet. 
Man benötigt so viele Schalter, wie Bits zur Darstellung der digitalen 
Werte verwendet werden. ... Bei ungenauer Gewichtung der Bits treten 
Monotoniefehler auf. Das Parallel-Verfahren bietet einen guten 
Kompromiss aus Aufwand und Umsetzungsgeschwindigkeit und wird häufig 
verwendet. Bei hoher Umsetzerauflösung (Bitanzahl) besteht die Gefahr 
von Monotoniefehlern."

Der Text ist akzeptabel und sagt nicht das aus was du meinst gelesen zu 
haben. Ja, normale gekaufte Widerstände ergeben keinen besonders guten 
DAC. Aber der ist bei einfachem Audio wie Schiffsdieselbrummen auch 
nicht notwendig.

> Den DAC08 gibts bei Reichelt einmal mit EP und einmal mit CP.
> Wo ist da der Unterschied?

Siehe Datenblatt. Die Genauigkeit. E ist doppelt so genau (braucht man 
nicht, aber bei demselben Preis...). Allerdings ist der DAC08 nur zu 
empfehlen, wenn dein Verstärker mit +5V/-5V zum uC läuft, und nicht mit 
12V zu 5V. Da sind Widerstände einfacher. Und wennn dir PWM kein Problem 
in der Programmierung macht, ist jener natürlich noch einfacher, nur 1 
Leitung.

von Jobst M. (jobstens-de)


Lesenswert?

Einen 8-Bit-Wandler baut man mit 15 Widerständen:
1
P7 ---10K||10K---+----------Rv-------+--------o Out
2
                 |                   |
3
P6 -----10K------+                   |
4
                 |         | \       |
5
P5 ---10K--10K---+---------| - \     |
6
                 |         |     \___|
7
P4 ---22K--18K---+         |     /
8
                 |   +5V---| + /
9
P3 ---47K--33K---+         | /
10
                 |
11
P2 --150K--10K---+    -  -  -  -  -  -  -  -  - 
12
                 |              +10V
13
P1 --220K--100K--+  :             |             :
14
                 |                1
15
P0 ----680K------+---- --2K2--+-->0  Offset
16
                    :         |   K             :
17
                              C   |
18
                              |   |
19
                    :          GND              :
20
                      -  -  -  -  -  -  -  -  - 
21
                    Nur, wenn Offset benötigt wird
22
23
Vout ss = Rv * 2mA

Evtl. muss das MSB getrimmt werden. Ansonsten reicht das aus!

PWM reicht allerdings auch aus!
Die PWM ist linearer und für das Ohr immer noch schnell genug
(80kHz hörst Du nicht!)


Gruß

Jobst

: Bearbeitet durch Admin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.