Arduino UNOをUSB-MIDI化

別ページで、Arduino Unoの出力をPCで取り込む際、Serial MIDIを使ってMIDIとして扱う方法を記載しました。しかし、この方法ではSerialをMIDIにして、仮想ポートを使ってWeb MIDIへ取り込むといったことをやらないとならないのでまだるっこしいと思います。そこで、Arduino UNOとPCはUSBで接続されていますので、直接USB MIDIとして見える方法を探しました。あちこちのページで記載されている方法です。私も試してみました。

参考にさせていただいたページは以下の通りです。

ただし、こちらはインストールが面倒なので、やってみるには覚悟と時間が必要かもしれません。

(1) Arduino Unoのバージョンを調べてください。以下のようにArduinoの基板の裏にUNO R3(Revision 3)と記載があればOKです。それ以外だとUSB-MIDIのインストールができません。R3で使われている、USB-Serial変換のコンバータATmega16U2にプログラムを書きこんで、USB-MIDI対応にさせます。



PC側の準備

(2) Atmel USB DFU Programmerをダウンロードします。 SOURCEFORGEからダウンロードできます。ATmega16U2にプログラムを書き込むプログラムと、PCからATmega16U2にプログラムを書きこむためのドライバーが入っています。ただし、私の環境(Windows10, 32ビット)では、新しいバージョン0.7.2(それでも5年前のソフトですが)は動作しませんでした。その代わりに0.6.2を使いました。0.6.2のダウンロードは、"Files"タグから行いました。

(3) ATmega16U2用のドライバーをインストールします。先ほどダウンロードしたdfu-programmer-win-0.6.2.zipを解凍します。

C:\Users\user\Downloads\dfu-programmer-win-0.6.2

に解凍したとします。

C:\Users\user\Downloads\dfu-programmer-win-0.6.2\dfu-prog-usb-1.2.2

の中にatmel_usb_dfu.infがありますので、これを右クリックします。表示されるメニューの上から2つめにインストールがありますのでこれを選択します。インストールの開始をしてください。

(4) もう一つ、ATmega16U2に書き込むデータをダウンロードします。必要なのはこのdualMoco.hexファイルです。ここからダウンロードできます。右クリックし「名前を付けてリンク先を保存」を選択してください。ここでは、先ほど上で解凍した

C:\Users\user\Downloads\dfu-programmer-win-0.6.2

とします。

(5) libusb0_x86.dllをlibusb0.dllと名前を変えてdfu-programmer.exeのあるフォルダーに移動します。libusb0_x86.dllは、

C:\Users\user\Downloads\dfu-programmer-win-0.6.2\dfu-prog-usb-1.2.2\x86

にあります。これをlibusb0.dllと名前を変えて次のフォルダーに移動します。

C:\Users\user\Downloads\dfu-programmer-win-0.6.2

ここまでで、フォルダーは以下のようになっているはずです。ここまでで、PC側の準備は終わりです。



ハード側の準備

(6) Arduino UNOにUSBケーブルを指す前に、赤丸で囲った2つのピンをショートさせます。

 

こんな感じです。マイナスドライバーとかピンセットの先でショートさせてもよいです。

  
 

ここでコンピュータとArduino UNOをUSBケーブルで接続します。"L"と書かれたところのLEDが点滅の後、点灯します。

  
 

(7) ピンをショートしたケーブルを外します。USBケーブルはつないだままです。PC のデバイスマネジャーで確認すると、ATmega 16U2 が見えると思います。もし見えなければ、Arduino UNOのUSBケーブルを抜いて、(3)(5)(6)をやり直して見てください。

  
 


USB-MIDIドライバーの書込み

(8) "コンソール"を立ち上げます。"コンソール"はWindows システムツールの中にあります。cd コマンドで、以下のフォルダーへ移動します。dir コマンドを打入れると以下のようにフォルダーの中身が表示されます。

> cd C:\Users\user\Downloads\dfu-programmer-win-0.6.2
> dir
 

以下のコマンドを打ち込むと、ターゲットとして利用可能なデバイスが表示されます。

> dfu-programmer.exe --targets
 

(9) ATmega 16U2の中身を消して、新しいドライバを書き込みます。そのためには2つのコマンドを打ち込みます。

> dfu-programmer atmega16u2 erase
> dfu-programmer atmega16u2 flash dualMOCO.hex
 

(10) ピンのショート無しで、Arduino UNOのUSB ケーブルを抜き差しします。PCのデバイスマネージャを開くと、 以下のようにサウンドデバイスの中にmocoLUFAが表示されます。

 
テスト

テストのためにArduino UNOにプログラムを書きこんで、MIDIがちゃんとPCに送れるかテストします。書き込むプログラムはSerial-MIDIを試した時とほぼ同じですが、一か所だけ違います。そればボーレイトです。MIDI のボーレートに合わせて、Serial.begin(31250)としなければなりません。

    void setup() {
        Serial.begin(31250);
    }
    void loop() {
        NoteOn(0x3C);  delay(500);  //C
        NoteOff(0x3C); delay(500);
        NoteOn(0x3E);  delay(500);  //D
        NoteOff(0x3E); delay(500);
        NoteOn(0x40);  delay(500);  //E
        NoteOff(0x40); delay(500);
        NoteOn(0x41);  delay(500);  //F
        NoteOff(0x41); delay(500);
        NoteOn(0x43);  delay(500);  //G
        NoteOff(0x43); delay(500);
        NoteOn(0x45);  delay(500);  //A
        NoteOff(0x45); delay(500);
        NoteOn(0x47);  delay(500);  //B
        NoteOff(0x47); delay(500);
        NoteOn(0x48);  delay(500);  //C
        NoteOff(0x48); delay(500);
    }
    void NoteOn(unsigned char noteno){
        Serial.write(0x90); Serial.write(noteno); Serial.write(0x50);
    }
    void NoteOff(unsigned char noteno){
        Serial.write(0x80); Serial.write(noteno); Serial.write(0x00);
    }
    

Arduino UNOにプログラムを書きこむためには、Arduino UNOを初期状態(すなわちUSB-MIDIではない)状態で立ち上げないとなりません。このために、下のように2ピンをショートさせて、USB を抜き差しします。元と同じようにArduino UNOはシリアルデバイスとして認識されます。

Arduino UNOでプログラムを書きこんだ後、ショートを一切させない状態でUSBの抜き差しします。これでMIDIが出ている状態になります。確認するためにMIDI Monitorを立ち上げます。NOTE ON/OFF を受け取っているのがわかります。