Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino Breath Controller voor goedkoop (USB-MIDI)

Componenten en benodigdheden

Arduino Micro
Je zou waarschijnlijk de kosten kunnen verlagen met een kloon, maar ik raad het origineel aan. Alleen de Micro (ATmega32U4) zal werken vanwege de native USB-mogelijkheden.
× 1
Soldeerloze breadboard halve grootte
× 1
MPS20N0040D-D Druksensor
Veelgoedkoop en vrij gemakkelijk te vinden.
× 1
LM358-N Op Amp
We gebruiken de populaire LM358 opamp om het sensorsignaal te versterken.
× 1
Weerstand 1M ohm
× 2
Aansluitkabelset, 22 AWG
Je hebt natuurlijk geen volledige set nodig, alleen een paar cm massieve draad.
× 1
Baby-neuszuiger
Ja, je leest het goed. We gebruiken het mondstuk aan de ouderzijde en de aspirator aan de babyzijde. Er zijn tientallen handzuigers van hetzelfde type in omloop (bijvoorbeeld Physiomer Neuszuiger, Chicco Physioclean etc.). Kies het type mondstuk dat u prettiger vindt.
× 1
Aquariumluchtslang van 5 mm
Optioneel, als de slang van de aspirator niet lang genoeg is. Standaard slangen voor aquariumluchtvaartlijnen zijn voldoende.
× 1
3-weg luchtslangconnector
Deze specifieke Chinese OEM is gemakkelijk te vinden in aquariumwinkels onder verschillende namen. Hij past direct op de sensor.
× 1

Benodigde gereedschappen en machines

Draadstripper en snijder, 32-20 AWG / 0,05-0,5 mm² massieve en gevlochten draden

Apps en online services

Arduino IDE

Over dit project

Inleiding

In dit project zullen we een eenvoudige USB MIDI plug-and-play ademcontroller bouwen. Het is ontworpen met behulp van gemakkelijk te vinden goedkope componenten, zodat de totale kosten betaalbaar blijven en ruim onder de commerciële equivalenten. Dit is de basisversie die alleen de luchtdruksensor gebruikt, maar het plan is om deze in de toekomst te upgraden met een bijt- en knik-/kantelsensor.

Het project veronderstelt een aantal zeer elementaire elektronica en Arduino-kennis, maar zelfs een beginner kan het bouwen omdat er geen solderen bij komt kijken. Natuurlijk kunnen meer gevorderde gebruikers alles op een perma-protoboard solderen. Ik heb het niet over de installatie van de IDE/bibliotheken en instructies om code te uploaden, aangezien er uitstekende tutorials op internet zijn.

Oversampling wordt gebruikt om de invoer van de sensor af te vlakken met zeer goede resultaten. Je kunt het bereik ook naar wens aanpassen en zelfs aangepaste curven inbellen om het gedrag van de controller aan te passen.

Omdat de sensor ook onderdruk kan meten, is er een tweede stroom controllerberichten die wordt uitgevoerd wanneer u lucht aanzuigt in plaats van te blazen. Beide soorten berichten kunnen door de gebruiker worden ingesteld. U kunt bijvoorbeeld blow instellen op pitch bend up en draw in op pitch bend down. Standaard zijn beide ingesteld op controller nr. 2.

Stappen om te bouwen

1. Plaats de Arduino in het breadboard zoals weergegeven in de foto/het schema.

2. Plaats de sensor en opamp in hun respectievelijke posities, let op de richting op basis van de kleine inkepingen aan hun zijkanten.

3. Plaats de weerstanden nadat ze hun benen op de juiste lengte hebben gesneden.

4. Knip/strip de massieve kernkabels en plaats ze in hun respectievelijke posities. Ik heb rood gebruikt voor 5V, zwart voor aarde en geel voor signaal om dit gemakkelijker te begrijpen te maken, maar je kunt natuurlijk alles gebruiken wat je beschikbaar hebt.

5. Sluit het mondstuk, de slang, de 3-weg connector en de aspirator aan zoals getoond op de foto. U moet een stuk van de slang afsnijden voor de "uitlaat".

6. Druk op de 3-polige connector zodat deze op de sensor past. Het moet blijven zitten.

7. Installeer de Arduino IDE en installeer de twee benodigde bibliotheken (Oversampling en USB-MIDI) via Extra->Bibliotheken beheren. Sluit de Arduino met een USB-kabel aan op uw computer. Upload de bijgevoegde code.

8. Je zou klaar moeten zijn, de Arduino zou nu als een MIDI-apparaat in je DAW/Music Software moeten verschijnen. Schakel het in en stuur het samen met je toetsenbord naar een plug-in die ademcontroller ondersteunt.

