Go Down

Topic: Teddy Bear mp3 (Read 4 times) previous topic - next topic

sven1977

Wieso könnt ihr nicht einfach ne Ampel machen ?
So wie ich das hier so mitbekommen habe, sind eure
Vorkenntnisse doch sehr sehr beschränkt.

Aber gut...

Als Lib braucht ihr nur die für die SD Karte. Auf die SD Karte kopiert ihr dann das WAV File in 8Bit und 22kHz.
Dann schickt ihr die Daten mit dem Arduino von der SD Karte Bit für Bit auf einen Analogen Pin.
Dabei solltet ihr darauf achten, den Takt von 22050 Bits pro sec.  einzuhalten. Sonst wird der Sound
zu schnell oder zu langsam abgespielt.

Ich weiss nicht so genau wie das mit Arduino geht. Aber mit BASCOM ging das auf jeden Fall und ich denke
mit Arduino auch.

Das lesen von der SD Karte benötigt Zeit und und lässt kaum Platz für mehr kHz. Aber mit Bascom konnte ich
das mit dem Interrupt machen, der im 44100 Mhz die Daten auf den analogen Pin schaufelt. Dafür brauchte ich
aber nen doppelten Buffer von 1Kb ( 2 x 512 byte ) der abwechselnd die Daten von der SD Karte ließt.
Allerdings habe ich die SD Karte im raw Modus gelesen. Mit Fat braucht der Arduino wohl noch etwas mehr Zeit.
Also nur 22 kHz.....


jurs


Aber mit Bascom konnte ich das mit dem Interrupt machen, der im 44100 Mhz die Daten auf den analogen Pin schaufelt.


Wow, 44100 Mhz! Also über 44 Gigahertz zaubert Bascom aus einem einfachen Controller!

Mit solchen Super-Fähigkeiten wie Dein BASCOM kann ARDUINO natürlich überhaupt nicht mithalten!
;-)

Anyway, weil das hier ein ARDUINO und kein BASCOM-Forum ist, poste ich dann hier mal zum Testen ein bischen was zum Töne machen für eines der schlappen ARDUINO-Boards, die bei 44100 Mhz nicht mithalten können.

Ohne SD-Karte.
Ohne Library.
Nur die tone()-Funktion von Arduino.

Code: [Select]

// Arduino-Code zum Abspielen von Melodien
// ueber Kopfhoerer oder Kleinlautsprecher per PWM
// frei nach "Tuerklingel von M. Baudisch 12/2008"

// Benoetigte Bauteile:
// 1. Arduino-Board
// 2. Kleinstlautsprecher 8 Ohm
// 3. Elektrolytkondensator 1 ... 100 uF (Mikrofarad)
// Reihenschaltung vom LAUTSPRECHERPIN am Board, Kondensator, Lautsprecher zu Ground
// Achtung: Elektrolytkondensator immer polrichtig anschließen!
// Pluspolseite des Kondensators zum Ausgangspin am Board
// Minuspolseite des Kondensators zur GND-Seite
// Falls kein Kondensator zur Hand, ggf. 100 KOhm Widerstand verwenden
// (mit Widerstand statt Kondensator ist die Lautstaerke aber deutlich geringer)
// Alternative Beschaltung:
// Statt eines Lautsprechers Anschluss am Line-In Eingang eines Verstaerkers

#define LAUTSPRECHERPIN 9

uint16_t ton[]=
{
262, // c Timerwerte fuer die enspr. Tonhoehen in Hz
277, //cis
294, //d
311, //dis
330, //e
349, //f
370, //fis
392, //g
416, //gis
440, //a
466, //b
495, //h
524, //c'
554, //cis'
588, //d'
622, //dis'
660, //e'
698, //f'
740, //fis'
784, //g'
831, //gis'
880, //a'
929, //b'
992, //h'
1050, //c''
1106, //cis''
1179, //d''
1244, //dis''
1316, //e'
1397, //f''
1562, //g'' auf position von fis'' verschoben
};

uint8_t zeit[] =  // Notenlaengen
// beim Abspielen werden die Notenlaengen mit einem Faktor
// multipliziert, um die Notenlaenge im Millisekunden zu erhalten
{
2, //1/32 Note
3, //1/32. dito punktiert
4, //1/16 Note
6, //1/16. dite punktiert
8, //1/8 Achtelnote
12,//1/8.
16,//1/4 Viertelnote
24,//1/4.
};

