Arduino UNOでMIDIエクスプレッションペダル自作

Page content

はじめて電子工作しました。DTM用というかPCソフトウェアのギターエフェクトとかを操作するためにUSB接続できるMIDIエクスプレッションペダルが欲しかったのですが、まったく市販されていないので、自作してみました。思いの外、ネットの情報は古かったりボードが違ったり、より使いやすいソフトがあったりして紆余曲折したので、ここに私の通った手順を纏めておきます。

購入したもの

./parts.jpg

Amazonでそろえると全部で3千円くらいでしょうか。ATMEGA16U2というのが後述のMocoLufaで動作確認されていた部品っぽいのでUNO互換機を買うときは動作実績を調べると良いと思います。ペダルは極性とかあると思いますが、受け取り側を作るのでなんでもいいです。

ステレオジャックのはんだ付け

エクスプレッションペダルの出力はTRSつまりステレオであり、どっちかのチャネルで電圧をうけとり、ペダルの位置に応じた電圧で片方のチャネルで返すっぽいという雑な理解をしています。

ステレオジャックにある三つの端子をジャンパーとはんだ付けした。ボードの5V/GND/A0にそれぞれつなぐ。どれがどれかは勘で試せばいいが、真ん中の根元につながる端子がGNDです。

./jack.jpg

参考: ステレオジャックの仕組み https://effector-guitar.com/tsunagubasyo/2/

Arduino IDEとドライバの準備

下記のソフトをページに従ってインストールする

MIDI Libraryやネット上の例をみて見様見真似でやった下記のソースコードをArduino IDEにコピペして左上の ボタンを押してボードに書き込む。

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

int lastVal = 0;
int tempAnalog = 0;

void setup() {
  Serial.begin(300);  // 300bps で通信
  MIDI.begin(MIDI_CHANNEL_OMNI);  // 全メッセージ取得
}

void loop() {
  // アナログ入力信号の読み出し
  tempAnalog = analogRead(A0);
  // 10 bit to 7 bit
  tempAnalog = map(tempAnalog, 0, 1023, 0, 127);
  tempAnalog = constrain(tempAnalog, 0, 127);
  // 変更があれば出力
  if(tempAnalog != lastVal)
  {
    // Ch 1 CC11 (expression) に取得した値を送る
    MIDI.sendControlChange(11, tempAnalog, 1);
  }
  lastVal = tempAnalog;
  delay(5);
}

参考: ボードもライブラリも違うので注意 https://www.kuassa.com/diy-tutorial-how-to-build-arduino-based-expression-pedal-for-efektor-wf3607/

MIDI デバイスファームウェア

ここが一番ややこしいのですが、Arduinoデバイスとして認識してIDEからコードを書き込むときと、MIDIデバイスとして認識してほしいときの二つの状態がある。 ファームウェアを書き込むDFUモードはPC接続の直前にUSB端子近くのピン(下記画像のRESET, GND)を短絡させているかどうかで切り替えられる。短絡させるのは適当にクリップとか手で押さえていても良い。起動したら手を放さないと認識してくれない。

./short.png

うまくDFUモードで起動したら、まずMIDIデバイス用のファームウェアを書き換えるソフト dfu-programmer (Win/Mac/Linuxなんでも動きそう) をインストールする。その後、ファームウェアをかきこむ。

適当にmsysとかpowershellとかいったターミナルでDL後にdfu-programmerを展開したディレクトリで下記のコマンドを打つ

./dfu-programmer.exe ATmega16U2 erase
./dfu-programmer.exe ATmega16U2 flash dualMoco.hex
./dfu-programmer.exe ATmega16U2 reset

MocoLufa といった MIDI デバイスが DTM ソフトやデバイスマネジャーから見えれば成功。

コードを修正したいなどファームウェアをデフォルトに戻すときは dualMoco.hex ではなく Arduino-usbserial-atmega16u2-Uno-Rev3.hex を flash します。

動作検証

動いてる様子を動画に撮りました。GuitarRigのWahPedalを操作しています。ワウワウしています。

https://twitter.com/i/status/1198140201173807105