Geavanceerde informatie

Een fysiek nadeel van dit ontwerp is het speeksel dat onvermijdelijk in de buis zal stromen en merkbare schommelingen in de luchtstroom kan veroorzaken. De 3-weg connector wordt gebruikt om dit probleem aan te pakken door het speeksel naar de "uitlaat" buis te leiden. Om opgesloten speeksel in de slang tot een minimum te beperken, moet u ervoor zorgen dat er een ononderbroken helling is van het mondstuk naar de 3-wegconnector door de lengte van de slang aan te passen. Als de buis onder het 3-weg connectorniveau hangt, zal het speeksel op het lagere punt worden vastgehouden en fluctuaties veroorzaken. Het babygedeelte van de aspirator, inclusief het filter, is bevestigd aan de uitlaat om druppelen en geluid te minimaliseren en de luchtstroom naar de sensor te vergroten.

In de code staan ​​waarden die je naar wens kunt aanpassen, inclusief custom curves. Opmerkingen beschrijven hoe u dit kunt doen. Als je het moeilijk vindt om het 127 punt te bereiken, verlaag dan het maximale bereik, of als het te gemakkelijk is, verhoog het dan. Telkens wanneer u waarden wijzigt, moet u de code opnieuw uploaden.

De eerste paar metingen na het opstarten van Arduino worden gemiddeld om de rustpositie te kalibreren. Blaas niet in de slang tijdens het aansluiten/resetten van het apparaat.

U kunt de naam van het MIDI-apparaat wijzigen door het boards.txt-bestand te bewerken (informatie over hoe u dit voor elk platform kunt doen, is beschikbaar op internet).

Code

  • Beademingscontrollercode
