Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Breath Controller zum günstigen Preis (USB-MIDI)

Komponenten und Verbrauchsmaterialien

Arduino Micro
Sie könnten die Kosten wahrscheinlich mit einem Klon senken, aber ich empfehle das Original. Aufgrund der nativen USB-Fähigkeiten funktioniert nur das Micro (ATmega32U4).
× 1
Lötbares Breadboard Half Size
× 1
MPS20N0040D-D-Drucksensor
Schrecklich billig und recht leicht zu finden.
× 1
LM358-N Operationsverstärker
Wir verwenden den beliebten Operationsverstärker LM358, um das Signal des Sensors zu verstärken.
× 1
Widerstand 1 M Ohm
× 2
Anschlusskabelsatz, 22 AWG
Sie brauchen natürlich kein komplettes Set, nur ein paar cm festen Kerndraht.
× 1
Nasensauger für Babys
Ja, Sie haben richtig gelesen. Wir werden das Mundstück auf der Elternseite und den Absauger auf der Babyseite verwenden. Es gibt Dutzende von Handsaugern des gleichen Typs (zB Physiomer Nasensauger, Chicco Physioclean etc.). Wählen Sie den für Sie bequemeren Mundstücktyp.
× 1
5 mm Aquarienluftschlauch
Optional, wenn der Schlauch des Absaugers nicht lang genug ist. Standard-Aquarium-Luftschläuche reichen aus.
× 1
3-Wege-Atemschlauchanschluss
Diese spezielle chinesische OEM-Version ist in Aquariengeschäften unter verschiedenen Namen leicht zu finden. Es passt direkt auf den Sensor.
× 1

Notwendige Werkzeuge und Maschinen

Abisolierzange und -schneider, 32-20 AWG / 0.05-0.5 mm² Massiv- und Litzendrähte

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Einführung

In diesem Projekt bauen wir einen einfachen USB-MIDI-Plug-and-Play-Atemcontroller. Es wurde mit leicht zu findenden billigen Komponenten entwickelt, sodass die Gesamtkosten erschwinglich bleiben und weit unter den kommerziellen Äquivalenten liegen. Dies ist die Basisversion, die nur den Luftdrucksensor verwendet, aber es ist geplant, ihn in Zukunft um einen Biss- und Nick- / Neigungssensor zu erweitern.

Das Projekt setzt einige sehr grundlegende Elektronik- und Arduino-Kenntnisse voraus, aber selbst ein Anfänger kann es bauen, da kein Löten erforderlich ist. Fortgeschrittene können natürlich alles auf ein Perma-Protoboard löten. Ich behandle nicht die Installation der IDE/Bibliotheken und Anweisungen zum Hochladen von Code, da es ausgezeichnete Tutorials im Internet gibt.

Oversampling wird verwendet, um den Eingang des Sensors mit sehr guten Ergebnissen zu glätten. Sie können den Bereich auch nach Ihren Wünschen anpassen und sogar benutzerdefinierte Kurven einstellen, um das Verhalten des Controllers anzupassen.

Da der Sensor auch Unterdruck messen kann, gibt es einen zweiten Strom von Controller-Meldungen, die beim Ansaugen statt beim Blasen ausgegeben werden. Beide Arten von Nachrichten können vom Benutzer eingestellt werden. Sie können zum Beispiel Blow auf Pitch Bend nach oben und Draw In auf Pitch Bend nach unten einstellen. Standardmäßig sind beide auf Controller-Nr. 2.

Schritte zum Erstellen

1. Stecken Sie den Arduino wie auf dem Foto / Schaltplan gezeigt in das Steckbrett.

2. Setzen Sie den Sensor und den Operationsverstärker in die entsprechenden Positionen ein. Beachten Sie die Ausrichtung anhand der kleinen Einkerbungen an ihren Seiten.

3. Setzen Sie die Widerstände ein, nachdem Sie ihre Beine auf die entsprechende Länge geschnitten haben.

4. Schneiden/isolieren Sie die Vollkernkabel und legen Sie sie in die entsprechenden Positionen. Ich habe Rot für 5V, Schwarz für Masse und Gelb für Signal verwendet, um dies leichter verständlich zu machen, aber Sie können natürlich alles verwenden, was Sie zur Verfügung haben.

5. Schließen Sie das Mundstück, den Schlauch, den 3-Wege-Anschluss und den Absauger wie auf dem Foto gezeigt an. Sie müssen ein Stück des Schlauchs für den "Auspuff" abschneiden.

6. Drücken Sie den 3-Wege-Stecker so, dass er auf den Sensor passt. Es sollte bleiben.

7. Installieren Sie die Arduino IDE und installieren Sie die beiden benötigten Bibliotheken (Oversampling und USB-MIDI) von Tools->Manage Libraries. Verbinden Sie den Arduino mit einem USB-Kabel mit Ihrem Computer. Laden Sie den beigefügten Code hoch.

