工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

安価なArduinoブレスコントローラー(USB-MIDI)

コンポーネントと消耗品

>
Arduino Micro
クローンを使用するとコストを下げることができますが、オリジナルをお勧めします。ネイティブUSB機能により、Micro(ATmega32U4)のみが機能します。
× 1
ソルダーレスブレッドボードハーフサイズ
× 1
MPS20N0040D-D圧力センサー
汚れが安く、見つけやすいです。
× 1
LM358-Nオペアンプ
センサーの信号を増幅するために、人気のあるLM358オペアンプを使用します。
× 1
抵抗1Mオーム
× 2
フックアップワイヤーキット、22 AWG
もちろん、完全なキットは必要ありません。数cmの単線コアワイヤだけです。
× 1
赤ちゃんの鼻の吸引器
うん、あなたは正しく読んだ。親側のマウスピースと赤ちゃん側の吸引器を使用します。同じタイプの手動吸引器が数十あります(たとえば、Physiomer Nasal Aspirator、Chicco Physiocleanなど)。より快適なマウスピースタイプを選択してください。
× 1
5mm水族館エアラインチューブ
オプション、吸引器のチューブが十分に長くない場合。標準的な水族館の航空会社のチューブで十分です。
× 1
3方向エアチューブコネクタ
この特定の中国のOEMは、さまざまな名前の水族館の店で簡単に見つけることができます。センサーに直接フィットします。
× 1

必要なツールとマシン

>
ワイヤーストリッパーとカッター、32-20 AWG / 0.05-0.5 mm²単線およびより線

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

はじめに

このプロジェクトでは、シンプルなUSBMIDIプラグアンドプレイブレスコントローラーを構築します。簡単に見つけられる安価なコンポーネントを使用して設計されているため、総コストは手頃な価格であり、市販の同等品をはるかに下回っています。これは空気圧センサーのみを使用する基本バージョンですが、将来的にはバイトセンサーとうなずき/傾きセンサーを含むようにアップグレードする予定です。

このプロジェクトは、いくつかの非常に基本的な電子機器とArduinoの知識を前提としていますが、はんだ付けが不要なため、初心者でも構築できます。もちろん、上級ユーザーはすべてをパーマプロトタイプボードにはんだ付けできます。インターネット上には優れたチュートリアルがあるため、IDE /ライブラリのインストールとコードのアップロード手順については説明していません。

オーバーサンプリングは、センサーの入力を滑らかにして非常に良い結果を出すために使用されます。範囲を好みに合わせて調整したり、カスタムカーブをダイヤルしてコントローラーの動作を調整したりすることもできます。

センサーは負圧も測定できるため、吹く代わりに空気を吸い込むと出力されるコントローラーメッセージの2番目のストリームがあります。どちらのタイプのメッセージもユーザーが設定できます。たとえば、ブローをピッチベンドアップに設定し、ドローインをピッチベンドダウンに設定できます。デフォルトでは、両方ともコントローラー番号に設定されています。 2.

構築する手順

1.写真/回路図に示すように、Arduinoをブレッドボードに挿入します。

<図>

2.センサーとオペアンプをそれぞれの位置に挿入します。側面の小さなくぼみに基づいた向きに注意してください。

3.脚を適切な長さに切断した後、抵抗器を挿入します。

4.ソリッドコアケーブルを切断/剥ぎ取り、それぞれの位置に配置します。これを理解しやすくするために、5Vには赤、アースには黒、信号には黄色を使用しましたが、もちろん、利用可能なものなら何でも使用できます。

5.写真のように、マウスピース、チューブ、3方向コネクタ、および吸引器を接続します。 「排気」のためにチューブの一部をカットする必要があります。

<図>

6.センサーに合うように3方向コネクタを押します。そのままにしておく必要があります。

<図>

7. Arduino IDEをインストールし、[ツール]-> [ライブラリの管理]から必要な2つのライブラリ(オーバーサンプリングとUSB-MIDI)をインストールします。 ArduinoをUSBケーブルでコンピューターに接続します。添付のコードをアップロードします。

8.設定する必要があります。これで、ArduinoがDAW /ミュージックソフトウェアにMIDIデバイスとして表示されます。有効にして、キーボードと一緒にブレスコントローラーをサポートするプラグインにルーティングします。

<図>

<図>

高度な情報

