LoginSignup
5
5

More than 5 years have passed since last update.

AtmelStudioにLUFAライブラリをインストールしてUSB-MIDIデバイスを作成

Posted at

LUFAライブラリでUSBデバイスの作成

AVRマイコンでUSBデバイスを作成する場合V-USBやATmega32U4を使いArduinoIDEを利用する方法、LUFAライブラリを使用するなどがあります
LUFAに関してはAtmelStuido6.2以前の記事しか見当たらないのでAtmelStudio7へのLUFAのインストールからsampleのMIDIデバイスを変更してMIDIのNOTEO_ONに対してC4(標準のド)のNOTE_ONを返すデバイスを作成するまでを記事にしてみました。

AtmelStudio7とLUFAライブラリのインストール

AtmelStudio7をMicrochip社のサイトからダウンロードしインストールします。
AtmelStudio.jpg

Start PageからDownload Atmel Studio Extensionsを選び
AtmelStudio3.jpg

OnlineからLUFA LibrasyをDownload
AtmelStudioLUFA.jpg

これで準備完了、一度AtmelStudioを終了させます。

Exampleプログラムをロード

File->New->Example ProjectからMIDI Device Demo(Class Driver APIs)-AVR8 Achitectueを選びます。
AtmelStudioLUFASampleMIDI.jpg

不要なモジュールの削除

このままではサンプルボード用のモジュールがリンクされるのでASF Wizardタブを開き不要なモジュールをRemoveしておきます(Board Suppotはuser、LED,Joystic,Buttonsは不要、ヘッダファイルのインクルードとか関係するコードはRemoveしてくれないので後で手で削除しないといけません)
AtmelStudioLUFASampleAFS.jpg

次にAlt+F7でプロパティタブを開きDeviceから(Change Device)をクリックしターゲットのデバイスを変更します。
AtmelStudioLUFASampleDeviceChange.jpg

Solution Exploereから編集するファイルを選び、必要な所を変更削除します。
AtmelStudioLUFASampleSolExp.jpg

後はBuild(F7)して不要なモジュールに関するエラー表示を見ながら不要なコードを削って行けば、Document/Atmel Studio/7.0/(プロジェクト名)/(プロジェクト名)/Debugにhexファイルが作成されるのでターゲットに書き込めばUSBデバイスが作成出来ます。
今回はDFUで書き込み。
AtmelStudioLUFASampleMIDIDFU.jpg

MIDIデバイスの確認、ちゃんと認識してます
AtmelStudioLUFASampleMIDIDevice.jpg

検証に使用したATmega32U2デバイス
SANY0126.JPG

sampleを変えてみる

MIDIのNOTE_ONを受けるとLEDを光らせる元sampleをNOTE_ONを受けるとC4(note_no 60)のNOTE_ONを返すようにmain.cを変更します、CDCデバイスのコールバックテストみたいな感じ(LEDモジュールt等をRemoveしたので関連するコードも手作業で削除)ReceivedMIDIEvent.Eventを見てMIDI_EVENTのNOTE_NOと判断しているので他のイベントを拾うときはこの辺りを変更して下さい。

main.cの一部
int main(void)
{
    SetupHardware();
    GlobalInterruptEnable();
    for (;;)
    {
        MIDI_EventPacket_t ReceivedMIDIEvent;
        while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
        {
            if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (ReceivedMIDIEvent.Data3 > 0))
                if(ReceivedMIDIEvent.Data2 != 60)
                    send_NOTE(60,127);  //C4 ON
        }
        MIDI_Device_USBTask(&Keyboard_MIDI_Interface);
        USB_USBTask();
    }
}

反対にMIDIコマンドをホストへ送るにはMIDI_EventPacket_tにMIDI_COMMANDをセットしてMIDI_Device_SendEventPacketMIDI_Device_Flushを呼び出せば良いようです。

MIDIのNOTE_ONを返す関数
void send_NOTE(uint8_t note_no,uint8_t velo){
    MIDI_EventPacket_t MIDIEvent;

    MIDIEvent = (MIDI_EventPacket_t)
      {
          .Event       = MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON),

          .Data1       = 0x90,
          .Data2       = note_no,
          .Data3       = velo,
      };
      MIDI_Device_SendEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent);
      MIDI_Device_Flush(&Keyboard_MIDI_Interface);
}

最後に

LUFAライブラリを使ったUSB-MIDIデバイスの作成をAtmelStudioのインストールからざっくり説明してみました、LUFAのライブラリのドキュメントのこの辺りを読めばsampleコードを変更して色々なUSBデバイスを作ることが出来ます。
お手軽さではArduino(Leonaldo,Micro)ですがATmeag32U2を使う場合や、ディスクリプタがV-USBなどと比べ非常に読み易いのでUSBの知識はある程度必要ですが複合デバイスが作り易いなども長所です、USBの速度とUSB-MIDデバイスであるリアルタイム処理(PC側のバッファリング処理等が無い)を生かして音源制御などが向いているのではないでしょうか。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5