Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Contrôleur Arduino Breath pour pas cher (USB-MIDI)

Composants et fournitures

Arduino Micro
Vous pourriez probablement réduire le coût avec un clone mais je recommande l'original. Seul le Micro (ATmega32U4) fonctionnera en raison des capacités USB natives.
× 1
Planche à pain sans soudure demi-taille
× 1
Capteur de pression MPS20N0040D-D
Terre pas chère et assez facile à trouver.
× 1
Ampli op LM358-N
Nous utiliserons le populaire ampli op LM358 pour amplifier le signal du capteur.
× 1
Résistance 1M ohm
× 2
Kit de fil de connexion, 22 AWG
Vous n'avez bien sûr pas besoin d'un kit complet, juste quelques cm de fil à âme pleine.
× 1
Aspirateur nasal pour bébé
Oui, vous avez bien lu. Nous utiliserons l'embout buccal côté parent et l'aspirateur côté bébé. Il existe des dizaines d'aspirateurs manuels du même type (par exemple Physiomer Nasal Aspirator, Chicco Physioclean etc.). Choisissez le type d'embout buccal que vous trouvez le plus confortable.
× 1
Tube d'air d'aquarium de 5 mm
Facultatif, si la tubulure de l'aspirateur n'est pas assez longue. Un tuyau d'air standard pour aquarium fera l'affaire.
× 1
Connecteur de circuit respiratoire à 3 voies
Ce produit OEM chinois spécifique peut être trouvé facilement dans les magasins d'aquarium sous différents noms. Il s'adapte directement sur le capteur.
× 1

Outils et machines nécessaires

Dénudeur et coupe-fil, 32-20 AWG / 0,05-0,5 Fils rigides et multibrins mm²

Applications et services en ligne

Arduino IDE

À propos de ce projet

Présentation

Dans ce projet, nous allons construire un simple contrôleur de souffle USB MIDI plug-and-play. Il est conçu en utilisant des composants bon marché faciles à trouver afin que le coût total reste abordable et bien inférieur aux équivalents commerciaux. Il s'agit de la version de base qui utilise uniquement le capteur de pression d'air, mais le plan est de le mettre à niveau pour inclure un capteur de morsure et de hochement de tête/d'inclinaison à l'avenir.

Le projet suppose des connaissances de base en électronique et en Arduino, mais même un débutant peut le construire car aucune soudure n'est impliquée. Bien sûr, les utilisateurs plus avancés peuvent tout souder sur un perma-protoboard. Je ne parle pas de l'installation de l'IDE/des bibliothèques et des instructions pour télécharger du code car il existe d'excellents tutoriels sur Internet.

Le suréchantillonnage est utilisé pour lisser l'entrée du capteur avec de très bons résultats. Vous pouvez également ajuster la plage à votre guise et même composer des courbes personnalisées pour ajuster le comportement du contrôleur.

Étant donné que le capteur peut également mesurer la pression négative, un deuxième flux de messages du contrôleur est émis lorsque vous aspirez de l'air au lieu de souffler. Les deux types de messages peuvent être définis par l'utilisateur. Par exemple, vous pouvez régler Blow pour pitch bend vers le haut et tirer pour pitch bend vers le bas. Par défaut, les deux sont réglés sur le numéro de contrôleur. 2.

Étapes pour construire

1. Insérez l'Arduino dans la maquette comme indiqué sur la photo/le schéma.

2. Insérez le capteur et l'ampli op dans leurs positions respectives, notez l'orientation basée sur les petits retraits sur leurs côtés.

3. Insérez les résistances après avoir coupé leurs pattes aux longueurs appropriées.

4. Coupez/dénudez les câbles à âme pleine et placez-les dans leurs positions respectives. J'ai utilisé le rouge pour le 5V, le noir pour la masse et le jaune pour le signal afin de faciliter la compréhension, mais vous pouvez bien sûr utiliser tout ce dont vous disposez.

5. Connectez l'embout buccal, le tube, le connecteur à 3 voies et l'aspirateur comme indiqué sur la photo. Vous aurez besoin de couper un morceau du tube pour le "échappement".

6. Appuyez sur le connecteur à 3 voies pour qu'il s'emboîte sur le capteur. Il devrait rester en place.

7. Installez l'IDE Arduino et installez les deux bibliothèques nécessaires (suréchantillonnage et USB-MIDI) depuis Outils-> Gérer les bibliothèques. Connectez l'Arduino avec un câble USB à votre ordinateur. Téléchargez le code ci-joint.

8. Vous devriez être configuré, l'Arduino devrait maintenant apparaître comme un périphérique MIDI dans votre logiciel DAW/Music. Activez-le et acheminez-le avec votre clavier vers un plug-in prenant en charge le contrôleur de respiration.

Informations avancées