8. Sie sollten eingestellt sein, das Arduino sollte nun als MIDI-Gerät in Ihrer DAW/Musiksoftware erscheinen. Aktivieren Sie es und leiten Sie es zusammen mit Ihrer Tastatur an ein Plug-In weiter, das Breath Controller unterstützt.

Erweiterte Informationen

Ein physikalischer Nachteil dieser Konstruktion ist der Speichel, der unweigerlich in die Röhre fließt und merkliche Luftstromschwankungen verursachen kann. Der 3-Wege-Konnektor wird verwendet, um dieses Problem zu beheben, indem der Speichel zum "Auspuff" -Rohr geleitet wird. Um eingeschlossenen Speichel im Schlauch zu minimieren, stellen Sie sicher, dass vom Mundstück zum 3-Wege-Konnektor eine kontinuierliche Neigung besteht, indem Sie die Schlauchlänge anpassen. Wenn das Röhrchen unter der Ebene des 3-Wege-Konnektors hängt, wird Speichel an seinem unteren Punkt eingeschlossen, was zu Schwankungen führt. Der babyseitige Teil des Saugers inklusive Filter ist am Auspuff angebracht, um Tropfen sowie Geräusche zu minimieren und den Luftstrom zum Sensor zu erhöhen.

Der Code enthält Werte, die Sie nach Ihren Wünschen anpassen können, einschließlich benutzerdefinierter Kurven. Kommentare beschreiben die Vorgehensweise. Wenn Sie Schwierigkeiten haben, den Punkt 127 zu erreichen, verringern Sie die maximale Reichweite oder erhöhen Sie sie, wenn es zu einfach ist. Wenn Sie Werte ändern, müssen Sie den Code erneut hochladen.

Die ersten paar Messwerte nach dem Arduino-Boot werden gemittelt, um die Ruheposition zu kalibrieren. Blasen Sie nicht in den Schlauch, während Sie das Gerät anschließen/zurücksetzen.

Sie können den Namen des MIDI-Geräts ändern, indem Sie die Datei board.txt bearbeiten (Informationen dazu für jede Plattform finden Sie im Internet).

Code

  • Atemsteuerungscode
