Synthétiseur pas à pas Arduino MIDI
Composants et fournitures
![]() |
| × | 1 | |||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 4 |
Outils et machines nécessaires
![]() |
|
À propos de ce projet
Regardez-le en action ici.
Je faisais ma navigation habituelle sur YouTube quand j'ai vu de la musique pour lecteur de disquette. Ayant su que les lecteurs de disquettes sont contrôlés par des moteurs pas à pas, j'ai décidé de créer mon propre générateur de sons à moteur pas à pas.
J'avais vu que les gens avaient fait cela auparavant, mais chaque instance n'avait pas partagé le code ou leur code était très imparfait et/ou limité.
Ayant appris le C++ à l'école, j'ai décidé de mettre mes compétences à profit.
Ce que je voulais vraiment faire, c'était créer un code simple et facile à utiliser et à modifier. Et c'est exactement ce que j'ai fait !
Le Globalement Traiter
Pour commencer, j'ai réfléchi à ce qu'il fallait faire. En termes les plus élémentaires, j'avais besoin d'extraire des données MIDI et de les transformer en une vitesse permettant à un moteur pas à pas de créer la hauteur correspondante.
Extraction de données MIDI
Cette partie était plutôt facile. En utilisant la bibliothèque MIDI, je pouvais interpréter les données MIDI et les envoyer à une autre fonction pour contrôler la vitesse.
Contrôler les steppers
Les pilotes de moteur pas à pas A4988 ont deux broches qui contrôlent directement le mouvement du moteur pas à pas ; ÉTAPE et DIR. DIR contrôle si le moteur tourne dans le sens des aiguilles d'une montre ou dans le sens inverse en fonction de l'état, et STEP déplace le moteur pas à pas d'un pas à chaque fois qu'il est tiré vers le haut (cela dépend de la résolution du micropas). Étant donné que le son n'est pas affecté par la direction, je le règle simplement comme faible (ou je le connecte simplement à la terre). Maintenant, je peux simplement faire avancer le moteur à l'aide d'une commande digitalWrite.
Le défi
Le principal défi dans le traitement de ce projet était que je voulais piloter plusieurs moteurs pas à pas à la fois, donc utiliser une commande delay() était hors de question (sinon les moteurs ne fonctionneraient pas simultanément). Au lieu de cela, j'ai utilisé la commande micros() pour calculer la durée d'impulsion des steppers. Comme il va y avoir des valeurs de vitesse différentes pour chaque moteur pas à pas, j'ai transformé les variables de vitesse en tableaux, avec leur index correspondant au numéro du moteur et au canal MIDI. J'ai initialement utilisé la commande millis(), mais j'ai trouvé qu'elle manquait de résolution pour produire des hauteurs différentes.
L'utilisation d'un tableau pour contrôler la vitesse des moteurs pas à pas signifiait que je pouvais utiliser une seule variable pour tous les moteurs, ce qui donne la possibilité à l'arduino de contrôler n'importe quel nombre de moteurs pas à pas, simplement en changeant la taille du tableau !
Calculs de vitesse
Lors d'un test, j'ai envoyé une onde carrée de 440 Hz (à l'aide de la commande de tonalité) à la broche de pas et j'ai découvert que le moteur pas à pas créait un pas A440. Étant donné que la valeur de vitesse envoyée à la fonction pas à pas était la période en microsecondes, j'ai simplement converti les fréquences de note en période. J'ai mis ces valeurs dans un autre tableau appelé pitchValues, avec leur index correspondant à la valeur de la note MIDI. L'utilisation du tableau m'a également permis de contrôler la plage jouable du stepper. J'ai fait en sorte qu'une valeur de vitesse de zéro soit considérée comme un arrêt.
L'utilisation d'un tableau au lieu d'un calcul signifiait qu'il y avait un contrôle complet sur la vitesse de chaque note, définissant efficacement une plage pour l'instrument. De plus, lorsqu'un moteur pas à pas est proche de sa fréquence de résonance, il produit un bruit très terrible (on dirait qu'il cale). Vous pouvez identifier ce que c'est et changer la valeur de la hauteur d'une octave pour résoudre ce problème. Pour moi, la fréquence de résonance était d'environ F3, j'ai donc dû changer E3, F3 et F#3 d'une octave pour résoudre ce problème. (Vous pouvez le vérifier en utilisant le code "Tune Stepper.ino")
Création d'un périphérique MIDI USB
Je voulais que l'appareil soit considéré comme un appareil MIDI, alors j'ai creusé un peu et j'ai découvert que vous pouviez changer le firmware de la puce AVR sur la carte. Le firmware peut être HIDUINO ou mocuLUFA. J'ai choisi mocuLUFA, car il avait une option de double démarrage, ce qui me permettait de reprogrammer facilement l'Arduino sans avoir à re-flasher la puce AVR. Je pourrais simplement connecter un cavalier sur l'en-tête ICSP pour basculer entre USB MIDI et USB Serial.
Code
Dépôt GitHub
Allez simplement sur mon GitHub. J'ai des instructions sur la façon de configurer et d'installer le code sur votre Arduino.https://github.com/jzkmath/Arduino-MIDI-Stepper-Motor-InstrumentPièces et boîtiers personnalisés
Maintient les moteurs pas à pas en place Ajoute un "doigt" au moteur. À des fins purement esthétiques.Schémas
Emplacement pour les cavaliers si vous souhaitez utiliser ce bouclier.



Processus de fabrication