またMIDIコントローラを作った

頼まれたので作りました。

前に作ったのと、ハード的にはほとんど同じです。





















スイッチはaitendoさんから。ほかはマルツオンラインさんから。
arduino Leonardoを二つ購入しましたが、USBがしっかりしてたほうがいいので、手元にあったDuemillanoveと交換。

今回はタカチのSW85Sというプラスチックケースを使ったので、ちょっとコンパクトになりました。標準arduinoがちょうどよく収まって気持ちいい。


3mmのスペーサでちょうどよく底板の枠の上にきます。









裏からみたらこんなネジ止め。
このままだと安定しないので、自分好みのゴム足を付けて使ってください。









小さくなった分ちゃんと配置しないと部品が載りません。
SketchUpでお互いの干渉具合(ネジも含め)をチェックしつつ配置決め。












穴をあけます。素材が柔らかいので作業性はいいです。
ただしいい気になっていっぺんにいこうとすると、ドリルの刃がかんでプラスチックが裂けます。

一個目。
15mmのドリルがかんで滅茶苦茶になったのをなんとか修正して使っています。
しかもけがきを間違って大穴あけてしまいました。


二個目。
ある程度あけたらリーマーに持ち替えるようにしました。
だいぶ 綺麗にいきました。







aitendoの薄膜パネルスイッチ。加工、配線が楽になるのと、安いのにクリック感があってなかなかいいのでこれにしました。

とはいっても線を通す穴は必要です。



スイッチが5個ついてるので、一応全部使えるようスケッチを変更しました。







裏から見たパターン。
シールになっていて貼りつけて使います。















ヘッダを二つ半田付けして、スイッチをまとめて挿せるコネクタを作りました。
それにともなって、D2がグランド、D3-7がスイッチ入力になるようにソフトを修正しました。


 MIDI OUTに結線。
以前作ったときは太くて固い線を使って往生したので、やわらかい線で三つ編み。
220Ωはarduinoの5v端子の直ぐ上につけました。







ソフト的にはだいぶ書き直しました。
前はチャッタリング防止に自前でデバウンス処理を書いていましたが、Bounce2というライブラリを使って楽をしました。
以下、arduinoのスケッチ。

//5 MIDI CC switches. 

//The circuit:
// * switch(momentary) 1-5 connected to digital-in 3-7 and ground.
// * digital in 1 connected to MIDI jack pin 5
// * MIDI jack pin 2 connected to ground
// * MIDI jack pin 4 connected to +5V through 220-ohm resistor
// Attach a MIDI cable to the jack.

#include <Bounce2.h>
//
enum { nd = 5 };  //number of digital switches.

const int ledPin = 13;

Bounce debouncer[nd] ;  //make Bounce object's array(but not yet instantiate each element here).
int val2[nd];  //controll value or velocity

void setup()
{
  const int inPin[nd] = {3,4,5,6,7};  //input pins for switches.
  const int gndPin = 2;  //use 2 pin as ground.
  pinMode(gndPin,OUTPUT);
  digitalWrite(gndPin,LOW);
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,LOW);
  const long debTime = 5;  //debounce time. Increase if the output flickers.

  for(int i=0 ; i < nd ; i++ )
  {
    debouncer[i] = Bounce();  //Instantiates a Bounce object.
    pinMode(inPin[i] , INPUT_PULLUP);
    debouncer[i].attach(inPin[i]);  // Set pin the instance uses.
    debouncer[i].interval(debTime);  //Set debounce time.
    debouncer[i].update();
    val2[i] = isPushed( debouncer[i].read() );
  } 
  Serial.begin(31250);
}

void loop()
{
  const int msg = 176;  //controll change. note-on:144 
  const int val1[nd] = {74,70,72,73,71};  //controll No or note No
  
  int reading;
  for(int i = 0; i < nd; i++)
  {
    debouncer[i].update();
    reading = isPushed( debouncer[i].read() );    
    if(reading != val2[i])
    {
      val2[i] = reading;
      MIDI_TX(msg, val1[i], val2[i]);
      digitalWrite( ledPin, val2[i] / 127 );
    }
  }
}

int isPushed(int p)
{
  const int pushed = 0;  //for push-on switches.
//const int pushed = 1; //Otherwise,use this for push -off switches.
  return p == pushed ? 127 : 0;
}

void MIDI_TX(int MESSAGE, int VAL1, int VAL2) 
{
  Serial.write(MESSAGE);
  Serial.write(VAL1);
  Serial.write(VAL2);
}

スケッチ終り。

コメント