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ピンをショートさせます。
・この状態でPCにUSBケーブルで接続し、Arduino UNOの電源LEDが点灯したら、ショートさせるのをやめます。
(3) デバイスマネージャで認識されているかを確認します。デバイス名が表示されている場合、このデバイス名が必要になるので、覚えておきます。
・「不明なデバイス」と表示されている場合、「ドライバの更新」からドライバをインストールします
ドライバは、先ほどATMEL FLIPをインストールした場所に格納されています。デフォルトの場所にインストールした場合、ドライバの場所として「C:\Program Files (x86)\Atmel\Flip 3.4.7\usb」を指定します。(バージョンの数字が同じとは限らないので、確認してください。)
あとは指示通りにインストールします。
完了するとデバイス名が出てくるので、この名前を覚えておきます。
(4) Arduino UNOのUSBドライバをMocoに書き換える
・ATMEL FLIPを起動します。
・左上のICのアイコンをクリックして、先ほど覚えたデバイス名を選択します
・次に、右隣のUSBケーブルのアイコンをクリックして、USBを選択します
・左上の「File」->「Load HEX File」をクリックし、最初にダウンロードした「dualMoco.hex」を選択します。
・左下の「Run」ボタンを押すと、Arduino UNOのUSBドライバが書き換えられます。
【動作確認】
まずはArduino UNOに動作確認用のプログラムを書き込みます。USBコネクタを上にしたときに、先ほどの6ピンの左上2つをショートさせた状態でPCに接続すると、Arduino UNOとして認識されます。
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に圧電スピーカーを接続します。
6ピンのピンヘッダをショートさせずにPCに接続すると、「MocoLUFA」という名前のMIDIデバイスとして認識されるので、MIDIシーケンサなど適当なソフトウェアを起動して動作確認をします。音が鳴ればOK。