Posted at

Mocoを使ったArduinoのUSB-MIDI化

More than 3 years have passed since last update.

Arduino UNO Revison 3 (R3) をMocoというUSB-MIDIファームでUSB-MIDI化した時のメモ。導入のために理解しておきたい知識が結構広範囲なのでまとめます。適宜リンク先も参照してください。


  • 前提1: Arduinoを使ってLEDを光らせる程度の普通の使い方を理解している

  • 前提2: MacにArduinoをつないでいる

  • 前提3: MIDI自体の扱いには慣れている(DAWを使ったことがある、など)

  • 前提4: 書いてる人間はソフト系(なので、ターミナル操作などは簡単に書きます)


背景知識


  • Arduino UNOはATmega328Pというマイコンに自由にプログラムを書き込んでいろいろする道具で、ホスト機(WinとかMac)からプログラムを書き込む時はシリアル通信をしている。つまり、Macから見ると、ArduinoはUSB-シリアルデバイスとして見えている。

  • USB-シリアルデバイスとして振る舞っているのはArduino UNOの本体であるATmega328Pではなく、USBコネクタの近くに配置されているATmega16U2という別の小さいマイコン (以下簡単にこれをUSBシリアルマイコンと呼ぶ)。

  • そしてこのATmega16U2のファームを書き換えることで、MacからArduinoがどのように見えるかを書き換えることができる。USB-MIDI化というのは、このATmega16U2にUSB-MIDIとして振る舞うためのファームを書き込むこと。

  • Mocoをインストールすると、普通はUSB-MIDIデバイスとして見え、Arduinoのジャンパピンをつないだときは元々と同じUSB-シリアルとして見える。ので、開発時のArduino本体のプログラム書き換えと、実用時のUSB-MIDIデバイスとしての動作を、USB-ケーブルを一度抜くだけで切り替えられるようになる(詳しくは本家開発元を参照)。


実作業


  1. Mocoのファームウェア本体をダウンロードする。githubのこのページ から「Raw」ボタンを右クリック->ファイルに保存などで.hexファイルだけ手元に持ってきてもOK。


  2. USBシリアルマイコンのファームを書き換えるためのプログラムdfu-programmerを用意する(dfu = Device Firmware Update)。自分でビルドする場合には以下の手順で (注: もっと楽な方法があるはず)。



    1. dfu-programmerのソースをダウンロードする


    2. dfu-programmerに必要なlibusbのソースをダウンロードする


    3. libusbを解凍してそのディレクトリに移動し、以下実行(注: /usr/local/以下にファイルがコピーされます

      ./configure
      
      make
      sudo make install



    4. dfu-programmerを解凍してそのディレクトリに移動し、以下実行

      export CPPFLAGS="-I/usr/local/include/libusb-1.0/"
      
      export LDFLAGS="-L/usr/local/lib"
      export LIBS="-lusb-1.0"
      ./configure
      make

      これでdfu-programmerという実行ファイルが./src/以下にできるので、適宜dualMoco.hexのあるディレクトリなどにコピー





  3. ArduinoをDevice Firmware Update (DFU) モードでホスト機と接続する。具体的にはArduinoのジャンパピンをショートさせながらホスト機とUSBケーブルで接続し、電源LED(ONと印刷がある隣)が光ったのを確認してからショートさせた箇所を解放する。こちらのページ で図解してくれています。



  4. ターミナルを立ち上げて、dfu-programmerとdualMoco.hexのあるディレクトリに移動し、以下を実行。

    sudo ./dfu-programmer atmega16u2 erase
    
    sudo ./dfu-programmer atmega16u2 flash ./dualMoco.hex
    sudo ./dfu-programmer atmega16u2 reset

    一行目で dfu-programmer: no device present. と表示される場合は失敗で、原因は(1) 1番目の引数に与えるUSBシリアルマイコンが間違っているか、(2) ArduinoがDFUモードで接続できていないか。上記コマンドはArduino UNO R3の場合の引数なので、別のArduinoの場合は別の名称になるかもしれないので、Arduino現物のUSBシリアルマイコンに印刷されている小さい文字を見たりdfu-programmerのページ でチェック。



  5. 成功したら一度USBケーブルを抜き差しすると、USBシリアルデバイスとしては認識されず(つまりArduino IDEでプログラム書き込みはこのままではできない)、USB-MIDIデバイスとして認識される。本家で紹介されている通り、ICSPコネクタのPIN4とPIN6をジャンパピンでショートさせればArduino IDEからプログラム書き込み可能。



その後は

Arduinoの普通のMIDIライブラリを使った処理がUSB-MIDIとつながるはずです。プログラム書き換え時はジャンパピンのショートをお忘れなく。


参考リンク