Arduino - Comment créer deux ou plusieurs sons en même temps sur un buzzer piézo?
Mon école supérieure d'électronique de classe décidé d'acheter une carte arduino uno kits, qui je dois dire sont très cool. Assez parler de ça, en ce moment dans la classe, nous sommes à expérimenter avec le buzzer piézo (il ressemble à cette). Nous avons appris à propos de la création de chansons en utilisant le buzzer piézo. Notre professeur nous a dit d'être "créatif". Quelle meilleure façon d'être créatif que l'usage de "Firework" de Katy Perry.
À l'aide de certaines libertés créatives, j'ai trouvé un joli morceau de piano de cette chanson (lien ici). Maintenant, je suis un joueur de piano (j'ai pris de l'AP théorie de la Musique), et le problème que je vais avoir, c'est que je suis seulement capable de jouer une seule note le buzzer piézo. Est-il possible de jouer la chanson sur un buzzer piézo il semble donc qu'il est joué sur un piano (ou au moins à proximité). Je veux dire comme le bass et treble clef notes sont jouées simultanément sur le buzzer.
Je comprends qu'il implique des changements de phase et l'ajout de fréquences de notes, mais comment voulez-vous traduire cela en code pour un buzzer piézo? Si vous pouviez poster un exemple de code qui serait grandement apprécié. Si non, pourriez-vous l'expliquer de la façon la plus claire possible. Je ne suis pas un expert en programmation, mais je ne suis pas un débutant non plus.
OriginalL'auteur Vishwa Iyer | 2015-03-11
Vous devez vous connecter pour publier un commentaire.
Arduinos offre exclusivement numérique de sortie: la sortie est soit sur (+5V) ou hors tension (0V). Le
tone()
fonction, qui, je vous ai couru dans ce point, les sorties un signal carré à la fréquence spécifiée.Dites que vous voulez une 100Hz ton. 100Hz signifie que la sortie se répète tous les 1/100 de seconde, ou 10ms. Donc
tone(PIN,100)
permettra de régler une minuterie d'interruption à être appelé toutes les 5ms. La première fois que l'interruption est appelée, elle fixe la sortie faible, et renvoie à ce que votre programme est en train de faire. La prochaine fois il est appelé, il fixe la sortie haute. Ainsi, toutes les 5ms les changements de sortie, et vous obtenez une onde carrée à 50% du cycle de vie, ce qui signifie que la sortie est sur c'est précisément pour la moitié du temps.Tout cela est très bien, mais la plupart des formes d'onde audio ne sont pas les ondes carrées. Si vous voulez jouer sur les deux ondes carrées de sons en même temps, ou même de contrôler le volume d'un seul carré de ton onde, vous devez être en mesure de produire plus de valeur qu'un simple "on" et "off".
La bonne nouvelle, c'est qu'il y a un truc que vous pouvez utiliser appelée modulation de largeur d'impulsion (couramment abrégé PWM). L'idée est que vous ne peut être en mesure de définir votre sortie à l'une des deux valeurs, mais vous pouvez le faire très vite. Les humains peuvent entendre des fréquences jusqu'à 20 khz. Si vous diddle votre sortie plus vite que ça, disons à 200kHz (bien dans les capacités de l'Arduino, qui est cadencé à 16MHz), vous n'entendez pas la sortie individuelle des transitions, mais le moyenne valeur sur une période plus longue.
Imaginer la génération d'un 200kHz ton avec
tone()
. Il est beaucoup trop élevé pour l'entendre, mais la valeur moyenne est à mi-chemin entre on et off (50% duty cycle, vous vous souvenez?). Donc, nous avons maintenant trois de sortie possible des valeurs: on, off, et à mi-chemin. C'est assez pour nous permettre de jouer à deux ondes carrées simultanément:Audio de haute qualité exige beaucoup plus de valeurs que cela. Cd magasin 16-bit audio, ce qui signifie qu'il y a 65536 valeurs possibles. Et tandis que nous n'obtiendrons pas de lecteur de CD audio de qualité d'un Arduino, nous pouvons obtenir plus de valeurs de sortie par le choix d'un cycle de service autre que de 50%. En fait, l'Arduino a le matériel pour le faire pour nous.
Répondre
analogWrite()
. Ce faux divers niveaux de sortie à l'aide de l'Arduino intégré PWM hardware. La mauvaise nouvelle est que la fréquence PWM est généralement de 500 hz, ce qui est bien pour la variation d'un CONDUIT, mais trop faible pour l'audio. Nous avons donc au programme registres du matériel de soi-même.Secrets de PWM Arduino a plus d'information, voici une référence détaillée sur la façon de mettre en œuvre un PWM DAC sur un Arduino.
J'ai pris 7 bits de résolution, ce qui signifie que la sortie est une 16MHz/128=125kHz onde carrée avec 128 cycles de service.
Bien sûr, une fois que vous avez une sortie PWM de travail, le plaisir ne fait que commencer.
Avec de multiples voix, vous ne pouvez pas compter sur les interruptions pour définir la fréquence de vos formes d'ondes, vous devez étirer vous-même. Connaissances de base en traitement du signal numérique (DSP) viendra à jolly à portée de main. Vous aurez besoin de code serré pour générer des données audio à partir de l'intérieur d'un gestionnaire d'interruption, puis vous aurez besoin d'un playroutine pour déclencher les bonnes notes au bon moment. Le ciel est la limite!
De toute façon, voici un peu de code:
Cela se joue à quatre voix tune. Je n'ai qu'un Arduino Leonardo (bien, Pro Micro) pour faire des tests, de sorte que vous pouvez avoir besoin de changer
PIN
selon laquelle la broche est connectée à TIMER1A (si je suis en train de lire correctement, c'est la broche 9 sur une Uno et la broche 11 sur un Mega). Vous n'avez pas de choix de code pin pour utiliser, malheureusement.Je l'ai testé avec un casque, donc je n'ai aucune idée de comment ça sur un buzzer piézo...
J'espère que ça vous donne une idée des possibilités, et un point de départ potentiel pour votre propre musique. Un plaisir de vous expliquer tout ce qui est difficile, et aussi merci de me donner une excuse pour écrire ceci 🙂
frac
et comment est-il utilisé? Je ne comprends ceci et les valeurs dansfrtab
mais comment allez-vous partir d'une période et d'octave à une valeur de la vague? Aussi j'ai changé de ligne 102 àout += (voice[i].off & 15) < 8 ? 0 : 31;
parce que je n'ai pas besoin de volume et d'autres formes d'onde, ça va fonctionner?OriginalL'auteur hexwab
Cette troisième partie de la Tonalité de la bibliothèque peut jouer simultanée des ondes carrées sur plusieurs axes: lesLien
Vous pouvez connecter des résistances entre les multiples broches et un seul haut-parleur pour obtenir toutes les tonalités d'un haut-parleur.
OriginalL'auteur Fortran