Arduino Breath Controller zum günstigen Preis (USB-MIDI)
Komponenten und Verbrauchsmaterialien
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Notwendige Werkzeuge und Maschinen
|
Apps und Onlinedienste
|
Ü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ürSchaltpläne
Fritzing-Schema Circuitlab-SchaltplanHerstellungsprozess
- LCD-Panel mit Arduino für Flugsimulator
- Webbetriebener DMX-Controller
- Arduino-Gamecontroller
- Unopad - Arduino MIDI-Controller mit Ableton
- Textteleporter
- Vakuum-Fluoreszenz-Display-Controller
- Arduino Home Controller aktiviert von Alexa
- SMART-Temperaturüberwachung für Schulen
- Ein isolierter Analogeingang für Arduino
- Roboter für supercoole Indoor-Navigation