AtemsteuerungscodeArduino
Laden Sie diesen Code über Arduino IDE auf Ihren Atem-Controller hoch. Debug-Modus (Kommentar zum Aktivieren entfernen)//#define DEBUG 1//Erstellung des USB-MIDI-InterfaceUSBMIDI_CREATE_DEFAULT_INSTANCE();//Oversampling initOversampling adc(10, 13, 6);// ************ ****** User Setup ***************** // Werte, die auf 1 enden, entsprechen dem Blasen, während die Werte, die auf 2 enden, dem Ansaugen von Luft entsprechen // Pin setupconst int sensorPin1 =A0; // Wählen Sie den Arduino-Eingangspin für den Sensor / Op Amp-Ausgang // Bereichskalibrierung. Passen Sie dies manuell an, damit Sie das Maximum erreichen, aber nicht zu leicht.int sensorRange1 =800;int sensorRange2 =800;// Ausgabe-Controller-Nummer. Wählen Sie aus der folgenden Tabelle // 0-127:Regelmäßige Control-Change-Meldungen // 128:Monophoner Aftertouch // 129:Pitch Bend Up // 130:Pitch Bend Down int controllerNumber1 =2; // Controller gesendet, wenn blowingint controllerNumber2 =2; // Regler wird beim Ansaugen von Luft gesendet// Reglerkanäle ausgebenint controllerChannel1 =1;int controllerChannel2 =1;// Sicherheitsschwellen für kleinste und höchste Werte zur Vermeidung von Schwankungen im Ruhezustand bzw. max. // Wenn im Ruhezustand mehrere Nachrichten gesendet werden, erhöhen Sie den lowThreshold. // Wenn mehrere Nachrichten gesendet werden, wenn das Maximum erreicht ist, erhöhen Sie den HighThreshold. const int lowThreshold1 =5;const int lowThreshold2 =5;const int highThreshold1 =0;const int highThreshold2 =0;// Kurvendefinition. Tabellen können eine beliebige Länge von gleich oder größer als 2 haben. Die Werte können 0-127 sein. Tabellen sollten die gleiche Anzahl von Elementen haben und "in"-Tabellen sollten in aufsteigender Reihenfolge sein. // Konvertierungen werden auf Leseebene durchgeführt, damit der Definitionsverlust minimiert wird.int in1[] ={0, 127};int out1[] ={0, 127};int in2[] ={0, 127};int out2[] ={0, 127};// Beispielkurven (Sensornummer entsprechend ändern)//Soft//int in1[] ={ 0, 6,24,78,127};//int out1[] ={0,32,64,96,127};// Reduzierter Bereich//int in1[] ={50, 100};//int out1[] ={50, 100}; // Aktualisierungszyklus (Millisekunden). Niedrigere Werte bedeuten, dass während des Betriebs mehr Nachrichten gesendet werden.int refreshCycle =0; // ***************** Implementierung **************** ** // Ab jetzt nicht mehr ändern, wenn Sie den Betrieb des Sensors nicht ändern möchten.// Interner Wert von Sensorsint sensorValue1 =0;int sensorValue2 =0;// Minimale Sensorwerte int sensorMin1;int sensorMin2;// Reglerwerte ausgebenint controllerValue1 =0;int controllerValue2 =0;// Vorherige Zykluswerte werden verwendet, um die Wiederholung identischer Meldungen zu vermeidenint previousControllerValue1 =0;int previousControllerValue2 =0;// Bereichsumwandlungsvariable initint outputRange1;int outputRange2;int sensorLow1; int sensorLow2;int sensorHigh1;int sensorHigh2;void setup() { MIDI.begin(1);#ifdef DEBUG Serial.begin (115200); //Nur für Debug-Modus#endif// Kalibrieren Sie den Ruhepunkt des Sensors durch Mittelung von 10 ersten Werten. Verwenden Sie den Sensor nicht während des Bootens des Geräts. sensorMin1 =adc.read (sensorPin1); sensorMin2 =0; // Ausgabebereiche für die gewählten Regler bestimmen outputRange1 =outputRange(controllerNumber1); outputRange2 =outputRange(controllerNumber2);}void loop() {// den Wert vom Sensor lesen:sensorValue1 =adc.read(sensorPin1); // Blasluft sensorValue2 =sensorMin1 - sensorValue1; // Luft ansaugen // Vorherige Werte speichern previousControllerValue1 =controllerValue1; vorherigerControllerValue2 =ControllerValue2; // Nutzbare Bereichsgrenzen für Sensor nach oben/unten sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min(sensorMin1,sensorRange2) - highThreshold2;// Konvertieren von internen Werten in Ausgabebereich (0..127 für Controller/Aftertouch 0..+/-8191 für Pitchbend Up/Down) mit den in "in" und . definierten Kurven "Aus"-Tabellen. 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);// MIDI-Nachrichten senden, wenn ( controllerValue1 !=previousControllerValue1) sendSensorOutput(controllerNumber1, controllerValue1, controllerChannel1); if (controllerValue2 !=previousControllerValue2) sendSensorOutput(controllerNumber2, controllerValue2, controllerChannel2);// Debug#ifdef DEBUG// Sensor (input) values ​​(Entkommentieren für Debug)// Serial.print (sensorValue1);// Serial.print (" ,"); // Serial.print (sensorValue2); // Serial.print (","); // Controller (Ausgabe) Werte Serial.print (controllerValue1); Serial.print (","); Serial.println (controllerValue2);#endif // Stoppe das Programm für Millisekunden:delay(refreshCycle);}// Funktion zum Senden von MIDI-Nachrichten entsprechend der Controller-Nummervoid sendSensorOutput (int number, int value, int channel) { if (Zahl <128) MIDI.sendControlChange(Zahl, Wert, Kanal); sonst if (Zahl ==128) MIDI.sendAfterTouch(Wert, Kanal); sonst if (Zahl ==129) MIDI.sendPitchBend(Wert, Kanal); else if (number ==130) MIDI.sendPitchBend(-value, channel);}// Funktion, die verwendet wird, um den Bereich eines bestimmten Controllers zu bestimmen. Dies liegt daran, dass Pitchbend einen größeren Bereich hat als normale controllers.int outputRange (int number) { if (number> 128) return 8191; else return 127;} // Modifizierte multiMap-Funktion zum Erstellen von Kurven. Original von Rob Tillaart.int mapToCurve(int val, int sensorLow, int sensorHigh, int* _in, int* _out, uint8_t size){// darauf achten, dass der Wert im Bereich liegt // val =Constraint(val, _in[0] , _in[Größe-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); // suche rechtes Intervall uint8_t pos =1; // _in[0] bereits getestet while(val> map(_in[pos],0,127,sensorLow,sensorHigh)) pos++; // Einstellbereich von ..127 bis Sensorbereich 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); // dies behandelt alle genauen "Punkte" im _in-Array if (val ==inPos) return outPos; // im rechten Segment für den Rest interpolieren return ((long)val - (long)inPrv) * ((long)outPos - (long)outPrv) / ((long)inPos - (long)inPrv) + (long) outPrv;}

Schaltpläne

Fritzing-Schema Circuitlab-Schaltplan

Herstellungsprozess

  1. LCD-Panel mit Arduino für Flugsimulator
  2. Webbetriebener DMX-Controller
  3. Arduino-Gamecontroller
  4. Unopad - Arduino MIDI-Controller mit Ableton
  5. Textteleporter
  6. Vakuum-Fluoreszenz-Display-Controller
  7. Arduino Home Controller aktiviert von Alexa
  8. SMART-Temperaturüberwachung für Schulen
  9. Ein isolierter Analogeingang für Arduino
  10. Roboter für supercoole Indoor-Navigation