Hallo!
Ich habe ein neues Problem: Ich möchte eine WAV-Datei von einer µSD-Karte abspielen. Über einen Pin soll dann mit einer PWM-Rate von 200 kHz die Datei abgespielt werden. Nur will das nicht so, wie ich es will. Ich habe damit angefangen, mich bei Wikipedia schlau zu machen. Da habe ich herausgefunden, dass es die Daten erst nach einem "data" in der Datei kommen, dass das höherwertige byte nach dem niederwertigen kommt und dass links vor rechts kommt, was aber bei Mono-Dateien egal sein dürfte. Meine Datei hat eine Abtastrate von 22050 Hz und ist 16-bit-mono. Das hat mich zu folgendem Programm veranlasst:
#include <SD.h>
File file;
void setup() {
Serial.begin(1000000);
Serial.println();
Serial.println();
Serial.print("SD ... ");
while(!SD.begin(SS)){
yield();
}
Serial.println("OK");
analogWriteFreq(200000);
file = SD.open("shades.wav", FILE_READ);
char ch[4];
while(true){
for(byte i = 3;i > 0;i--){
ch[i] = ch[i - 1];
}
ch[0] = file.read();
if(ch[3] == 'd' &&
ch[2] == 'a' &&
ch[1] == 't' &&
ch[0] == 'a'){
Serial.println("habs");
Serial.println(file.position());
break;
}
for(byte i = 0;i < 4;i++){
Serial.write(ch[3 - i]);
}
Serial.println();
delay(50);
}
}
void loop() {
uint16_t buffer[1024];
file.read((byte*)buffer, 2048);
//Serial.println("1");
for(uint16_t i = 1;i < 1024;i++){
byte j = buffer[i] >> 8;
buffer[i] <<= 8;
buffer[i] |= j;
}
//Serial.println("2");
for(uint16_t i = 1;i < 1024;i++){
analogWrite(16, map(buffer[i], -64, 63, 0, 1));
Serial.println(buffer[i]);
delayMicroseconds(1000000 / 22050);
}
}
Ich habe das Musikstück "Shades" von Chris Hülsbeck auf einer SD-Karte gespeichert. Die Datenübertragung zum seriellen Monitor / Plotter erfolgt mit 1000000 Baud, da die Datei auch an den Plotter geschickt werden soll. Und das, was beim Plotter ankommt, ist auf keinen Fall "Shades". Das Stück beginnt mit einer Rechteck-Wellenform, ich bekomme nur Zacken von oben (~30000) bis unten (~-30000) angezeigt. Braucht ihr mehr Infos, um mir helfen zu können? Ich würde mich auch über einen Link zu einer guten Lib freuen.