Un inconvénient physique de cette conception est la salive qui coulera inévitablement dans le tube et peut provoquer des fluctuations notables du débit d'air. Le connecteur à 3 voies est utilisé pour résoudre ce problème en acheminant la salive vers le tube "d'échappement". Pour minimiser la salive emprisonnée dans le tube, assurez-vous qu'il y a une pente continue de l'embout buccal au connecteur à 3 voies en ajustant la longueur du tube. Si le tube pend sous le niveau du connecteur à 3 voies, la salive sera piégée à son point le plus bas, provoquant des fluctuations. La partie côté bébé de l'aspirateur, y compris son filtre, est fixée à l'échappement pour minimiser les gouttes ainsi que le bruit et augmenter le débit d'air vers le capteur.

Dans le code, il y a des valeurs que vous pouvez ajuster à votre guise, y compris des courbes personnalisées. Les commentaires décrivent comment procéder. Si vous avez du mal à atteindre le point 127, diminuez la portée maximale, ou si c'est trop facile, augmentez-la. Chaque fois que vous modifiez des valeurs, vous devrez télécharger à nouveau le code.

Les premières lectures après le démarrage Arduino sont moyennées pour calibrer la position de repos. Ne soufflez pas dans le tube lors de la connexion/réinitialisation de l'appareil.

Vous pouvez changer le nom du périphérique MIDI en éditant le fichier boards.txt (des informations sur la façon de procéder pour chaque plate-forme sont disponibles sur Internet).

Code

  • Code du contrôleur de respiration