//Format Lied :
//1. Byte: speed 2 schnell, 3..5 normal
//2. Byte - n Byte Noten

//Aufbau eines Notenbytes:

//Bit
// 7  6  5  4  3  2  1  0
// |__|__|  |__|__|__|__|_Tonhoehe ( 1..31 (C..G'') incl. aller Halbtonschritte
//    |                                             ausser 31: G'' statt FIS''
//    |                                     wenn 0, kein Ton sondern Pause
//    |
//    |___________________________________________Tonlaenge
//
//                                                7: 1/4.
//                                                6: 1/4
//                                                5: 1/8.
//                                                4: 1/8
//                                                3: 1/16.
//                                                2: 1/16
//                                                1: 1/32.
//                                                0: 1/32
//




void playTeddy(byte *lied, byte anzNoten)
// Parameter *lied ==> Bytepointer auf die Noten des Lieds
// Parameter anzNoten ==> Anzahl der Noten im Lied
{
  byte lspeed=0;
  byte dauer;
  byte hoehe;
  byte note ;
  byte i;
  lspeed= pgm_read_byte(lied); // im ersten Byte die Abspielgeschwindigkeit lesen
//  Serial.print("Speed: ");Serial.print(lspeed);Serial.println();
//  Serial.print("Anzahl Noten: ");Serial.print(anzNoten);Serial.println();
  for (i=1;i<anzNoten;i++)
  {
    note=pgm_read_byte(lied+i); //Note holen
//    Serial.println(note);
    hoehe=note & 0x1f; //Tonhöhe ausmaskieren (5 Bit)
    dauer= zeit[(note >> 5)]; // 5 Bit nach rechts schieben und Zeit holen
    if (hoehe) //wenn keine Pause
    {
       tone(LAUTSPRECHERPIN,ton[hoehe-1]);
       delay(int(dauer)*int(lspeed)*int(25));
       noTone(LAUTSPRECHERPIN);
       delay(25);
    }
    else
     delay(dauer);
  }   
  noTone(LAUTSPRECHERPIN);
}


// Ein paar wenige kurze Melodien,
// um RAM-Speicher zu sparen als "PROGMEM"-Variablen deklariert
byte lied_1[] PROGMEM={3,13,82,22,82,13,76,148,18,81,20,81,13,74,146,13,82,22,82,13,76,148,18,81,13,79,17,210};
byte lied_2[] PROGMEM={2,10,8,202,202,8,6,3,5,194,0,163,192,10,8,202,202,101,102,98,195};
byte lied_3[] PROGMEM={4,65,65,3,6,5,3,72,72,8,10,5,6,67,67,3,6,5,3,1,12,10,8,6,5,3,129};
byte lied_4[] PROGMEM={3,5,106,5,113,10,78,12,14,74,69,74,83,81,14,15,177,0,5,74,83,81,14,15,81,12,14,74,69,74,14,15,108,10,138};
byte lied_5[] PROGMEM={4,100,3,1,3,4,8,107,10,8,10,11,15,178,64,102,5,3,5,6,10,109,12,10,12,13,17,180,128};
byte lied_6[] PROGMEM={3,70,6,6,70,6,6,6,6,6,6,6,10,1,1,70,6,6,70,6,6,6,6,6,6,3,1,64,70,6,6,70,6,6,6,6,6,6,6,10,64,173,74,13,10,6,64,128};
byte lied_7[] PROGMEM={2,8,74,8,69,77,74,168,8,10,8,10,72,77,172,64,6,72,6,67,76,74,168,8,10,8,10,72,74,165};
byte lied_8[] PROGMEM={2,1,1,65,1,1,65,1,1,6,72,74,0,1,1,65,1,1,65,10,10,8,69,65,0,1,1,65,1,1,65,1,1,6,72,74,0,6,10,77,13,13,13,11,10,8,6,106,6};
byte lied_9[] PROGMEM={3,81,17,17,17,17,17,81,74,77,81,79,15,15,15,15,15,15,8,0,76,79,81,17,17,17,17,17,17,19,20,22,0,84,81,15,12,0,74,0,74};
byte lied_10[] PROGMEM={5,6,8,8,6,72,0,8,6,8,10,8,6,5,6,6,5,70,0,6,5,6,8,6,69,0,3,5,5,3,69,0,3,5,6,5,3,0,139};