この設計の物理的な欠点の1つは、唾液がチューブ内を必然的に流れ、顕著な気流の変動を引き起こす可能性があることです。 3方向コネクタは、唾液を「排気」チューブに送ることでこの問題に対処するために使用されます。チューブ内に閉じ込められた唾液を最小限に抑えるために、チューブの長さを調整して、マウスピースから3方向コネクタまで連続した傾斜が​​あることを確認してください。チューブが3方向コネクタレベルの下にぶら下がっている場合、唾液はその下部に閉じ込められ、変動を引き起こします。フィルターを含むアスピレーターの赤ちゃん側の部分は排気口に取り付けられており、滴りや騒音を最小限に抑え、センサーへの空気の流れを増やします。

コードには、カスタムカーブなど、好みに合わせて調整できる値があります。コメントはこれを行う方法を説明しています。 127ポイントに到達するのが難しい場合は、最大範囲を減らします。簡単すぎる場合は、最大範囲を増やします。値を変更するたびに、コードを再アップロードする必要があります。

Arduinoの起動後の最初の数回の読み取り値は、休止位置を調整するために平均化されます。デバイスの接続/リセット中にチューブに息を吹き込まないでください。

board.txtファイルを編集してMIDIデバイスの名前を変更できます(各プラットフォームでこれを行う方法に関する情報はインターネットで入手できます)。

コード

  • ブレスコントローラーコード
