본문 바로가기

[AVR]/AT90USB

[AT90USB162 EVM] HID Mouse 만들기

[AT90USB162 EVM] HID Mouse 만들기


AT90USB162는 AVR코어에 USB기능이 있는 칩이다. 저렴하게 그리고 기존 AVR코드를 활용해서 USB기능을 추가하여 제작할 경우 유용하게 사용될수 있다.

Atmel사에서 제공하는 예제를 이용하여 HID Mouse를 간단히 만들어 보았다.
우선 마우스의 구동을 위해 스위치가 있는 확장보드를 이용해 하드웨어를 구성한다.  각 키에 따라 UP(PB0), Down(PB1), Left(PC5), Right(PB6)를 점퍼 이용하여 설정.



그리고 보드 자체의 LED와 스위치를 이용해 마우스 클릭 버턴 Click(PD1) 을 구현한다.


AT90USB162 HID Mouse 소스코드
(소스코드)

gcc를 이용한 AVRStudio를 이용하여 컴파일 가능하다.
stk526.h 파일의 마우스 이동을 설정하는 키 및 LED 정의를 [AT90USB162 EVM] 하드웨어에 맞게 설정한다.
//Key define
#define   Joy_init()                Cbi(DDRC, BIT5|BIT6);Cbi(DDRB, BIT0|BIT1);Sbi(PORTC, BIT5|BIT6);Sbi(PORTB, BIT0|BIT1);
#define   Push_button_init()        Joy_init()

#define   Is_joy_left()             (((PINC&BIT5) == 0) ? TRUE : FALSE)   
#define   Is_joy_not_left()         (((PINC&BIT5) == 0) ? FALSE : TRUE)
#define   Is_button_left()          Is_joy_left()
#define   Is_button_not_left()      Is_joy_not_left()

#define   Is_joy_middle()           FALSE
#define   Is_joy_not_middle()       TRUE
#define   Is_joy_select()           Is_joy_middle()
#define   Is_joy_not_select()       Is_joy_not_middle()
#define   Is_button_middle()        Is_joy_middle()
#define   Is_button_not_middle()    Is_joy_not_middle()

#define   Is_joy_right()            (((PINC&BIT6) == 0) ? TRUE : FALSE)
#define   Is_joy_not_right()        (((PINC&BIT6) == 0) ? FALSE : TRUE)
#define   Is_button_right()         Is_joy_right()
#define   Is_button_not_right()     Is_joy_not_right()

#define   Is_joy_down()             (((PINB&BIT1) == 0) ? TRUE : FALSE)
#define   Is_joy_not_down()         (((PINB&BIT1) == 0) ? FALSE : TRUE)
#define   Is_button_down()          Is_joy_down()
#define   Is_button_not_down()      Is_joy_not_down()

#define   Is_joy_up()               (((PINB&BIT0) == 0) ? TRUE : FALSE)
#define   Is_joy_not_up()           (((PINB&BIT0) == 0) ? FALSE : TRUE)
#define   Is_button_up()            Is_joy_up()
#define   Is_button_not_up()        Is_joy_not_up()

#define   Hwb_button_init()         Cbi(DDRD, BIT1);Sbi(PORTD, BIT1)
#define   Is_hwb()                  (((PIND&BIT1) == 0) ? TRUE : FALSE)


마우스 인식후 실제 마우스 동작에 따른 이벤트 처리는  is_usb_mouse_event()함수에서 설정하면 되고 이 예제에서는 마우스 클릭에 따라 LED가 On/Off되도록 수정했다. is_usb_mouse_event()함수는 main에서 10ms 주기로 수행된다. 물론 실행 주기의 변경도 가능하다.
bit is_usb_mouse_event(void)
{
   bit usb_mouse_event_stored;
   Usb_mouse_report_reset();

   if(Is_device_enumerated())
   {
  //마우스 버턴에 따라 LED표시
  if(Is_mouse_click_left_event())Led1On();
  else Led1Off();
  
  if(Is_mouse_up_event())Led2On();
  else Led2Off();  

//마우스 이동 및 버턴에 따를 처리
  if(Is_mouse_click_left_event())
  {
   Usb_mouse_click_left();
   usb_mouse_event_stored = 1;
  }

  if(Is_mouse_release_left_event())
  {
   Usb_mouse_release_left();
   usb_mouse_event_stored = 1;
  }

  if (Is_mouse_up_event())
  {
   Usb_mouse_up();
   usb_mouse_event_stored = 1;
  } 

  if (Is_mouse_left_event())
  {
   Usb_mouse_left();
   usb_mouse_event_stored = 1;
  }

  if (Is_mouse_right_event())
  {
   Usb_mouse_right();
   usb_mouse_event_stored = 1;
  }

  if (Is_mouse_down_event())
  {
   Usb_mouse_down();
   usb_mouse_event_stored = 1;

:
}


AT90USB162 HID Mouse 테스트 동영상
반응형