Code du contrôleur de respirationArduino
Téléchargez ce code sur votre contrôleur de respiration via Arduino IDE
/* Breath Controller*///Bibliothèques utilisées - installez-les depuis Outils->Gérer les bibliothèques#include #include // Mode debug (décommentez pour activer)//#define DEBUG 1//Création de l'interface USB MIDIUSBMIDI_CREATE_DEFAULT_INSTANCE();//Oversampling initOversampling adc(10, 13, 6);// *********** ****** User Setup ******************* // Les valeurs se terminant par 1 correspondent au soufflage tandis que celles se terminant par 2 à l'aspiration dans l'air // Pin setupconst int sensorPin1 =A0 ; // sélectionnez la broche d'entrée Arduino pour la sortie capteur/amplificateur opérationnel//étalonnage de la plage. Ajustez ceci manuellement afin que vous puissiez atteindre le maximum mais pas trop facilement.int sensorRange1 =800;int sensorRange2 =800;// Numéro du contrôleur de sortie. Sélectionnez dans le tableau ci-dessous// 0-127 :messages de changement de commande réguliers// 128 :aftertouch monophonique// 129 :Pitch Bend Up // 130 :Pitch Bend Down int controllerNumber1 =2 ; // Contrôleur envoyé lorsque blowingint controllerNumber2 =2; // Contrôleur envoyé lors de l'aspiration de l'air// Canaux du contrôleur de sortieint controllerChannel1 =1;int controllerChannel2 =1;// Seuils de sécurité pour les valeurs les plus basses et les plus élevées pour éviter les fluctuations au repos ou max. // Si plusieurs messages sont envoyés au repos, augmentez le seuil bas. // Si plusieurs messages sont envoyés au maximum, augmentez le seuil élevé. const int lowThreshold1 =5;const int lowThreshold2 =5;const int highThreshold1 =0;const int highThreshold2 =0;// Définition de la courbe. Les tableaux peuvent avoir une longueur égale ou supérieure à 2. Les valeurs peuvent être comprises entre 0 et 127 . Les tableaux doivent avoir le même nombre d'éléments et les tableaux "in" doivent être dans l'ordre croissant.// Les conversions sont effectuées au niveau des lectures afin de minimiser la perte de définition.int in1[] ={0, 127};int out1[] ={0, 127};int in2[] ={0, 127};int out2[] ={0, 127};// Exemples de courbes (modifier le numéro de capteur en conséquence)//Soft//int in1[] ={ 0, 6,24,78,127};//int out1[] ={0,32,64,96,127};// Plage réduite//int in1[] ={50, 100};//int out1[] ={50, 100} ; // Cycle de rafraîchissement (millisecondes). Des valeurs plus faibles signifient que plus de messages sont envoyés pendant l'opération.int refreshCycle =0;// ******************* Implémentation *************** ** // Ne pas modifier à partir de ce point et au-delà si vous n'avez pas l'intention de modifier le fonctionnement du capteur.// Valeur interne de Sensorsint sensorValue1 =0;int sensorValue2 =0;// Valeurs minimales du capteur int sensorMin1;int sensorMin2;// Valeurs du contrôleur de sortieint controllerValue1 =0;int controllerValue2 =0;// Valeurs du cycle précédent utilisées pour éviter la répétition de messages identiquesint previousControllerValue1 =0;int previousControllerValue2 =0;// Variable de conversion de plage initint outputRange1;int outputRange2;int sensorLow1; int sensorLow2;int sensorHigh1;int sensorHigh2;void setup() { MIDI.begin(1);#ifdef DEBUG Serial.begin (115200); //Uniquement pour le mode debug#endif// Calibrer le point de repos du capteur en faisant la moyenne des 10 premières valeurs. N'utilisez pas le capteur pendant le démarrage de l'appareil. sensorMin1 =adc.read(sensorPin1) ; sensorMin2 =0;// Déterminer les plages de sortie pour les contrôleurs choisis outputRange1 =outputRange(controllerNumber1) ; outputRange2 =outputRange(controllerNumber2);}void loop() {// lire la valeur du capteur :sensorValue1 =adc.read(sensorPin1) ; // Soufflage d'air sensorValue2 =sensorMin1 - sensorValue1; // Dessin dans l'air// Stocke les valeurs précédentes previousControllerValue1 =controllerValue1; previousControllerValue2 =controllerValue2; // Limites de plage utilisables pour le capteur haut/bas sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2 ; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1 ; sensorHigh2 =min(sensorMin1,sensorRange2) - highThreshold2;// Convertir les valeurs internes en plage de sortie (0..127 pour les contrôleurs/aftertouch 0..+/-8191 pour Pitchbend Up/Down) en utilisant les courbes définies dans "in" et des tables « dehors ». controllerValue1 =map(mapToCurve(constrain(sensorValue1,sensorLow1,sensorHigh1),sensorLow1,sensorHigh1,in1,out1,sizeof(in1)/sizeof(int)),sensorLow1,sensorHigh1,0,outputRange1) ; controllerValue2 =map(mapToCurve(constrain(sensorValue2,sensorLow2,sensorHigh2),sensorLow2,sensorHigh2,in2,out2,sizeof(in2)/sizeof(int)),sensorLow2,sensorHigh2,0,outputRange2);// Envoyer des messages MIDI si ( controllerValue1 !=previousControllerValue1) sendSensorOutput(controllerNumber1, controllerValue1, controllerChannel1) ; if (controllerValue2 !=previousControllerValue2) sendSensorOutput(controllerNumber2, controllerValue2, controllerChannel2);// Debug#ifdef DEBUG// Sensor (input) values ​​(uncomment for debug)// Serial.print (sensorValue1);// Serial.print (" ,");// Serial.print (sensorValue2);// Serial.print (","); // Valeurs du contrôleur (sortie) Serial.print (controllerValue1) ; Serial.print (","); Serial.println (controllerValue2);#endif // arrête le programme pendant  millisecondes :delay(refreshCycle);}// Fonction utilisée pour envoyer des messages MIDI selon le numéro de contrôleurvoid sendSensorOutput (int number, int value, int channel) { if (nombre <128) MIDI.sendControlChange(nombre, valeur, canal); else if (nombre ==128) MIDI.sendAfterTouch(valeur, canal); else if (nombre ==129) MIDI.sendPitchBend(valeur, canal); else if (nombre ==130) MIDI.sendPitchBend(-value, channel);}// Fonction utilisée pour déterminer la plage d'un contrôleur spécifique. Cela est dû au fait que le pitch bend a une plage plus large que les contrôleurs réguliers.int outputRange (int number) { if (number> 128) return 8191; else return 127;}// Fonction multiMap modifiée utilisée pour créer des courbes. Original par Rob Tillaart.int mapToCurve(int val, int sensorLow, int sensorHigh, int* _in, int* _out, uint8_t size){ // veillez à ce que la valeur soit dans la plage // val =constrain(val, _in[0] , _en[taille-1]); if (val <=map(_in[0],0,127,sensorLow,sensorHigh)) return map(_out[0],0,127,sensorLow,sensorHigh); if (val>=map(_in[size-1],0,127,sensorLow,sensorHigh)) return map(_out[size-1],0,127,sensorLow,sensorHigh); // recherche l'intervalle de droite uint8_t pos =1; // _in[0] déjà testé while(val> map(_in[pos],0,127,sensorLow,sensorHigh)) pos++; // ajustement de la plage de ..127 à la plage du capteur int inPos =map(_in[pos],0,127,sensorLow,sensorHigh); int outPos =map(_out[pos],0,127,sensorLow,sensorHigh); int inPrv =map(_in[pos-1],0,127,sensorLow,sensorHigh); int outPrv =map(_out[pos-1],0,127,sensorLow,sensorHigh); // cela gérera tous les "points" exacts dans le tableau _in if (val ==inPos) return outPos; // interpole dans le segment de droite pour le reste return ((long)val - (long)inPrv) * ((long)outPos - (long)outPrv) / ((long)inPos - (long)inPrv) + (long) outPrv;}

Schémas

Schéma de frittage Schéma du laboratoire de circuits

Processus de fabrication

  1. Panneau LCD avec Arduino pour Flight Simulator
  2. Contrôleur DMX Web
  3. Contrôleur de jeu Arduino
  4. Unopad - Contrôleur MIDI Arduino avec Ableton
  5. Téléporteur SMS
  6. Contrôleur d'affichage fluorescent à vide
  7. Contrôleur domestique Arduino activé par Alexa
  8. Une entrée analogique isolée pour Arduino
  9. Robot pour une navigation intérieure super cool