ブレスコントローラーコード Arduino
このコードをArduinoIDEを介してブレスコントローラーにアップロードします
 / *ブレスコントローラー* ///使用するライブラリー-ツール->ライブラリーの管理#include  #include  //からインストールしますデバッグモード(有効にするためにコメントを外す)//#defineDEBUG 1 // USB MIDIインターフェイスの作成USBMIDI_CREATE_DEFAULT_INSTANCE(); //オーバーサンプリングinitOversamplingadc(10、13、6); // *********** ******ユーザー設定***************** // 1で終わる値はブローに対応し、2で終わる値は空中吸引に対応します//ピンsetupconst int SensorPin1 =A0; //センサー/オペアンプ出力用のArduino入力ピンを選択します//範囲校正。これを手動で調整して、最大に到達できるようにしますが、簡単にはなりません。intsensorRange1=800; int SensorRange2 =800; //出力コントローラー番号。以下の表から選択してください// 0-127:通常のコントロール変更メッセージ// 128:モノラルアフタータッチ// 129:ピッチベンドアップ// 130:ピッチベンドダウンint controllerNumber1 =2; //ブローイング時に送信されるコントローラーincontrollerNumber2 =2; //空中に引き込むときに送信されるコントローラー//出力コントローラーchannelsintcontrollerChannel1 =1; int controllerChannel2 =1; //静止時または最大時の変動を回避するための最小値と最大値の安全しきい値。 //静止時に複数のメッセージが送信される場合は、lowThresholdを増やします。 //最大で複数のメッセージが送信される場合は、highThresholdを増やします。 const int lowThreshold1 =5; const int lowThreshold2 =5; const int highThreshold1 =0; const int highThreshold2 =0; //曲線の定義。テーブルの長さは2以上にすることができます。値は0〜127です。テーブルには同じ数の要素が必要であり、「in」テーブルは昇順である必要があります。//変換は読み取りレベルで行われるため、定義の損失は最小限に抑えられます。intin1[] ={0、127}; int out1 [] ={0、127}; int in2 [] ={0、127}; int out2 [] ={0、127}; //曲線の例(それに応じてセンサー番号を変更)// Soft // int in1 [] ={ 0、6,24,78,127}; // int out1 [] ={0,32,64,96,127}; //範囲の縮小// int in1 [] ={50、100}; // int out1 [] ={50、100}; //更新サイクル(ミリ秒)。値が小さいほど、操作中に送信されるメッセージが増えることを意味します。intrefreshCycle=0; // *****************実装*************** ** //センサーの動作を変更する意図がない場合は、この時点以降は変更しないでください。//Sensorsintの内部値sensorValue1 =0; int SensorValue2 =0; //最小センサー値intsensorMin1; int SensorMin2; //出力コントローラー値intcontrollerValue1 =0; int controllerValue2 =0; //同一メッセージの繰り返しを回避するために使用される前のサイクル値intpreviousControllerValue1 =0; int previousControllerValue2 =0; //範囲変換変数initintoutputRange1; int outputRange2; int SensorLow1; int SensorLow2; int SensorHigh1; int SensorHigh2; void setup(){MIDI.begin(1); #ifdef DEBUG Serial.begin(115200); //デバッグモードの場合のみ#endif //最初の10個の値を平均して、センサーの静止点を調整します。デバイスの起動中はセンサーを使用しないでください。 SensorMin1 =adc.read(sensorPin1); SensorMin2 =0; //選択したコントローラーの出力範囲を決定しますoutputRange1 =outputRange(controllerNumber1); outputRange2 =outputRange(controllerNumber2);} void loop(){//センサーから値を読み取ります:sensorValue1 =adc.read(sensorPin1); //吹く空気sensorValue2 =SensorMin1-sensorValue1; //空中で描画//以前の値を保存previousControllerValue1 =controllerValue1; previousControllerValue2 =controllerValue2; //センサーの上下の使用可能な範囲制限sensorLow1 =SensorMin1 + lowThreshold1; SensorLow2 =SensorMin2 + lowThreshold2; SensorHigh1 =SensorLow1 + SensorRange1-highThreshold1; SensorHigh2 =min(sensorMin1、sensorRange2)-highThreshold2; // "in"で定義された曲線を使用して、内部値を出力範囲(コントローラーの場合は0..127 /アフタータッチ0 .. +/- 8191、ピッチベンドの上下の場合)に変換します。 「アウト」テーブル。 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メッセージを送信するif( controllerValue1!=previousControllerValue1)sendSensorOutput(controllerNumber1、controllerValue1、controllerChannel1); if(controllerValue2!=previousControllerValue2)sendSensorOutput(controllerNumber2、controllerValue2、controllerChannel2); // Debug#ifdef DEBUG //センサー(入力)値(デバッグのコメント解除)// Serial.print(sensorValue1); // Serial.print( " 、 "); // Serial.print(sensorValue2); // Serial.print("、 "); //コントローラー(出力)値Serial.print(controllerValue1); Serial.print( "、"); Serial.println(controllerValue2);#endif // ミリ秒の間プログラムを停止します:delay(refreshCycle);} //コントローラー番号に従ってMIDIメッセージを送信するために使用される関数voidsendSensorOutput(int number、int value、int channel) {if(number <128)MIDI.sendControlChange(number、value、channel); else if(number ==128)MIDI.sendAfterTouch(value、channel); else if(number ==129)MIDI.sendPitchBend(value、channel); else if(number ==130)MIDI.sendPitchBend(-value、channel);} //特定のコントローラーの範囲を決定するために使用される関数。これは、ピッチベンドの範囲が通常のコントローラーよりも広いためです。intoutputRange(int number){if(number> 128)return 8191; else return 127;} //曲線の作成に使用される変更されたmultiMap関数。オリジナルbyRob Tillaart.int mapToCurve(int val、int SensorLow、int SensorHigh、int * _in、int * _out、uint8_t size){//値が範囲内にあることに注意してください// val =strike(val、_in [0] 、_in [size-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); //正しい間隔を検索uint8_tpos =1; // _in [0]はすでにテスト済みwhile(val> map(_in [pos]、0,127、sensorLow、sensorHigh))pos ++; //..127からセンサー範囲までの範囲を調整しますintinPos =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); //(val ==inPos)return outPosの場合、これは_in配列内のすべての正確な「ポイント」を処理します。 //残りの部分を右セグメントで補間return((long)val-(long)inPrv)*((long)outPos-(long)outPrv)/((long)inPos-(long)inPrv)+(long) outPrv;} 

回路図

フリッツの概略図 Circuitlab回路図

製造プロセス

  1. フライトシミュレータ用のArduinoを備えたLCDパネル
  2. Web操作のDMXコントローラー
  3. Arduinoゲームコントローラー
  4. Unopad-Abletonを搭載したArduinoMIDIコントローラー
  5. テキストテレポーター
  6. 真空蛍光表示管コントローラー
  7. Alexaによってアクティブ化されたArduinoホームコントローラー
  8. 学校向けのSMART温度監視
  9. Arduino用の8ビットIOポートライブラリ
  10. Arduino用の絶縁アナログ入力
  11. 超クールな屋内ナビゲーション用ロボット