BeademingscontrollercodeArduino
Upload deze code naar uw ademcontroller via Arduino IDE
/* Breath Controller*///Bibliotheken gebruikt - installeer ze vanuit Tools->Manage Libraries#include #include // Debug-modus (verwijder commentaar om in te schakelen)//#define DEBUG 1//Creëring van de USB MIDI-interfaceUSBMIDI_CREATE_DEFAULT_INSTANCE();//Oversampling initOversampling adc(10, 13, 6);// *********** ****** Gebruikersinstellingen **************** // Waarden die eindigen op 1 corresponderen met blazen, terwijl die eindigen op 2 met luchtzuigen// Pin setupconst int sensorPin1 =A0; // selecteer de Arduino-ingangspin voor de sensor / opamp-uitgang // Range Calibration. Pas dit handmatig aan zodat je het maximum maar niet te gemakkelijk kunt bereiken.int sensorRange1 =800;int sensorRange2 =800;// Output controller nummer. Selecteer uit onderstaande tabel// 0-127:reguliere besturingswijzigingsberichten// 128:monofone aftertouch// 129:Pitch Bend Up // 130:Pitch Bend Down int controllerNumber1 =2; // Controller verzonden bij het blazen controllerNumber2 =2; // Controller verzonden bij aanzuigen van lucht// Output controller channelsint controllerChannel1 =1;int controllerChannel2 =1;// Veiligheidsdrempels voor laagste en hoogste waarden om fluctuaties in rust of max. // Als in rust meerdere berichten worden verzonden, verhoogt u de lowThreshold. // Als er meerdere berichten worden verzonden, verhoogt u de highThreshold. const int lowThreshold1 =5;const int lowThreshold2 =5;const int highThreshold1 =0;const int highThreshold2 =0;// Curvedefinitie. Tabellen kunnen elke lengte hebben die gelijk is aan of groter is dan 2. Waarden kunnen 0-127 zijn. Tabellen moeten hetzelfde aantal elementen hebben en "in"-tabellen moeten in oplopende volgorde staan.// Conversies worden gedaan op leesniveau, zodat het verlies aan definitie tot een minimum wordt beperkt.int in1[] ={0, 127};int out1[] ={0, 127};int in2[] ={0, 127};int out2[] ={0, 127};// Voorbeeldcurves (wijzig het sensornummer dienovereenkomstig)//Soft//int in1[] ={ 0, 6,24,78,127};//int out1[] ={0,32,64,96,127};// Verkleind bereik//int in1[] ={50, 100};//int out1[] ={50, 100};// Vernieuwingscyclus (milliseconden). Lagere waarden betekenen dat er meer berichten worden verzonden tijdens operatie.int refreshCycle =0;// **************** Implementatie *************** ** // Wijzig niet vanaf dit punt en verder als u niet van plan bent de werking van de sensor te wijzigen.// Interne waarde van Sensorsint sensorValue1 =0;int sensorValue2 =0;// Minimale sensorwaarden int sensorMin1;int sensorMin2;// Uitgangscontrollerwaardenint controllerValue1 =0;int controllerValue2 =0;// Vorige cycluswaarden gebruikt om herhaling van identieke berichten te voorkomenint previousControllerValue1 =0;int previousControllerValue2 =0;// Bereikconversievariabele initint outputRange1;int outputRange2;int sensorLow1; int sensorLow2;int sensorHigh1;int sensorHigh2;void setup() { MIDI.begin(1);#ifdef DEBUG Serial.begin (115200); //Alleen voor debug-modus#endif// Kalibreer het rustpunt van de sensor door het gemiddelde van 10 eerste waarden te nemen. Gebruik de sensor niet tijdens het opstarten van het apparaat. sensorMin1 =adc.lezen (sensorPin1); sensorMin2 =0;// Bepaal uitgangsbereiken voor de gekozen controllers outputRange1 =outputRange(controllerNumber1); outputRange2 =outputRange (controllerNumber2);}void loop () {// lees de waarde van de sensor:sensorValue1 =adc.read (sensorPin1); // Blaaslucht sensorValue2 =sensorMin1 - sensorValue1; // Tekenen in lucht// Bewaar vorige waarden previousControllerValue1 =controllerValue1; previousControllerValue2 =controllerValue2; // Bruikbare bereiklimieten voor sensor omhoog/omlaag sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min(sensorMin1,sensorRange2) - highThreshold2;// Converteer interne waarden naar uitgangsbereik (0..127 voor controllers/aftertouch 0..+/-8191 voor Pitchbend Up/Down) met behulp van de curven gedefinieerd in "in" en "uit" tafels. 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);// Stuur MIDI-berichten als ( controllerValue1 !=previousControllerValue1) sendSensorOutput (controllerNumber1, controllerValue1, controllerChannel1); if (controllerValue2 !=previousControllerValue2) sendSensorOutput(controllerNumber2, controllerValue2, controllerChannel2);// Debug#ifdef DEBUG// Sensor (input)-waarden (zonder commentaar voor debug)// Serial.print (sensorValue1);// Serial.print (" ,");// Serial.print (sensorValue2);// Serial.print (","); // Controller (output) waarden Serial.print (controllerValue1); Serieafdruk (","); Serial.println (controllerValue2);#endif // stop het programma voor  milliseconden:delay(refreshCycle);}// Functie die wordt gebruikt om MIDI-berichten te verzenden volgens het controllernummervoid sendSensorOutput (int-nummer, int-waarde, int-kanaal) { if (getal <128) MIDI.sendControlChange (getal, waarde, kanaal); else if (getal ==128) MIDI.sendAfterTouch(waarde, kanaal); else if (getal ==129) MIDI.sendPitchBend(waarde, kanaal); else if (getal ==130) MIDI.sendPitchBend(-value, channel);}// Functie die wordt gebruikt om het bereik van een specifieke controller te bepalen. Dit komt doordat pitch bend een groter bereik heeft dan reguliere controllers.int outputRange (int number) { if (number> 128) return 8191; else return 127;}// Gewijzigde multiMap-functie die wordt gebruikt om curven te maken. Origineel door Rob Tillaart.int mapToCurve(int val, int sensorLow, int sensorHigh, int* _in, int* _out, uint8_t size){ // zorg ervoor dat de waarde binnen het bereik valt // val =constrain(val, _in[0] , _in[maat-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); // zoek naar rechts interval uint8_t pos =1; // _in[0] al getest while(val> map(_in[pos],0.127,sensorLow,sensorHigh)) pos++; // instelbereik van ..127 tot sensorbereik 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); // dit zal alle exacte "punten" in de _in array behandelen als (val ==inPos) outPos retourneert; // interpoleer in het rechter segment voor de rest return ((long)val - (long)inPrv) * ((long)outPos - (long)outPrv) / ((long)inPos - (long)inPrv) + (long) outPrv;}

Schema's

Fritsing schema Circuitlab-schema

Productieproces

  1. LCD-paneel met Arduino voor Flight Simulator
  2. Web-gestuurde DMX-controller
  3. Arduino-gamecontroller
  4. Unopad - Arduino MIDI-controller met Ableton
  5. Tekst Teleporter
  6. Vacuüm TL-beeldschermcontroller
  7. Arduino Home Controller geactiveerd door Alexa
  8. SMART temperatuurbewaking voor scholen
  9. 8-bit IO-poortbibliotheek voor Arduino
  10. Een geïsoleerde analoge ingang voor Arduino
  11. Robot voor supercoole indoornavigatie