Bonjour,
J'ai besoin de jouer du son grâce à un microcontrôleur.
J'ai encodé des fichiers .wav en PCM, échantillonné à 22050Hz, codé sur 8 bits non signés, mono.
Je fais mes tests dans un premier temps sur un Arduino Duemilanove (pour la facilité de programmation), mais une fois que tout fonctionnera le programme sera embarqué sur un PIC18F4550.
Le DAC que j'utilise est un TLC7226 : http://www.ti.com/lit/ds/symlink/tlc7226.pdf
Le HP est pour l'instant un écouteur haute impédance.
Je lis sans problème le fichier depuis la SD card, lorsque j'envoie les données sur le port série je vois bien les valeurs hexa défiler, autour de la valeur moyenne 0x80. Par contre le son en sortie n'est que des grésillements, avec éventuellement des petit "clac" parfois, mais la musique n'est absolument pas reconnaissable.
Inversement, si j'envoie un signal carré au DAC je l'entends parfaitement, et les mesures de tension au multimètre sont bonnes.
Voilà mon code :
Même si l'attente de 65µs est très approximative, je devrais au moins entendre le son accéléré ou ralenti.Code:#include <SD.h> /* Connexion SD Card : ** MOSI (Violet) - pin 11 ** MISO (Violet) - pin 12 ** CLK (Gris) - pin 13 ** SS (Blanc) - pin 10 */ File fichier; byte octet; int i; int pin_Enable = 8; void Ecrire_DAC(byte valeur) { int i; PORTD = valeur; digitalWrite(pin_Enable, LOW); delayMicroseconds(1); digitalWrite(pin_Enable, HIGH); //Serial.print("Ecriture de "); //Serial.println(val, HEX); } void setup() { int i; // Configuration du port série //Serial.begin(115200); // RàZ du DAC Ecrire_DAC(0); // Initialisation de la carte SD pinMode(10, OUTPUT); if(SD.begin(10)) Serial.println("Initialisation de la carte SD reussie."); else Serial.println("Echec de l'initialisation de la carte SD."); fichier = SD.open("22khz8b.wav"); if(fichier) Serial.println("Ouverture du fichier reussie."); else { Serial.println("Echec de l'ouverture du fichier."); return; } fichier.seek(3000); // On se place après les en-têtes (peut importe où). } void loop() { Ecrire_DAC(fichier.read()); delayMicroseconds(65); // Attente pour avoir environ 22kHz au final // Envoi d'un signal carré (debug) /*delayMicroseconds(500); Ecrire_DAC(0); delayMicroseconds(500); Ecrire_DAC(255);*/ }
Une idée ?
Merci d'avance.
Le fichier est bien codé en 8 bits mono (en faisant le produit durée en s * 22050 j'obtiens bien la taille du fichier)
-----