ArduinoのUSB MIDIコントローラー

画像

もう一度、ギターを弾き、Peavey ReValverやその他のAmplitubeを介してサウンドを制御し、MIDIコントローラーを購入することを考えました。 Guitar Rig Kontrol 3などのブランド化されたデバイスの価格は約13,000ルーブルで、床に取り付けられたパフォーマンスしかありません。 つまり、いくつかの規制当局の位置を迅速に変更することは非常に問題です。

さまざまなフェーダーとエンコーダーがあるため、さまざまなDJ指向性コントローラーがより面白く見えました。 ビジネスと喜びを組み合わせて、MIDIコントローラーを自分で作成することにしました。

初期要件:2〜7フェーダー、同数の回転式ポテンショメーター/エンコーダー、約10個のボタン、USB接続。

その後、彼はコンポーネントを選択し始めました。 Arduinoが選択した理由は、可用性のためです。原則として、同じATmega32u4、STM、または別のコントローラーを使用できます。 地元のラジオ店で見られるフェーダーとボタン。 エンコーダーとポテンショメーターはかつて購入されました。 ガレージで見つかったタンブラー。 ケースは、DVDプレーヤーのトップカバーから作成することにしました。

付属品:


まず、ケースを曲げ、ドリルでフェーダー用の穴を開けました。

画像

それから彼はタンブラーと口のために穴を開けました。 ポテンショメーター、ボタンの位置をマーク。 19にドリル(および対応するドリル用カートリッジ)がなかったため、13にボタン用の穴を開けてから、スキャンでそれらを増やしました。



ベースの準備ができたので、このすべてをArduinoに接続する方法について考えることができます。 この問題を研究中に、私は素晴らしいHIDUINOプロジェクトに出会いました。 これはArduinoに搭載されているATmega16u2のファームウェアです。これにより、デバイスはUSB-HID MIDIデバイスとして識別されます。 MIDIデータはUARTを介して31250ボーの速度でのみ送信できます。 MIDIイベントコードで定義されたソースコードを散らかさないように、 このライブラリを使用しました

Arduinoを使用したので、すべての周辺機器が既に接続されるシールドを作成することにしました。
シールドスキーム:

画像

図からわかるように、ボタンはマトリックスパターンで接続されています。 内蔵のプルアップ抵抗ATmega328が関係するため、ロジックは逆になります。

ボタンの初期化
for(byte i = 0; i < COLS; i++){ //--      pinMode(colPins[i], OUTPUT); //--   . 1 digitalWrite(colPins[i], HIGH); } for(byte i = 0; i < ROWS; i++){ //--     --------- pinMode(rowPins[i], INPUT); //--     -- digitalWrite(rowPins[i], HIGH); } 

値の読み取り
  for(byte i = 0; i < COLS; i++) //-   ----- { digitalWrite(colPins[i], LOW); //--    0--- for(byte j = 0; j < ROWS; j++) //--   -- { //--     -- dval=digitalRead(rowPins[j]); if ( dval == LOW && buttonState[i][j] == HIGH ) MIDI.sendNoteOn(kpdNote[j][i],127,1); if ( dval == HIGH && buttonState[i][j] == LOW ) MIDI.sendNoteOff(kpdNote[j][i],127,1); buttonState[i][j] = dval; } digitalWrite(colPins[i], HIGH); } 



私は印にダイオードを置くのを忘れました、私はボタンにはんだ付けしなければなりませんでした。

ポテンショメータは、4052bマルチプレクサを介してADC入力に接続されます。

ポテンショメーターの位置の読み取り
  for(byte chn = 0; chn < 4; chn++) //-    { set_mp_chn(chn); //--   val=analogRead(0) / 8; //--    X if (abs(val-PrVal[chn]) > 5) //--   .   { //--   5,     MIDI.sendControlChange(chn,val,1); PrVal[chn]=val; } val=analogRead(1) / 8; //--    Y  X if (abs(val-PrVal[chn+4]) > 5) { MIDI.sendControlChange(chn+4,val,1); PrVal[chn+4]=val; } } 


エンコーダはハードウェア割り込みでハングしました。

エンコーダー読み取り
 void enc() //   { currenttime=millis(); if (abs(ltime-currenttime)>50) //  { b=digitalRead(4); if (b == HIGH && eval<=122) eval=eval+5; else if (b == LOW && eval>=5) eval=eval-5; MIDI.sendControlChange(9,eval,1); ltime = millis(); } } 


回路基板をスプリントレイアウトで印刷し、粘着フィルムと塩化第二鉄を使用して古き良きLUT'omで作成しました。 はんだの品質はひどいはんだの影響を受けます。

レディシールド:




ファームウェアをATmega32u4にアップロードするために、ICSPの2つのピンを短時間短絡させた後、 Flipを使用しました。 その後、これらのピンにボタンを接続しました。



ファームウェアは動作しますが、壁とフロントパネルを固定するために残ります。 すべてを所定の位置にマークしたので、タイムバーを描画するのに何よりも時間がかかりました。 このように見えた:

パネルは、印刷およびラミネート加工されたフィルムでコーティングされたミリメートルPETで作られ、穴はcdrファイルを使用してレーザーで切断されました。 イルクーツクの広告主にとっては、これだけで240ルーブルしかかかりません。



合板からののこぎりで切った側壁。

現在のデバイスのタイプ:





コンポーネントのコスト:

合計:1025こする。

コントローラは、それに割り当てられたタスクを処理し、ほとんどすべてのオーディオ処理プログラムでサウンドを制御します。

合板を汚れで覆い、プレキシガラスから底部カバーを切り取ることが計画されています。 また、フロアコントローラを接続するための拡張ポートを追加します。

githubのArduinoとsignetのコード: https : //github.com/vlr-baik/MyMidi

関連資料


Source: https://habr.com/ru/post/J257717/


All Articles