AtmelStudio에 LUFA 라이브러리를 설치하여 USB-MIDI 장치 만들기

8481 단어 LUFAAVRUSB미디

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 사이트에서 다운로드하여 설치합니다.


Start Page에서 Download Atmel Studio Extensions를 선택합니다.


Online에서 LUFA Librasy 다운로드


이것으로 준비 완료, 한 번 AtmelStudio를 종료시킵니다.

Example 프로그램 로드

File->New->Example Project에서 MIDI Device Demo(Class Driver APIs)-AVR8 Achitectue를 선택합니다.


불필요한 모듈 삭제

이대로는 샘플 보드용 모듈이 링크되므로 ASF Wizard 탭을 열어 불필요한 모듈을 Remove해 둡니다 해주지 않으므로 나중에 손으로 삭제해야합니다)


그런 다음 Alt+F7에서 속성 탭을 열고 Device에서 (Change Device)를 클릭하여 대상 장치를 변경합니다.


Solution Exploere에서 편집할 파일을 선택하고 필요한 곳을 변경 삭제합니다.


이후에는 Build(F7)하여 불필요한 모듈에 관한 에러 표시를 보면서 불필요한 코드를 깎아 가면 Document/Atmel Studio/7.0/(프로젝트명)/(프로젝트명)/Debug에 hex파일이 작성된다 따라서 대상에 쓰면 USB 장치를 만들 수 있습니다.
이번에는 DFU로 쓰기.


MIDI 디바이스의 확인, 제대로 인식하고 있습니다


검증에 사용한 ATmega32U2 디바이스


샘플 변경하기



MIDI의 NOTE_ON을 받으면 LED를 빛내는 원래 sample을 NOTE_ON을 받으면 C4(note_no 60)의 NOTE_ON을 반환하도록 main.c를 변경합니다. Remove했으므로 관련 코드도 수작업으로 삭제) ReceivedMIDIEvent.Event

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_EVENT (와)과 MIDI_Device_SendEventPacket (을)를 호출하면 좋은 것 같습니다.

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의 인스톨로부터 자세하게 설명해 보았습니다, MIDI_Device_Flush
손쉬움으로는 Arduino(Leonaldo, Micro)입니다만 ATmeag32U2를 사용하는 경우나, 디스크립터가 V-USB등과 비교해 매우 읽기 쉽기 때문에 USB의 지식은 어느 정도 필요합니다만 복합 디바이스가 만들기 쉽다 등도 장점입니다, USB 의 속도와 USB-MID 디바이스인 리얼타임 처리(PC측의 버퍼링 처리등이 없다)를 살려 음원 제어등이 향하고 있는 것은 아닐까요.

좋은 웹페이지 즐겨찾기