しぐれめも

何か作る過程をメモとして残したり、あと雑記

Arduino UNOにMocoを導入する2018

 Moco(あるいはMocoLUFA)というのは、Arduino UNOのUSBドライバを書き換えることでArduino UNOをUSB-MIDIバイスとしてPCに認識させることができる、その書き換え用のファームウェアのことで、製作者さんによって公開されています。Mocoを用いることで、USB MIDIキーボードとか、MIDI音源とかを自作することができるようになります。

 公式サイトなどに導入方法が載っているのですが、2018年7月現在、すでに情報が古く、ツールのDL先がリンク切れになっていたり*1してちょっとハマったので、備忘録として導入までの手順を書き残しておきます。ちなみに私が環境構築したPCはWindows 10で、Arduino UNOはリビジョン3です。

【 ダウンロードするもの】

(1) MocoのHEXファイル

GitHub - kuwatay/mocolufa: mocoLUFA (MIDI firmware for Arduino Uno)

ソースコードが置いてあるけど、必要なのは「HEX」の下にある「dualMoco.hex」

 

(2) Arduino UNOのUSBドライバ書き換え用のツール「ATMEL FLIP」

https://www.microchip.com/developmenttools/ProductDetails/PartNo/flip

Windowsの場合、PCにJAVAランタイムが入ってなければ (Java Runtime Environment included)と書かれた方を、入っていれば(requires Java Runtime Environment)をダウンロードする。私の場合入ってなかったので(Java Runtime Environment included)と書かれた方をダウンロードした。

 

【環境構築・書き換え手順】

(1) ATMEL FLIPをインストールする

(2) Arduino UNOをDFUモードでPCに接続する

・DFUモードで接続するには、USBコネクタ付近の6ピンのピンヘッダのUSBコネクタ側2ピンをショートさせます。

f:id:mashigure:20180724212238j:plain

・この状態でPCにUSBケーブルで接続し、Arduino UNOの電源LEDが点灯したら、ショートさせるのをやめます。

(3) デバイスマネージャで認識されているかを確認します。デバイス名が表示されている場合、このデバイス名が必要になるので、覚えておきます。

・「不明なデバイス」と表示されている場合、「ドライバの更新」からドライバをインストールします

f:id:mashigure:20180724212631p:plain

ドライバは、先ほどATMEL FLIPをインストールした場所に格納されています。デフォルトの場所にインストールした場合、ドライバの場所として「C:\Program Files (x86)\Atmel\Flip 3.4.7\usb」を指定します。(バージョンの数字が同じとは限らないので、確認してください。)

f:id:mashigure:20180724212856p:plain

あとは指示通りにインストールします。

f:id:mashigure:20180724212743p:plain

完了するとデバイス名が出てくるので、この名前を覚えておきます。

f:id:mashigure:20180724212939p:plain

(4) Arduino UNOのUSBドライバをMocoに書き換える

・ATMEL FLIPを起動します。

・左上のICのアイコンをクリックして、先ほど覚えたデバイス名を選択します

f:id:mashigure:20180724213645p:plain

f:id:mashigure:20180724213823p:plain

・次に、右隣のUSBケーブルのアイコンをクリックして、USBを選択します

f:id:mashigure:20180724214052p:plain

・左上の「File」->「Load HEX File」をクリックし、最初にダウンロードした「dualMoco.hex」を選択します。

・左下の「Run」ボタンを押すと、Arduino UNOのUSBドライバが書き換えられます。

 

【動作確認】

まずはArduino UNOに動作確認用のプログラムを書き込みます。USBコネクタを上にしたときに、先ほどの6ピンの左上2つをショートさせた状態でPCに接続すると、Arduino UNOとして認識されます。

f:id:mashigure:20180724214858j:plain

Arduino IDEを用いてプログラムを書き込みます。今回適当に作ったテストプログラムは下記の通り

//
// USB MIDI & tone function
//

#define SOUND_OUT_PIN (8)

 

/* 音の周波数テーブル */
const int note[] = {
     8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15,
    16, 17, 18, 19, 21, 22, 23, 25, 26, 28, 29, 31,
    33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62,
    65, 69, 73, 78, 82, 87, 93, 98, 104, 110, 117, 123,
   131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247,
   262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,
   523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988,
  1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976,
  2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
  4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902,
  8372, 8870, 9397, 9956,10548,11175,11840,12544
};

 

void setup()
{
     Serial.begin(31250);
     pinMode(13,OUTPUT);
}

 

void loop()
{
    static byte data[3];
    static int dat_no = 0;
    static byte key = 0;

    if ( 0 < Serial.available() )
    {
        data[dat_no] = Serial.read();

        if ( (data[dat_no]&0x80) == 0x80 )
        {
            data[0] = data[dat_no];
             dat_no = 0;
        }

        if ( (data[0]&0x80) == 0x80 )
        {
            dat_no++;
        }

        if (dat_no == 3)
        {
            /* Note ON */
            if ( ( (data[0]&0xf0) == 0x90) && 0 < data[2] )
            {
                key = data[1];
                tone(SOUND_OUT_PIN, note[key]);
                digitalWrite(13,HIGH);
            }

            /* Note OFF */
            else if ( ( (data[0]&0xf0) == 0x80) || ( ( (data[0]&0xf0) == 0x90) && data[2] == 0) )
            {
                if (data[1] == key)
                {
                    noTone(SOUND_OUT_PIN);
                    digitalWrite(13,LOW);
                }
            }

            dat_no = 0;
        }
    }
}

 

動作確認用にArduino UNOの8番ピン*2に圧電スピーカーを接続します。

f:id:mashigure:20180724220040j:plain

6ピンのピンヘッダをショートさせずにPCに接続すると、「MocoLUFA」という名前のMIDIバイスとして認識されるので、MIDIシーケンサなど適当なソフトウェアを起動して動作確認をします。音が鳴ればOK。

 

*1:Atmel社がMicrochip社に買収された影響

*2:プログラムのdefine値を書き換えれば別のPinでもOK