Hi Ich habe ein kleines neues Projekt gestartet und benötigte etwas Hilfe für ein WTV020-M01 Sound Modul für den Arduino. Ich möchte mit einen Schalter eine bestimmte Datei auf der MicroSD-Card abspielen lassen. Es werden sich aber mehrere Musikdateien auf der Karte befinden. Er soll aber nur z.B. Lied Nr.3 abspielen, wenn das Programm es im vorgibt und mit dem Schalter gestartet wird. Irgendwie bekomme ich kein Signal zum Modul. Oder es ist komplett falsch was ich mir durch den Kopf gesetzt habe. Ist es überhaupt möglich eine bestimmte Datei mit dem WTV020 Modul zu starten oder muss ich alles überdenken??? Ich hoffe es kann mir einer weiterhelfen. Ich habe mal mein Code reingestellt. Außer ein Brummen am Lautsprecher ist nicht viel los. [#include <Wtv020sd16p.h> const int ResetPIN= 2; const int clockPin= 3; const int dataPin= 4; const int busyPin= 5; int buttonPin = 12; int button= 0; Wtv020sd16p wtv020sd16p (ResetPIN, clockPin, dataPin, busyPin); void setup() { wtv020sd16p.reset (); pinMode (buttonPin, INPUT); } void loop() { button = digitalRead (buttonPin); if (button == HIGH) { wtv020sd16p.playVoice (4[/code]); delay(2000); } }]
Wollte den auch mal zum laufen bringen.. irgendwie war das bei mir alles buggy obwohl ich nur eine Datei abspielen wollte. Falls Du weiterkommst kannst ja hier mal meldung machen. Werde mich zu Halloween wieder dransetzen. EDIT: Auf Deine Frage.. im normalfall sollte das klappen, ist aber nicht garantiert.
:
Bearbeitet durch User
Ich bräuchte nur jemanden der schon einmal Erfahrung mit dem Modul hat und mir weiterhelfen kann. Hat jemand schon mit dem WTV020 ein Projekt gestartet und eine Sounddatei ohne die Next-Schalter betrieben? Also alles gesteuert über ein Arduino!
steht doch alles in dem Beispiel der Lib und einem ellenlangem Thread auf arduino.cc dort wo diese Lib vorgestellt wurde. http://forum.arduino.cc/index.php/topic,117009.0.html
Bei mir hat es funktioniert, allerdings nutze ich keinen Arduino. Das Soundformat ist in diesem Fall sehr wichtig, normale WAV Dateien haben bisher nicht richtig funktioniert, das AD4 Format funktionierte problemlos. Dazu gab es ein Tool im Internet, das müßtest du googeln.
Das mit dem .ad4 ist mir klar und auch schon alles umgewandelt. Ich denke das der Microcontroller nicht mit dem Modul spricht. Was ist mit dem Clock und dem Busy Eingang, müssen die speziell geschaltet werden. (Mit einen bestimmten Takt?) Wie sieht der Aufbau mit dem Modul aus?
Da du die Wtv020sd16p.h Bibiliothek benutzt schätze ich das die Bezeichnung WTV020-M01 nicht richtig ist ? Lehmann84 schrieb: > Was ist mit dem Clock und dem Busy Eingang, müssen die speziell geschaltet > werden. Der Clock Pin ist der Pin 7 (P04) am Modul , welcher an den "clockPin= 3" des Arduinos angeschlossen wird. Der Busy Pin ist der Pin 15 (P06) an dem Modul kommt an den "busyPin= 5" an dem Arduino. Der Di Pin 10 (P05) an dem Modul kommt an "dataPin= 4" an dem Arduino. Der Reset Pin 1 (RESET) an dem Modul kommt an "ResetPIN= 2" an dem Arduino. Mit den Tastern kann die Funktionalität getestet werden. Voraussetzung dafür ist natürlich das es ein Wtv020sd16p ist, die Bezeichnung steht ganz unten auf der Oberseite des Moduls. Betrieben wird das ganze mit 3.3 Volt.
Das anschließen hat ja auch so weit schon gepasst. SD-Card mit ein paar Beispiel Dateien eingelegt und über die Schalter NEXT und Back an dem Modul (PIN 12 und 13) konnte ich hin und her wechseln. Ich würde aber gerne über den Arduino eine bestimmte Datei abspielen. z.B. Soundfile Nummer 4 und danach die Nummer 2. Wie müsste da das Programm aussehen? Das ist in Moment mein Problem. Ich denke mit der Bibliothek Wtv020sd16p.h ist das egal, aber ich check das noch einmal.
Hab auch mal wieder gebastelt.. an beiden Modulen war auf dem Pin des CLK eine kalte Lötstelle das es nur sporadisch bis garnicht funktionierte.. in Arduino lief es garnicht, in C Sofort. EDIT: ach Sry ist ja der M01.. hab den 16SD
:
Bearbeitet durch User
Weiß jemand den Link zu der Pin-Belegung des WTV020-M01. Vielleicht liegt ja daran das Problem. Über die Next und Back Tasten funktioniert ja soweit alles, nur über die Ansteuerung des Moduls über den Arduino will es noch nicht klappen. Vielleicht kann mir einer weiterhelfen, habe nämlich nur das Datasheet vom WTV020-16SD gefunden.
Ist ja die Frage ob das M01 eine Ic Produktbezeichnung oder eine beliebige Modulbezeichnung ist. Ich habe nur den WTV-020-S(erial) gefunden und nach dem Datasheet könnte man mal "durchklingeln".. was steht denn genau auf dem IC und Foto?
In dem Forum http://forum.arduino.cc/index.php/topic,241021.0.html gibt es ein Modul mit der Bezeichnung WTV020-M01, die auch auf eine Bibliothek und ein Wiki verweist, https://github.com/DFRobot/DFPlayer-Mini-mp3 http://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299 eventuell ist es das Ding ja sogar. Bisher ergab die Suche nur zwei IC's WTV010 und WTV020 das Datenblatt dazu gibt\gab es auf irgend einer Chinaseite.
Also ich häng mich hier mal dran, da ich dieses Modul WTV020M01 im einfachen Taster-Mode betreiben wollte. Ich hatte zwei dieser Module und beide taten nichts ! In diversen Foren standen so Probleme mit den 3.3 V, SD_Karten Kompatibilität, file-Format etc. Irgendwie schien es nur sporadisch bei den Leuten zu funktionieren. Ich hab das Modul auf 5 V umgelötet, was aber auch nix brachte. Jetzt hab ich mir mal das Datenblatt des Chips vorgenommen und die Verbindungen zum Rest der Platine geprüft. Und dabei musste ich feststellen, dass keine Masse - Verbindung vom Chip zum SD_Kartenslot bestand (Pin 6), auch nachlöten half nix. Ich hab die Leitung händisch verlegt und was soll ich sagen: Es funktioniert alles tadellos ! Ich werde die Tage mal noch die anderen Module überprüfen (ich dachte, ich hab zwei geschrottet und deshalb nachbestellt - wie dumm ^^).
Markus P., vielen Dank für den wertvollen Hinweis. Er hat mein Projekt gerettet: http://www.tonymacx86.com/imac-mods/130197-mactester57s-imac-g5-17-a1058-model-7.html#post986109 Unglaublich, was heutzutage alles aus China auf den Markt geworfen wird. Das Beste ist, dass die Boards alle einen "QC Passed" Kleber haben. Vielen Dank nochmals!
na das freut mich ja. Ich weiß zwar nicht, was du da mit dem Mac machst, aber Daumen hoch (: Ich kann ja noch hinzufügen, dass ich zwei verschiedene 2GB SD_Karten hier habe. Die eine funktioniert problemlos und immer. Bei der anderen kann ich drei vier Titel abspielen, dann kann das Modul damit nichts mehr anfangen. "Busy" springt kurz an und geht wieder aus. Auch Auschalten, raus / rein bringt nix. Ich muss die Karte low Level formatieren und dann geht sie wieder, obwohl am PC die Karte und Inhalt völlig unverändert erscheint (also vor dem Formatieren ). Auch "normales" Formatieren hilft nicht. Also die Controller auf den Karten hab so ihr Eigenleben ...
Hallo, hab lange nach irgendeiner Info zu dem Modul gesucht... bin ich froh hier was gefunden zu haben :-) Ich habe heute zwei dieser Module bekommen(WTV020M01 V1.00). Oben steht das Datum: 2012.01.12 und hinten der sticker: QC2 Passed 10/2014 @Markus P.: Ich gehe mal davon aus, daß es genau die gleichen sind wie deine. Warscheinlich haben sie dann ja auch dieses Masse-Problem... Ich habe allerdings erstmal ganz andere Sorgen: Eigentlich habe ich 2 andere Module bestellt: WTV020-SD-16P Steht so auch auf meiner Rechnung. Na ja, wird sicher ein Versehen des Shops gewesen sein. Jetzt weiß ich nur nicht, ob die Module qualitativ gleichwertig sind, oder ob ich sie zurückschicken sollte. Wenn sie auch ok sind, würde ich sie behalten. Gekostet haben sie 11,90€ (zusammen). Vielleicht kann mir jemand was zu den Unterschieden der Module sagen. Und, ganz wichtig: Ich finde nirgends einen Pin-Belegungsplan. Kann den mal einer posten ? Danke schonmal..
Hallo! zunächst einmal möchte auch ich mich bei Herr P. bedanken - er hat die Module bei uns erworben, und wir waren auch etwas überrascht was wir da von unserem Lieferanten bekommen haben. Umso mehr freut es uns natürlich dass er mit der beschriebenen Modifikation die Module zum Laufen bekommen hat. Ein Nachfragen bei unserem Zulieferer hat nur ein Achselzucken bewirkt (die haben nicht einmal verstanden was das Problem ist fürchte ich), und das Versprechen es das nächste mal besser zu machen ("my friend, we are so sorry")... Viele Grüße, Alexander Beck
:
Bearbeitet durch User
Guten Abend, ich habe auch zwei dieser Module. Ich habe diese bei Eckstein-Komponente erworben. Die Dokumentationen sind wie bei vielen chinesischen Produkten immer entsprechend schlecht zumindest schlecht übersetzt. Es ist in verschiedenen Datenblätter oder Übersetzungen eine innere Schaltung abgebildet, diese zeigt eine direkte Verbindung zwischen VSS und PIN6 der microSD Card. Diese ist auf der Platine aber anders realisiert, anscheinend wird die Karte über einen Transistor J3Y (SMD Code) erst eingeschaltet. Ich habe es auch zunächst mit einer Brücke zwischen VSS und PIN6 probiert. jedoch habe ich dem Modul so auch keinen Ton entlocken können. Nachdem ich die Kingston 2GB Karte nochmal mit Windows in voller Kapazität mit dem FAT Dateisystem formatiert habe. Und Sample AD4 Audiodateien darauf geladen habe, funktionierte das eine Modul, welches ich mit der Brücke versehen habe mit einem Li-Ion Akku mit nachgeschalteter Diode in Flussrichtung um eine Spannung von 3.3 Volt zu erhalten. Das Modul ohne der Brücke funktionierte weiter hin nicht. Irgendwo habe ich gelesen, dass man eine höhere Spannung benötigt. Uns in der tat, Das originale unveränderte Modul arbeitet mit der vollen Batteriespannung von 3.7 Volt ebenfalls. Vielleicht hilft ja jemandem dieser Beitrag oder jemand hat noch eine Idee. Gruß Peter
hm, also ohne Brücke, aber mit erhöhter Spannung läuft das Teil ? Muss ich glatt nochmal probieren.
Meine funktionierende Konstallation (Steuerung nur über Mikrocontroller bzw. Arduino): WTV020-M01 + Arduino Nano (ATmega 328) + Audacity + 2GB-microSD Transcend (FAT16, Conrad, siehe Foto "microSD.jpg"!). WICHTIG: Es gibt 3 Spannungs-Jumper zum Bestimmen der Betriebsspannung (siehe Foto "Voltage_Jumpers.jpg"!). Diese muss zuerst für 3,3V od. 5V gelötet werden! PIN-Belegung von WTV020-M01: [[http://www.datasheetbank.com/WTV020M01-Datasheet-Pinouts.html]] Wir werden für die Steuerung von WTV020-M01 nur folgende PINs benötigen: VCC, GND, SPK+, SPK-, /BUSY, /RESET, Data In, Clock. Vorgehensweise für Erstellung der Audio-Dateien (AD4-Format): 1. Audio aufnehmen od. zum WAV (16 Bit PCM, MONO, 32000Hz) konvertieren. 2. Bearbeiten (Entrauschen, Pegel anpassen sonst stürzt das Modul ab, Einblenden, Ausblenden, Zerstückeln und als "0000.WAV", "0001.WAV",..., "9999.WAV" speichern (16 Bit PCM, MONO, 32000Hz). Siehe Fotos: "Audacity.jpg", "Effekte.jpg" sowie "Rauschprofil_Ermitteln.jpg"! 3. CMD starten, zum WAV-Verzeichnis wechseln und mit dem Befehl:
1 | for /f "usebackq" %a in (`dir /b *.wav`) do ad4.exe -E4 %a |
alles auf einmal in AD4-Format konvertieren und anschließend auf die microSD kopieren. Siehe "ad4.zip"! 4. "/Busy", "/Reset", "Data In" sowie "Clock" an Mikrocontroller/Arduino anschließen. 5. Bibliothek "Wtv020sd16p.zip" suchen, downloaden, in Libraries-Verz. von Arduino od. Sonstige IDE-Lib-Verz. entpacken: [[http://forum.arduino.cc/index.php/topic,117009.0.html]] 6. Den Code unten (nur für Arduino-IDE) eingeben (od. noch Besser: Copy & Paste), kompilieren, hochladen. Fertig!
1 | /*******************************************************************************
|
2 | * Author: Pedram GANJEH-HADIDI *
|
3 | * Date: 2016-01-05 *
|
4 | * Modul: WTV020-M01 Ver. 1.0 *
|
5 | * Copyright: GNU GPL: https://www.gnu.org/copyleft/gpl.html *
|
6 | * Programm: Playing files: "0000.AD4" to "0020.AD4" in a for loop. *
|
7 | ********************************************************************************
|
8 | * This ASCII-ART contains information about: *
|
9 | * - PINs of WTV020-M01 (short: WTV) *
|
10 | * - How to solder Voltage Jumpers for 3.3V or 5V op. mode *
|
11 | * - How to connect the WTV020-M01 to a microcontroller (mC). *
|
12 | * See: http://gif.datasheetbank.com/detail-image1/ETC/139731-DI1.gif *
|
13 | * and: http://www.datasheetbank.com/WTV020M01-Datasheet-Pinouts.html *
|
14 | * *
|
15 | * ------| |------ *
|
16 | * | \_/ | *
|
17 | * | [A] [B] [C] | *
|
18 | * /RESET ---| 1 16 |--- Vcc *
|
19 | * AUDIO ---| 2 15 |--- /BUSY *
|
20 | * Not used! ---| 3 14 |--- Not used! *
|
21 | * SPEAKER(+) ---| 4 13 |--- Next Sound File *
|
22 | * SPEAKER(-) ---| 5 12 |--- Previous Sound File *
|
23 | * Not used! ---| 6 11 |--- Not used! *
|
24 | * Clock(CLK) ---| 7 10 |--- Data In(DI) *
|
25 | * Ground(GND)---| 8 9 |--- Pause/Play *
|
26 | * ---------------- *
|
27 | * *
|
28 | * ATTENTION! *
|
29 | * Check Voltage-Jumpers on the module: *
|
30 | * - Solder [A] and [B] for 5V mode, or *
|
31 | * - solder [B] and [C] for 3.3V mode! *
|
32 | * *
|
33 | * The "/RESET" and "/BUSY" pins are negated, which means: *
|
34 | * /BUSY == 0 == LOW ===> WTV is busy *
|
35 | * /BUSY == 1 == HIGH ===> WTV is idle (ready to play a file) *
|
36 | * *
|
37 | * If you are controlling the WTV020-M01 by a microcontroller then you will *
|
38 | * only need following PINs: Vcc, GND, CLK, DI, /BUSY, /RESET, SPEAKER(+) and *
|
39 | * SPEAKER(-). *
|
40 | /*******************************************************************************
|
41 | * Controlling by Microcontroller (mC) *
|
42 | * *
|
43 | * You have to connect following four connections: *
|
44 | * *
|
45 | * MICROCONTROLLER (mC) WTV020-M01 (WTV) *
|
46 | * *
|
47 | * 1. 1x Digital INput ---> connnect to ---> /BUSY *
|
48 | * 2. 1x Digital Output ---> connnect to ---> /RESET *
|
49 | * 3. 1x Digital Output ---> connnect to ---> CLOCK (CLK) *
|
50 | * 4. 1x Digital Output ---> connnect to ---> DATA IN (DI) *
|
51 | * *
|
52 | * *
|
53 | *******************************************************************************/
|
54 | |
55 | |
56 | /********************************* Definitions ********************************/
|
57 | // "Driver" class.
|
58 | // See: http://forum.arduino.cc/index.php/topic,117009.0.html
|
59 | // or: http://www.instructables.com/id/How-to-use-WTV020SD-16P-with-Arduino/
|
60 | #include <Wtv020sd16p.h> |
61 | |
62 | #define DELAY_RESET 1000
|
63 | #define DELAY_FILE 5000
|
64 | |
65 | // The mC-pin connected to the WTV-reset pin.
|
66 | #define PIN_WTV_RESET 2
|
67 | |
68 | // The mC-pin connected to the WTV-clock pin.
|
69 | #define PIN_WTV_CLOCK 3
|
70 | |
71 | // The mc-pin connected to the WTV-data pin.
|
72 | #define PIN_WTV_DATA 4
|
73 | |
74 | // The mc-pin connected to the WTV-busy pin.
|
75 | #define PIN_WTV_BUSY 5
|
76 | |
77 | |
78 | /********************************* Implementation *****************************/
|
79 | |
80 | // Create an object of the "driver".
|
81 | Wtv020sd16p wtv020sd16p(PIN_WTV_RESET, PIN_WTV_CLOCK, PIN_WTV_DATA, PIN_WTV_BUSY); |
82 | |
83 | |
84 | void setup() |
85 | {
|
86 | // Init. Serial-Comm. for debug info.
|
87 | Serial.begin(9600); |
88 | |
89 | // Allways reset the WTV-module before first usage!
|
90 | wtv020sd16p.reset(); |
91 | }
|
92 | |
93 | |
94 | void loop() |
95 | {
|
96 | Serial.println("Playing from 0 to 20..."); |
97 | |
98 | // Play the AD4-files from "0000.AD4" to "0020.AD4".
|
99 | // All of my files have/had a duration below 5 seconds.
|
100 | // ATTENTION: Files have to start with number "0000" and
|
101 | // must be continuously!
|
102 | for(int i = 0; i < 21; i++) |
103 | {
|
104 | Serial.print("Now playing file No# "); |
105 | Serial.println(i); |
106 | |
107 | delay(DELAY_RESET); |
108 | wtv020sd16p.playVoice(i); |
109 | |
110 | // For ideal delays, you can save the duration of your
|
111 | // files (in [ms] + a little bit more) in an array (or EEPROM),
|
112 | // then read and use it here.
|
113 | // See: https://www.arduino.cc/en/Reference/EEPROM
|
114 | delay(DELAY_FILE); |
115 | }
|
116 | }
|
:
Bearbeitet durch User
sehr schön zusammengefasst und bebildert. Danke dafür !! Und die Masse Brücke ist nicht nötig ?
>Und die Masse Brücke ist nicht nötig?
Nein! Eine Massebrücke für mein WTV020-M01 war nicht notwendig.
:
Bearbeitet durch User
Crash/Abstürz bei Knackgräusche oder höher Pegel/höhe Lautstärke/AD4-Dateien Auf diverse Internetseiten und Foren wurden Abstürze/Crashs von WTV020-M01 Modul bei "höher Pegel", "(laute) Knackgräusche" udg. gemeldet. Da dieses Verhalten des Digital-Analog-Converters (DAC) mir sehr komisch/unnatürlich erschien, habe ich einige Tests durchgeführt und habe den Grund für dieses Verhalten eruieren können: undefinierte Betriebs-Spannung (ungelötete Spannungs-Jumper, siehe mein vorh. Posting!). Der Grund: Bei ungelötete Spannungs-Jumper, arbeitet der WTV020-M01 in 3,3V Modus (wobei das Modul bei gelötete Spannungs-Jumper bezüglich VCC relativ tolerant wäre), jedoch durch ungelöteten Jumper, sinkt die Betriebsspannung bei höhere AD4-Dateien und das WTV020-M01 Modul startet sich neu. Dieses Verhalten war auf einem anderen Modul reproduzierbar.
:
Bearbeitet durch User
hm, also meine Module waren fest auf 3.3V verlötet, aber mittels "setVolume" zu hoch eingestellter Lautstärke am Modul , kamen nur noch Pieptöne (Absturz ?). Also sollten die ad4 files im Pegel so gering sein, dass auch bei maximaler Lautstärke das Gerät nicht abstürzt ? Ich hab mich jetzt lange nicht mehr damit beschäftigt und muss das erstmal wieder rauskramen. Aber dann werd ich nochmal den 5V Modus probieren und einen Kerko über die Betriebsspannung legen.
Wie man diese Module auch immer nennt.. Ich nenne diese mal einfach "WTV020 China Module". Ich habe wohl einige erwischt die zwar Lötbrücken haben, aber als 3.3V Only verkauft wurden. Diverse Libs musste ich für meine Zwecke immer anpassen bis es funktionierte. Insgesamt habe ich noch keine Probleme gehabt, Laut und Klar!
Philipp K. schrieb: > > Diverse Libs musste ich für meine Zwecke immer anpassen bis es > funktionierte. > Ich habe die Bibliothek (siehe mein langer Posting weiter oben!) eingesetzt und darf berichten, Alles hat sofort und prima funktioniert.
Also ich kann das alles nicht bestätigen... was ich aber bestätigen kann, sind Fehler in dem Arduino WTV020SD16 Library Code. Desahlb wurde je hier auch schon festgestellt, das die angebliche Lösung mit der Drahtbrücke keine ist. Auch bei mir hat der SDCard Pin keinen Kontakt zu GND. Und trotzdem funktioniert alles. Deshalb denke ich ist der QC Aufkleber auf dem Modul auch in Ordnung... weil die eben ihren Code haben (Assembler)... und der Arduino Code nur ungenügend interpretiert und übersetzet wurde. Ich habe jedenfalls viel rumprobiert und feststellen müssen, dass hier das Timing an vielen Ecken nicht stimmt. Die Library habe ich verworfen und was eigenes erstellt... habe das mit meinen 3 Modulen getestet (2x 2012 V1.0, 1x 2015 V1.01) und alle funktionieren einwandfrei mit 3.3v und einer 2GB Micro SDCard. Dieses Modul ist für mich die beste Lösung weil: - Man kann einen 8 Ohm Lautsprecher direkt ohne extra Verstärker anschliessen (laut!) - Klein und sparsam Blöd ist natürlich das AD4 Format... aber dazu habe ich mir einfach ein eigenes Java Converter Tool programmiert. Somit sind alle Probleme gelöst :) Übrigens ich verwende das Modul mit einem Teensy LC und löte das Modul auf den hinteren Teil des Teensy (huckepack). Kleiner gehts nimmer :-)
Tester schrieb: > Also ich kann das alles nicht bestätigen... was ich aber bestätigen > kann, sind Fehler in dem Arduino WTV020SD16 Library Code. So isses!
Übrigens setVolume funktioniert nicht... da der Chip nur 0xfff0 (Mute) und 0xfff7 (Full Vol) annimmt. Versucht man etwas anderes einzustellen, dann hat man abrupte Lautstärkeschwankungen. Fällt aber nicht so sehr ins Gewicht... schaltet man einfach einen Widerstand zwischen dem Lausprecher Plus Kabel, so das man die gewünschte Lautstärke bekommt. Ansonsten kann man noch ein digitales Mini-Potentiometer verbauen: AD5171 und die Lautstärke über einen Arduino Analog-Pin steuern. Das gleiche wie mit dem Teensy kann man natürlich auch mit einem Arduino Pro Micro oder Mini Pro machen (Modul huckepack nehmen).
Hier der code:
1 | /* |
2 | |
3 | WTV020SD16 Sound-Modul (3.3V) |
4 | |
5 | ------- ------- |
6 | /RESET o \/ o +3.3V |
7 | AUDIO o o /BUSY |
8 | NC o -------- o NC |
9 | SPK+ o | |||||| | o Next Sound |
10 | SPK- o | | o Prev Sound |
11 | NC o | SD | o NC |
12 | CLK o | | o DATA |
13 | GND o -------- o Pause/Play |
14 | ---------------- |
15 | |
16 | |
17 | If you need a lot of pins of the Teensy, then you can remove and not solder the following Pins: |
18 | |
19 | - AUDIO |
20 | - NC |
21 | - Next Sound |
22 | - Prev Sound |
23 | - Pause/Play |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | If you need a Volume Control, then you can use the AD5171 Digital Potentiometer: |
30 | |
31 | Link: https://www.arduino.cc/en/Tutorial/DigitalPotentiometer |
32 | |
33 | |
34 | SPK+ (IN) >-----------------------┐ |
35 | 1 | |
36 | ┌────────────┐ | |
37 | SPK+ (Out) <------o W (OUT) A o-<-┘ |
38 | +5V --------------o +5V B o-------┐ |
39 | GND --------------o GND ADD o-------┤ |
40 | A4 --------------o SCL SDA o---┐ | |
41 | └────────────┘ | | |
42 | | | |
43 | A5 -------------------------------┘ | |
44 | | |
45 | GND -----------------------------------┘ |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | File-Formats: |
52 | ------------- |
53 | |
54 | - Wave Files: 16 Bit, 6KHz to 16 Khz |
55 | |
56 | 0000.wav |
57 | 0001.wav |
58 | . |
59 | 0XXX.wav (max. 512 files) |
60 | |
61 | |
62 | |
63 | - AD4 Files: 16 Bit, 6KHz to 36KHz (4 Bit ADCPM format files) |
64 | |
65 | 0000.ad4 |
66 | 0001.ad4 |
67 | . |
68 | 0XXX.ad4 (max. 512 files) |
69 | |
70 | |
71 | */ |
72 | |
73 | boolean debug = true; |
74 | |
75 | |
76 | const int resetPin = 6; |
77 | const int clockPin = 12; |
78 | const int dataPin = 13; |
79 | const int busyPin = 18; |
80 | |
81 | int busyPinState = HIGH; |
82 | |
83 | void setup() { |
84 | |
85 | if(debug) Serial.begin(115200); |
86 | |
87 | pinMode(resetPin, OUTPUT); |
88 | pinMode(clockPin, OUTPUT); |
89 | pinMode(dataPin, OUTPUT); |
90 | pinMode(busyPin, INPUT); |
91 | |
92 | |
93 | pinMode(A1, OUTPUT); |
94 | |
95 | |
96 | delay(1000); // * Wait for the Pins * |
97 | |
98 | |
99 | resetModule(); |
100 | sendCommand(0xfff7); // * Volume has to be "FULL VOLUME" 7 (Hardware Bug!) must be set, because after Power on or Reset Button sometimes the sound will not start! * |
101 | |
102 | } |
103 | |
104 | void loop() { |
105 | |
106 | |
107 | startSoundInBackground(0); |
108 | delay(12000); |
109 | |
110 | } |
111 | |
112 | |
113 | void resetModule(){ |
114 | |
115 | digitalWrite(resetPin, HIGH); |
116 | digitalWrite(resetPin, LOW); |
117 | delay(5); |
118 | |
119 | digitalWrite(resetPin, HIGH); |
120 | digitalWrite(clockPin,HIGH); |
121 | |
122 | // * Wait * |
123 | delay(500); |
124 | } |
125 | |
126 | |
127 | void startSoundInBackground(int soundNumber){ |
128 | |
129 | sendCommand(soundNumber); |
130 | } |
131 | |
132 | void startSoundAndWaitTilEnd(int soundNumber){ |
133 | |
134 | sendCommand(soundNumber); |
135 | |
136 | busyPinState=digitalRead(busyPin); |
137 | while(busyPinState==HIGH) busyPinState=digitalRead(busyPin); |
138 | } |
139 | |
140 | void stopSound() { |
141 | sendCommand(0xFFFF); |
142 | } |
143 | |
144 | |
145 | |
146 | void sendCommand(unsigned int command) { |
147 | |
148 | if(debug) Serial.println("--------------"); |
149 | if(debug) Serial.print("Command ("); |
150 | if(debug) Serial.print(command, HEX); |
151 | if(debug) Serial.println(")"); |
152 | |
153 | //Start bit Low level pulse. |
154 | digitalWrite(clockPin, LOW); |
155 | delay(2); |
156 | |
157 | |
158 | // * 0x8000 = 100000000 00000000 = 16 Bits, Send Command as Serial Transfer * |
159 | for (unsigned int mask = 0x8000; mask > 0; mask >>= 1) { |
160 | |
161 | digitalWrite(clockPin, LOW); |
162 | delayMicroseconds(50); |
163 | |
164 | // * Set Data-Bit on the Line * |
165 | if (command & mask) { |
166 | |
167 | Serial.print("1"); |
168 | digitalWrite(dataPin, HIGH); |
169 | } |
170 | else { |
171 | |
172 | if(debug) Serial.print("0"); |
173 | digitalWrite(dataPin, LOW); |
174 | } |
175 | if(debug) Serial.print(" "); |
176 | |
177 | // * Wait 50us * |
178 | delayMicroseconds(50); |
179 | |
180 | // * Clock: High ... time to get Data-Bit * |
181 | digitalWrite(clockPin, HIGH); |
182 | |
183 | // * Wait some time to give time to read the bit (possible values: 5-6500us) * |
184 | delayMicroseconds(50); |
185 | } |
186 | |
187 | if(debug) Serial.println(" "); |
188 | |
189 | |
190 | // * Give Busy time to go "High" * |
191 | delay(50); |
192 | } |
Habe wahrscheinlich rausgefunden warum setVolume() Probleme macht. Normalerweise kann man laut Datenblatt Werte zwischen 0-7 einstellen, doch bei mir funktioniert das nur von 4 bis 7. Werte unter 4 führen zu einer zufälligen und abrupten Lautstärke-Modulation (Sound wird alle paar ms lauter/leiser und wirkt zerkratzt). Kann sein das es an den 3.3V liegt... oder das der DA einen bestimmten Grundpegel benötigt. Vielleicht treten die Probleme mit der 5V Brücke auf dem Modul nicht auf. Naja, egal... zwar funktioniert nun soweit alles (auch setVolume), habe mir aber nun das MP3 TF 16P Modul bestellt (kostet 10€ anstatt 5€), was im Prinzip genauso groß ist wie das WTV020, nur kann man direkt MP3 Files auf die SD Karte ablegen und abspielen, ohne alles in das AD4 Format konvertieren zu müssen.
Das funktioniert:
1 | // * Volume 0-4 (0 = Off) * |
2 | void setVolume(int volume) { |
3 | |
4 | if(volume >=0 && volume < 5) { |
5 | |
6 | if(volume == 0) sendCommand(0xFFF0); |
7 | else sendCommand(0xFFF0+3+volume); |
8 | } |
9 | } |
Noch etwas... man kann bei der Lautstärke nicht Stufen überspringen... führt auch sporadisch zur Zerstörung des Sounds (mal geht es, mal nicht). Man muss, wenn man von Lautstärke 4 kommt und auf 1 will... zuerst 3 und 2 senden, dann 1. Das funktioniert aber dafür zuverlässig, wie es scheint. Also das Modul ist schon ziemlich buggy, wenn man nicht ein wenig trickst :)
So hier der veränderte komplette Code mit der neuen Volume Stepping Funktion: void setVolume(int targetVol) Soweit ich das sehen konnte, sind nun alle Probleme damit umschifft.
1 | |
2 | |
3 | |
4 | boolean debug = true; |
5 | |
6 | |
7 | const int resetPin = 6; |
8 | const int clockPin = 12; |
9 | const int dataPin = 13; |
10 | const int busyPin = 18; |
11 | |
12 | int busyPinState = HIGH; |
13 | |
14 | |
15 | int volume = 4; |
16 | |
17 | |
18 | void setup() { |
19 | |
20 | if(debug) Serial.begin(115200); |
21 | |
22 | pinMode(resetPin, OUTPUT); |
23 | pinMode(clockPin, OUTPUT); |
24 | pinMode(dataPin, OUTPUT); |
25 | pinMode(busyPin, INPUT); |
26 | |
27 | |
28 | pinMode(A1, OUTPUT); |
29 | |
30 | |
31 | delay(1000); // * Wait for the Pins * |
32 | |
33 | resetModule(); |
34 | |
35 | } |
36 | |
37 | void loop() { |
38 | |
39 | startSoundInBackground(0); |
40 | |
41 | |
42 | setVolume(4); |
43 | delay(3000); |
44 | setVolume(1); |
45 | delay(3000); |
46 | setVolume(3); |
47 | delay(3000); |
48 | setVolume(1); |
49 | delay(3000); |
50 | setVolume(0); |
51 | delay(3000); |
52 | setVolume(4); |
53 | delay(3000); |
54 | setVolume(2); |
55 | delay(3000); |
56 | setVolume(3); |
57 | delay(3000); |
58 | setVolume(4); |
59 | delay(3000); |
60 | |
61 | |
62 | delay(2000); |
63 | |
64 | } |
65 | |
66 | |
67 | void resetModule(){ |
68 | |
69 | digitalWrite(resetPin, HIGH); |
70 | digitalWrite(resetPin, LOW); |
71 | delay(5); |
72 | |
73 | digitalWrite(resetPin, HIGH); |
74 | digitalWrite(clockPin,HIGH); |
75 | |
76 | // * Wait * |
77 | delay(700); |
78 | |
79 | // * Volume has to be "FULL VOLUME" 7 (Hardware Bug!) must be set, because after Power on or Reset Button sometimes the sound will not start! * |
80 | sendCommand(0xfff7); |
81 | } |
82 | |
83 | |
84 | void startSoundInBackground(int soundNumber){ |
85 | |
86 | sendCommand(soundNumber); |
87 | } |
88 | |
89 | void startSoundAndWaitTilEnd(int soundNumber){ |
90 | |
91 | sendCommand(soundNumber); |
92 | |
93 | busyPinState=digitalRead(busyPin); |
94 | while(busyPinState==HIGH) busyPinState=digitalRead(busyPin); |
95 | } |
96 | |
97 | void stopSound() { |
98 | sendCommand(0xFFFF); |
99 | } |
100 | |
101 | |
102 | // * Volume 0-4 (0 = Off) * |
103 | void setVolume(int targetVol) { |
104 | |
105 | // * maybe because of the 3.3V the value can not be lower 4, volume < 4 = random volume modulation => distrotion * |
106 | if(targetVol >=0 && targetVol < 5) { |
107 | |
108 | if(targetVol == 0) sendCommand(0xFFF0); |
109 | else { |
110 | |
111 | if(targetVol > volume) { |
112 | |
113 | int steps = targetVol-volume; |
114 | for(int i=0;i<steps;i++) { |
115 | volume++; |
116 | sendCommand(0xFFF0+3+volume); |
117 | delay(800); // * without this delay... the sound will be destroyed |
118 | } |
119 | } |
120 | else if(targetVol < volume) { |
121 | |
122 | int steps = volume-targetVol; |
123 | for(int i=0;i<steps;i++) { |
124 | volume--; |
125 | sendCommand(0xFFF0+3+volume); |
126 | delay(800); // * without this delay... the sound will be destroyed |
127 | } |
128 | } |
129 | } |
130 | } |
131 | } |
132 | |
133 | |
134 | void sendCommand(unsigned int command) { |
135 | |
136 | if(debug) Serial.println("--------------"); |
137 | if(debug) Serial.print("Command ("); |
138 | if(debug) Serial.print(command, HEX); |
139 | if(debug) Serial.println(")"); |
140 | |
141 | //Start bit Low level pulse. |
142 | digitalWrite(clockPin, LOW); |
143 | delay(2); |
144 | |
145 | |
146 | // * 0x8000 = 100000000 00000000 = 16 Bits, Send Command as Serial Transfer * |
147 | for (unsigned int mask = 0x8000; mask > 0; mask >>= 1) { |
148 | |
149 | digitalWrite(clockPin, LOW); |
150 | delayMicroseconds(50); |
151 | |
152 | // * Set Data-Bit on the Line * |
153 | if (command & mask) { |
154 | |
155 | Serial.print("1"); |
156 | digitalWrite(dataPin, HIGH); |
157 | } |
158 | else { |
159 | |
160 | if(debug) Serial.print("0"); |
161 | digitalWrite(dataPin, LOW); |
162 | } |
163 | if(debug) Serial.print(" "); |
164 | |
165 | // * Wait 50us * |
166 | delayMicroseconds(50); |
167 | |
168 | // * Clock: High ... time to get Data-Bit * |
169 | digitalWrite(clockPin, HIGH); |
170 | |
171 | // * Wait some time to give time to read the bit (possible values: 5-6500us) * |
172 | delayMicroseconds(50); |
173 | } |
174 | |
175 | if(debug) Serial.println(" "); |
176 | |
177 | |
178 | // * Give Busy time to go "High" * |
179 | delay(50); |
180 | } |
hallo ... Can you help me convert my audio format (.wav) I have audio sounds of traditional musical instruments, I want to convert to (ad4), I am always a failure in converting to ad4 (no sound excessive noise and the results are not clear) help me ... convert me to vote in module wtv020 kept clean of noise ... please send me the file ad4 his already clean of noise yes,,,, in my email ... fefendy131@gmail.com ... This is my project for college thesis,,,, thanks
I use this Solutione. It works for me http://www.buildcircuit.com/how-to-convert-mp3-and-wav-files-to-ad4-format-wtv020sd-tutorial/
I've tried on yesterday,,,,,, but the result is ugly sound levels fluctuate sometimes small and sometimes big brother ..... .... please help me before I got over koment audio file .... please help the convert to ad4,,, I've tried several times but the result is not perfect,,,, if pleased ... send me the results of his ad4 in fefendy131@gmail.com ... please
Lalu Fendy schrieb: > I've tried on yesterday,,,,,, but the result is ugly sound levels > fluctuate sometimes small and sometimes big brother This is a setVolume issue. You have to set it to 7 Use my code 4 posts above. Then its working fine.
Hier mein AD4 Soundfile Konverter (Java). Quelldateien (wav, ogg, mp3) müssen in 16Bit vorliegen (8 Bit oder 24 Bit funktionieren nicht). Pegelanpassung auf -6dB und Mono Channel erfolgen automatisch. Muss also nicht vorher extra von Hand gemacht werden.
Bei mir hat das Modul erst funktioniert nachdem ich die 1GB SD-Card mit dem Formatierungstool von der SD Card Assosiation formatiert habe. Vorher war nur ein leises knacken bei "play" oder "next" zu höhren. Die "busy LED" hat dann für ca. 2 Sekunden geleuchtet. Die Brücke für die Spannungswahl musste gesetzt werden, die reset Verbindung war nicht nötig. https://www.sdcard.org/downloads/formatter_4/index.html
Ich habe jetzt mal meinen Vorrat durchgeprüft. Von 5 "WTV020-SD Mini" waren 3 auf Anhieb funktionsfähig. Die 2 Stück, die nicht wollten, ließen sich durch Reinigen der Platine (Lötzinnperlen) zur Funktion überreden. Von 8 "WTV020M01 V1.00" funktionierten 3 auf Anhieb. Die restlichen 5 ließen sich durch Reinigen der Platine und Kontakte des Kartenhalters funktionsfähig machen. Die oben beschriebene Masse-Brücke war definitiv nicht nötig. Die Dinger sind einfach schlampig produziert, der Qualitäts-Check beschränkt sich wohl auf das Aufkleben der Etiketten. Es kamen Speicherkarten von 64 MB und 128 MB zum Einsatz, die keinerlei Sonderbehandlung brauchten. Es wurden WAV-Dateien im Format 8 Bit Mono mit Sampleraten von 8 bis 16 kHz benutzt. Die Ansteuerung erfolgte von einem Pro-Mini (Arduino-Klon mit Mega328P) als StateMachine nebenher in einem Chronjob (im 2 ms-Raster, Entprellung der Radsensoren der Gartenbahn-Dampflok), wobei der Mega328 nebenher je nach Fahrsituation noch mehrere voneinander unabhängige Sounds erzeugt (Grundrauschen, gelegentliches lautes Zischen, Kolbenschläge zweier Triebwerke (Mallet), Zylinderentwässerung, Dampf-Pfeife, Glocke, Bremsenquietschen und Dampf-Luftpumpe). Einen Wermutstropfen hat die Sache aber noch. Die Module spielen die Dateien nicht bis zum Ende, sondern geben auch noch den Rest des letzten angefangenen Clusters wieder. Das ergibt bei ungünstiger Dateilänge hässliche Knackser am Ende. ...
also ich habe jetzt alles am Modul so belassen (also auch die Massebrücke) und auch die "Wtv020sd16p" library verwendet. Die Volume-Steuerung funktioniert bei mir von 4 bis 7, alles Andere führt zu dem von @Tester beschriebenen Merkwürdigkeiten. Ich habe normale mp3´s in ad4 umgewandelt und auf eine 2 GB Karte gespielt. Hier das Ergebnis: https://youtu.be/1IzQIGjYH-s
witzig: ich habe heute mal meinen ganzen Arduino Kram auf einem anderen Rechner installiert, die Sketches etc. einfach rüber kopiert. Um es sauber zu haben, habe ich auch die Wtv020SD16p library neu runtergeladen und via library-Manager installiert. Beispiel-Code zum Testen kompiliert und er bricht mit "Wtv020sd16pExample:54: error: 'class Wtv020sd16p' has no member named 'setVolume' wtv020sd16p.setVolume(3);" ab. Hm, warum das ? Das Beispiel sollte doch funktionieren ? Tatsächlich ist aber in der neu runtergeladenen Version der library der Befehl "setVolume" entfernt worden. Vermutlich wegen der Probleme. Oder "setVolume" gehörte nie wirklich in die Bibliothek und ich hatte das sonstwo her ^^.
Hallo Ich hoffe hier bin ich richtig. Habe mir auch ein MTV020M01 V1.0 vom 12.01.2012 geleistet. Es soll mur auf Tastedruck eine Melodie wiedergeben. Doch Totenstille. Die Original Sample Dateien 0001.ad4 draufgespielt. Ich habe den GMD (PIN6) mit der Brücke (SD_Karte) gemacht. Neu formatiert ( FAT Standart, FAT 32, exFAT) alles bringt nicht´s. Die busy LED gibt zwar auch was von sich, aber egal ob ich resete oder die vorwärts Tase betägte - es sieht alles gleich aus. Was mache ich falsch?? HILFE
Tom W. schrieb: > Die Original Sample Dateien 0001.ad4 draufgespielt. Auf was für eine Karte? (Kapazität) > Ich habe den GMD (PIN6) mit der Brücke (SD_Karte) gemacht. Ist nicht nötig. > Neu formatiert ( FAT Standart, FAT 32, exFAT) alles bringt nicht´s. Was verstehst Du unter Standart bzw. Standard? Die Karte sollte unter 2 MiB Kapazität haben und mit FAT16 formatiert sein. > Die busy LED gibt zwar auch was von sich, Das zeigt doch schonmal, dass das Modul versucht, die Karte zu lesen. > aber egal ob ich resete oder > die vorwärts Tase betägte - es sieht alles gleich aus. > Was mache ich falsch?? Das weiß ich nicht. Hast Du auch diesen Beitrag gelesen? Beitrag "Re: Arduino mit WTV020-M01" ...
Ich hab jetzt nochmal mein zweites Modul, was auf dem Breadboard steckt probiert. Entferne ich die Brücke von GND nach SD-Card Pin 6, dann spielt das Modul nichts ab. Die Busy - LED tut zwar was, aber mehr nicht. Außerdem reicht es schon mit einem offenen Draht am Reset-Pin rumzufingern und das Modul tut irgendwas (resetet sich ?) , zumindest flackert die Busy-LED bzw. bleibt für 17 Sekunden dauerhaft an. Drückt man dann Play oder Titel vor oder rück, dann leuchtet die Busy-LED wieder für 17 Sekunden. Meinem Modul tut die Masse-Brücke jedenfalls gut.
ich habe den wtv020 m01... und er funktioniert grundsätzlich allerdings bricht das modul den ton nach ca 1-2 sekunde wieder ab(unterschiedlich) bitte bitte bitte kann mir irgendjemand sagen was ich falsch mache
das passiert auch, wenn der Pegel des files zu hoch ist. Nutze mal das Java-Tool von weiter oben, da wird der Pegel automatisch reduziert.
Hallo Markus, da ich ebenfalls mit den WTV20 Modulen arbeiten möchte (allerdings an einem LPC1769)und mit der im Internet verfügbaren Dokumentation nicht wirklich zurecht komme, bin ich gerade dabei deinen Code zu portieren. Da ich mit einem Adruino keinerlei Erfahrung habe, wollte ich kurz ein paar Punkte gegen prüfen. Wenn ich das richtig sehe nutzt ihr die SCL und SDA Anschlüsse, sprich I2C allerdings kann ich im Code weder eine Adresse sehen noch glaube ich das die Module BUS fähig sind... Ist das soweit Korrekt?
Hallo nochmal, die Frage hat sich soeben geklärt..Das ist ja ein eigenes Protokoll.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.