Comment envoyer le son d'un haut-parleur
Si je programme un microcontrôleur (ATMega128) à jouer un realtone avec un haut-parleur, comment pourrais-je faire cela?
Dois-je utiliser un numérique/analogique convertisseur pour envoyer des différentes valeurs d'amplitude, ou est-ce suffisant avec la fréquence des changements? En tout cas, comment aurais-je encoder la fréquence et l'amplitude des valeurs que le président doit-il recevoir? Ai-je besoin d'une sorte de multiplexage en fréquence? Je ne parle pas juste de faire des sons simples avec le haut-parleur, comme une note, puis l'autre. Je veux jouer une vraie chanson, avec tous les instruments, les voix, etc.
Vous devez vous connecter pour publier un commentaire.
En supposant que vous avez un 8 bits non compressé 22.1 kHz mono fichier wave:
1) Bande de l'en-tête
2) Chaque 1/22,100 ème seconde:
2.1) Lecture 8 bits
2.2) l'Utilisation d'un DAC pour convertir le haut-parleur de la gamme de tension
2.3) l'Envoyer à l'orateur
Cela vous donnera [22.1 kHz/8 bits/mono] la qualité sonore et est un moyen simple de jouer réaliste des échantillons.
Tous que la fréquence des choses est nécessaire pour les différents synthétiseurs. Le haut-parleur du PC, par exemple, est effectivement un peu. Afin d'avoir des amplitudes différentes (de "aucun" et "maximum") certains trucs comme la modulation de largeur d'impulsion peut être nécessaire (maj les fréquences autour, comme vous l'avez dit, de sorte que le haut-parleur du diaphragme efficacement a plus de postes que deux).
Mais vous n'avez pas besoin de s'embêter avec ça. Tout ce que vous devez faire est de dégorger quelques 22,100 ou 44,200 échantillons sonores par seconde à la le président, à dire 8 ou 16 bits par échantillon pour désigner l'amplitude.
J'ai essayé quelque chose de similaire. Tout d'abord, vous n'aurez PAS assez de mémoire sur le microcontrôleur pour stocker une vraie chanson. Vous aurez besoin de mémoire externe pour gérer cela. Cela signifie que l'aide d'une interface SPI externe flash ou EEPROM ou quelque chose. SD est aussi bien - je pense que c'est un SPI style de l'interface. Il est le code pour le ATMegas d'interface pour cartes SD.
Le deuxième gros problème est d'obtenir les données dans un format approprié. La façon dont je voudrais faire est d'utiliser modulation de largeur d'impulsion (PWM) pour créer les différents niveaux de tension. Je crois que vous avez un 16-bit PWM sur ce microcontrôleur de sorte que vous pouvez avoir 16 bits fidélité sur votre son. Si vous avez des problèmes avec l'espace que vous pouvez utiliser 8-bit PWM à la place. Si votre son de données doit être en 8 ou 16 bits PCM avec 0x0000 étant la valeur la plus basse et 0xFFFF étant le plus élevé. Si vous voulez la musique haute-fidélité, vous devrez avoir un taux d'échantillonnage de 44 KHz pour obtenir tous les bonnes harmoniques et autres. Je crois que c'est PCM - même, comme on l'appelle sur le PC.
Alors vous aurez toutes ces valeurs - cinq minutes de musique que vous aurez 5 * 60 * 44000 = 13,200,000 16 bits de valeurs qui est 211,200,000 bits (211 mégabits, 26.4 mo). Ce sont vos besoins de stockage pour les données brutes. Le MP3 est une possibilité - là sont à l'extérieur des jetons pour cela, mais vous aurez encore de grandes exigences en matière d'espace.
Donc tous les 1/44000th d'une deuxième mise à jour d'une valeur dans une PWM registre. Votre fréquence PWM devront être plus élevés par 4 ou 5 c'est à dire, 5 PWM cycles par valeur.
Que votre algorithme général - mise à jour des valeurs dans un PWM registre et de le laisser aller jusqu'à la fin. Vous aurez besoin d'au moins un filtre sur la sortie de limiter les fréquences de la gamme audible de 20KHz (plus si vous êtes un audiophile). Un filtre RC fonctionne, mais je voudrais aller un filtre actif, PARCE que si vous êtes en utilisant PWM votre gamme de sortie sera de 0 à 5V généralement avec la tension moyenne étant d'environ 2,5 V. haut-Parleurs n'aime pas DC niveaux - seulement des signaux. Jolie ondes sinusoïdales qui ont un 0 moyenne tension. Si votre filtre actif ont pour ajuster les niveaux de tension et de l'utilisation d'alimentations doubles pour fournir des tensions négatives. Vous pouvez également amplifier le signal pour le gros pompage basse. Il suffit de ne pas souffler sur vos haut-parleurs.
MP3 est probablement la meilleure alternative à la PCM. Il y a des frites là: http://www.sparkfun.com/commerce/product_info.php?products_id=8892
Qui est, cependant, un ensemble de micro-contrôleur. Et vous en avez déjà un. Mais avouons - le ATMega ne va pas se faire des MP3 sur son propre, bientôt, peu importe comment vous le jazz vers le haut.
Il ressemble à la waveshield référencé ci-dessus se fait de ce - utilise une carte SD pour le stockage de PCM et un amplificateur externe pour le son. Bonne chance!
Une méthode pour la génération d'un ton ferme est Synthèse Numérique Directe. Vous aurez besoin d'un DAC, soit d'une puce dédiée ou une résistance échelle.
Vous configurez un compteur de dépassement à la fréquence que vous souhaitez générer, et à chaque tick de la contre vous de l'utiliser pour indexer une table d'onde et d'obtenir une valeur de sortie de votre DAC.
J'ai écrit un couple de tonalité différentes techniques de génération pour l'Arduino ici à De Nouveaux Bruits De MidiVox. Le DAC de la mise à jour de code est spécifique à MidiVox (et le Adafruit WaveShield s) MCP4921, mais la génération de signaux sinusoïdaux devrait être généralement applicables. J'ai essayé de garder le code pour la plupart générale à ATmegas, mais il ya un couple de Arduino-ismes qui s'installe.
Collé à partir de ce post, voici un peu de code pour jouer un 440Hz ton sur un Arduino avec un MCP4921 sur le bus SPI:
La chouette chose à propos de la Synthèse Numérique Directe est qu'il est extrêmement facile de jouer de plusieurs tons ensemble (par addition) ou de les mélanger à des volumes (en multipliant par le volume avant de l'ajouter).
J'ai trouvé que l'Arduino peut jouer environ 30 sons en même temps à l'aide de cette méthode. Ma demande est pour L'orgue Hammond de simulation, et qui peut s'avérer utile de la lecture.
Aujourd'hui, il est à la fois facile et pas cher à jouer des fichiers MP3 à partir d'un 8-bits de microcontrôleur. Vous avez besoin d'un périphérique de mémoire (une carte SD par exemple) et une puce MP3. Voir ce l'article par exemple. Vous pouvez trouver beaucoup plus à avrfreaks. De là, vous pouvez également trouver des articles pour la lecture des sons sans une puce externe.
Vous pouvez jouer des sons de base avec Modulation de largeur d'impulsion (PWM), mais pour une vraie chanson, vous auriez besoin d'un DAC. J'ai vu des projets qui ont joué des fichiers MP3 en utilisant seulement un DAC et de logiciels, mais ils participent le plus puissant des microcontrôleurs ARM.
Si vous vous sentez particulièrement créatifs, vous pouvez créer vos propres numérique-analogique convertisseur à l'aide d'un résistance échelle.
Si vous êtes en utilisant un Arduino, vous pouvez acheter Lady Ada WaveShield pour la somme de 22 usd. Lady Ada offre de nombreuses Arduino goodies la valeur d'achat. Quelques exemples sont le GPS, Ethernet et moteurs pas à pas/servo boucliers.
Vous pouvez prendre un coup d'oeil à la open source lecteur MP3 et de voir comment ils le font. Ma conjecture est que vous aurez besoin d'un convertisseur D/A à produire des sons d'une qualité décente.
Vous n'avez pas assez d'espace sur l'ATMega128 à faire quelque chose de trop de fantaisie. La façon la plus simple de connecter le haut-parleur (petit 2" ou moins) par l'intermédiaire d'une résistance. Vérifiez le naufrage de la capacité de la production et de calculer R en conséquence.
En ce qui concerne la production de tons, de base de la commutation de la sortie de produire de base stylaphone sondage crapolla. Vous pouvez utiliser la modulation de largeur d'impulsion pour produire des approximations de toute son analogique (trop complexe pour aller dans l'ici et de l'AtMega ne sera probablement pas avoir assez de pâte feuilletée ou de stockage). C'était la méthode utilisée pour effectuer les pilotes audio pour Pc sans carte son (seul le haut-parleur intégré) dans le bon vieux jours...