void setup() {
  Serial.begin(9600); // Serielle Schnittstelle initialisieren
}

void loop()
{
  // Spielt die 10 kurzen Melodien in Endlosschleife
  playTeddy(lied_1,sizeof(lied_1));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_2,sizeof(lied_2));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_3,sizeof(lied_3));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_4,sizeof(lied_4));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_5,sizeof(lied_5));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_6,sizeof(lied_6));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_7,sizeof(lied_7));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_8,sizeof(lied_8));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_9,sizeof(lied_9));
  delay(2000); // Kurze Pause nach der Melodie
  playTeddy(lied_10,sizeof(lied_10));
  delay(2000); // Kurze Pause nach der Melodie
}


Damit ihr Euren Lautsprecher wenigstens mal etwas testen könnt, bevor ihr anfangt, etwas mit der SD-Karte zu machen.


sven1977

Ups.... 44100 Mhz ist natürlich Quatsch... hab mich verschrieben... Hz natürlich.
Ich arbeite auch gerade daran das mit Arduino zu machen. Die ersten Tests
laufen schon prima :D

HAHA 44100 Mhz .... WOW bin ich gut... Das soll mit mal einer nachmachen...  ;)

IrgendJemand

Vielen, vielen Dank!! <33
Also wir haben den Lautsprecher so angeschlossen, dass das Programm das jurs gepostet hat läuft. Aber wir hatten ja schon so ein ähnliches gemacht gehabt das genauso läuft:
Code: [Select]

/*
Jojo und Fani Arduino Harry Potter Melodie~
*/

#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

int pin=8;


int note[] = {
  NOTE_B4, NOTE_E5,NOTE_G5, NOTE_FS5, NOTE_E5, NOTE_B5, NOTE_A5, NOTE_FS5, NOTE_E5, NOTE_G5, NOTE_FS5, NOTE_D5, NOTE_F5, NOTE_B4, NOTE_B4, NOTE_E5, NOTE_G5, NOTE_FS5, NOTE_E5, NOTE_B5, NOTE_D6, NOTE_CS6, NOTE_C6, NOTE_GS5, NOTE_C6, NOTE_B5, NOTE_AS5, NOTE_AS5, NOTE_G5, NOTE_E5};


int noteDurations[] =                               // tonlänge: 4 = viertel note 8 = achtel note, etc.:
  {4, 4, 7, 4, 2, 3, 1, 1, 3, 7, 4, 2, 4, 1, 4, 3, 8, 4, 2, 4, 2, 4, 2, 4, 3, 8, 3, 6, 4, 2, 3, 0.5};

void setup() {                                     

  for (int i = 0; i <= 29; i= i+1) {

    int noteDuration = 1000/noteDurations[i];
    tone(8, note[i],noteDuration);

    // kurze Pause zwischen den einzelnen Noten
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stopt die Melodie
    noTone(8);
  }
}

void loop() {
}


Wir wollten ja "nur" anstatt von der Melodie ein Lied einbauen und dass es auf Knopfdruck funktioniert. Außerdem haben wir das ganze jetzt an einen 9 Volt Block angeschlossen damit wir es vom Computer weg in den Teddy kriegen.
Wir verstehen nur nicht ganz wie man das Programm dazu bekommt statt der Melodie das Lied abzuspielen.


jurs


Wir verstehen nur nicht ganz wie man das Programm dazu bekommt statt der Melodie das Lied abzuspielen.


Also nochmal der Hinweis:
http://hackerspace-ffm.de/wiki/index.php?title=SimpleSDAudio

Wo hakt es denn genau?

Das Lied passend in eine 8-Bit Mono WAV-Datei zu konvertieren?

Eine SD-Karte mit FAT16 zu formatieren und die Datei im 8.3-Format auf die Karte zu kopieren?

Die SD-Karte (wohl aus der Fassung auf dem EthernetShield?) mit der SimpleSDAudio-Library anzusprechen?

Oder ist das Problem, einen Tastschalter so anzusprechen, dass das Drücken des Tasters die Abspielfunktion startet?

Go Up