[INTERFACE]/USB2018. 3. 22. 02:04

USB KeyBoard Encoder 보드 제작

USB KeyBoard Encoder 보드 제작


USB Keyboard 로 동작하는 Encoder 보드를 제작했다.

5개의 키 값과 Encoder값을 입력 받아 처리 할수 있는 보드로 MCU는 ST사의 STM32F042를 적용하여 제작하였다.

HID composite device 로 인식해서 Key값을 실시간으로 변경 가능하다.


USB KeyBoard Encoder 보드 구성도



Key값은 HID Key Config 프로그램으로 재 설정 가능하다. HID 장시치로 인식해서 동작중 실시간으로 설정 가능하다.

키값는 Function Key(CTRL, ALT, SHIFT), Normal Key 에디트 창에서 키값을 입력하면 간단히 설정 가능하다.


Posted by nexp

댓글을 달아 주세요

[INTERFACE]/USB2017. 12. 1. 17:32

USB 복합장치 제작

USB HID 복합장치 제작 하려고 하고 있다.
15년전에 제작 했던 자료를 꺼내서 해 보려고 했더니 너무 옛날 보드라 관련 자료도 없고 개발환경도 너무나 달라져서 별로 도움이 되지 않는다.

예전에는 USB 시퀀스 잘 알고 있었는데... HID 키보드, 마우스, 조이스틱 (복합장치)등의 장치를 잘 다루었는데..
새로하려니 쉽지가 않다.

우선 기존에 잘 동작 하던 보드에 레포트 디스크립터만 수정하면 되지 않을까?
-> 잘안된다.



TI 자료가 잘 정리되어 있는것 같다.

디스크립터 툴도 제공한다. 우선 기존에 만들었던 TI MSP430F5510 EVM 보드로 테스트 해보자




수정된 디스크립터를 이용해서 컴파일 했는데...  Custom HID는 잡히는데 키보드는 인식을 하지 못한다.
이상하다.
키보드 디스크립터만 만들어서 테스트 해보자
여전히 안된다.

뭐가 문제 이지?
코드에 수정해야 할부분이 또 따로 있나?
되는 코드와 안되는 코드를 비교해보자.

PID 부분이 다르다. PID를 바꾸니 잘 동작한다.
#define USB_VID               0x2047    // Vendor ID (VID)
#define USB_PID               0x0315        // Product ID (PID)

PID가 바뀐다고 안될이유는 없는데...
기존 드라이버를 지워보자

장치관리자에서 드라이버를 삭제하고 새로인식하니 잘 동작한다.
처음에 디스크립터 바꾸면서 잘못된 드라이버가 로딩되면서 문제가 된것 같다.



장치관리자에서 키보드, 커스텀 HID 복합 장치가 등록 되는것을 확인 할 수 있다.







기존 키보드 예제로 테스트 하려고 했는데...
HID 수신이 안된다.

그래서 HID 예제로 테스트 했다.
USB_Cconfig 폴더 내용만 복사하면 된다.
G:\DOC\MCU\MSP430\MSP430USBDevelopersPackage_5_20_06_02\MSP430_USB_Software\MSP430_USB_API\examples\HH1_hidDemo2hidDemo

HID는 TI제공 프로그램을 이용했고 HID로 'a' 'b' 보내면 LED 온 오프하고 'c'보내면 1초뒤에 키 값을 전송하도록 했다.



기본틀은 구성 됬고 필요에 따라 수정만 하면 될것 같다. 

Posted by nexp

댓글을 달아 주세요

[AVR]/Mega82011. 9. 22. 23:30

[Atmega8 EVM] USB HID 테스트

[Atmega8 EVM] USB HID 테스트


USB HID을 이용하면 윈도 표준 입력 인터페이스로 드라이버 필요 없이(정확히는 Windows 내부 표준 드라이버) USB연결 할 수 있다. USB Mouse, Keyboard, Joystick 등이 이 표준을 따르는데 USB를 연결하면 바로 동작하기 때문에 사용자 입장에서 상당히 편리한 인터페이스 이다.

이번에는 AVR AtMega8  (ATMega8-EVM) 의 USB 소프트웨어 스텍을 이용하여 HID Data 테스트를 해 보았다. 스프트웨어 스텍이라 약간 불안하거나 속도에 문제가 있지 않을까 했는데.. 테스트 결과 속도도 나쁘지 않고 저렴고 간단하게 사용할 수 있어서 좋은것 같다.

Atmeg8 EVM을 USB에 연결하면 HID장치로 인식되고 휴먼인터페이스 장치에서 확인 할 수 있다. (드라이버 설정 필요 없이 바로 인식된다.)




AVR USB HID처리
uchar ProcessUSB(uchar *data, uchar len)
{
 unsigned char temp[9];
 unsigned int adc=0;

 switch(data[0])
 {
  case CMD_LED_OFF:
   Led1Off();
   break;

  case CMD_LED_ON:
   Led1On();
   break;
  
  case CMD_EEPROM_READ:
   eeprom_read_block(data, (uchar *)0 + data[1], data[2]); 
   SendUsb((void *)&data, 8);
   break;
   
  case CMD_EEPROM_WRITE:
   eeprom_write_block(data, (uchar *)0 + data[1], data[2]);
   break;   

  case CMD_GET_ADC:
   adc = AdcRead(0);
   //DebugPrint("ADC:%d\r\n", adc);

   temp[0] = adc&0xFF;
   temp[1] = (adc>>8)&0xFF;
   SendUsb((void *)&temp, 8);
   break;
 }  
}


HID제어 Main Source Code
int main(void)
{
 uchar   i;

 //System Init
 SystemInit();
 Led1Init();
 Led1On();
 
 //UART Init
 DebugInit(BAUD_38400);
 DebugPrint("USB HID Test Program\r\n");
 
 //ADC Init
 AdcInit();
    
 //USB Init
    usbInit();
    usbDeviceDisconnect();
   
 i = 0;
    while(--i){             /* fake USB disconnect for > 250 ms */
        wdt_reset();
        _delay_ms(1);
    }
 
    usbDeviceConnect();
    sei();
   
    while(1)
 {  
        wdt_reset();
  //USB 처리
        usbPoll();
    }
    return 0;
}



HID제어 PC Host 프로그램
PC용 프로그램은 C#을 이용하여 작성하였다.
HID제어 부분을 표준 DLL로 제작해 두었기 때문에  VC++, VB, C#에서 쉽게 제어 가능하다.





HID제어 DLL이용하면 아주 간다하게 프로램을 작성할 수 있다.

        private void button2_Click(object sender, EventArgs e)
        {
            bool ret;

            ret = GPortIOHidInit(0, 0);

            if (ret)
            {
                label1.Text = "USB HID Init OK";
            }
            else
            {
                label1.Text = "USB Init ERROR";
            }
        }
  
        private void button3_Click(object sender, EventArgs e)
        {
            int ret;
            ret = OutPort(CMD_LED_ON, 0)
        }

        private void button4_Click(object sender, EventArgs e)
        {
            int ret;
            ret = OutPort(CMD_LED_OFF, 0)
        }

         private void button5_Click(object sender, EventArgs e)
        {
                int ret;
                int adc_val;
                byte[] Buffer = new Byte[8];

                ret = InPort(CMD_ADC_READ+0 ), Byte)

                 adc_val = Buffer[1] | Buffer[2] << 8;
                label1.Text = adc_val.ToString();
       }




AVR HID테스트 동영상
HID를 이용하여 LED를 제어 하고 Mega8의 EEPROM에 데이터를 읽고 쓰며  ADC값을 그래프로 표시하는 테스트 이다. 소프트웨어 스텍임에도 속도가 나쁘지 않다.




Posted by nexp

댓글을 달아 주세요

  1. fjkd

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.10.29 12:43 [ ADDR : EDIT/ DEL : REPLY ]
  2. sinwho

    관리자의 승인을 기다리고 있는 댓글입니다

    2012.08.21 09:37 [ ADDR : EDIT/ DEL : REPLY ]
  3. 서동훈

    관리자의 승인을 기다리고 있는 댓글입니다

    2016.02.02 22:24 [ ADDR : EDIT/ DEL : REPLY ]

[MSP430]/MSP430F5x2011. 8. 11. 12:03

[MSP430F5510 EVM] USB HID 테스트

[MSP430F5510 EVM] USB HID 테스트



MSP430F5510 을 이용하여 HID테스트를 했다. HID를 이용하면 USB디바이스 드라이버 제작할 필요없이 고속의 USB통신을 할수 있다. 간단히 HID인식해서 데이터 송수신 하는 예제를 작성해 보았다.
저렴하고 소형의 MCU임에도 불구하고 USB데이터 처리는 빠르고 쉽게 처리되었고 상용 제품에 적용하기에 좋은것 같다.

HID테스트용 PC프로그램 제작



MSP430F5510 HID USB데이터 송수신 테스트 소스코드

VOID main(VOID)
{
    //시스템 초기화
 SystemInit();
   
 //init USB
 USB_init();

 Led1Init();
 Led1Off();
 
 Led2Init();
 Led2Off(); 
   
    // Enable various USB event handling routines
    USB_setEnabledEvents(kUSB_VbusOnEvent+kUSB_VbusOffEvent+kUSB_receiveCompletedEvent
                          +kUSB_dataReceivedEvent+kUSB_UsbSuspendEvent+kUSB_UsbResumeEvent+kUSB_UsbResetEvent);
   
    // See if we're already attached physically to USB, and if so, connect to it
    // Normally applications don't invoke the event handlers, but this is an exception. 
    if (USB_connectionInfo() & kUSB_vbusPresent)
      USB_handleVbusOnEvent();

    while(1)
    {
        BYTE i;
        // Check the USB state and directly main loop accordingly
        switch(USB_connectionState())
        {
           case ST_USB_DISCONNECTED:
    // Enter LPM3 w/ interrupts enabled
                 __bis_SR_register(LPM3_bits + GIE);              
                _NOP();                                             
                break;
               
           case ST_USB_CONNECTED_NO_ENUM:
                break;
               
           case ST_ENUM_ACTIVE:
    // Enter LPM0 (can't do LPM3 when active)
                __bis_SR_register(LPM0_bits + GIE);              
                _NOP();

     //------------------------------------------------------------------------------
    //USB데이터 송수신
                // Exit LPM on USB receive and perform a receive operation
                if(bHIDDataReceived_event)                             
                {
      // Holds the new addition to the string                 
      char pieceOfString[MAX_STR_LENGTH] = "";          
                 
                  // Add bytes in USB buffer to theCommand
      // Get the next piece of the string
                  hidReceiveDataInBuffer((BYTE*)pieceOfString,MAX_STR_LENGTH,0);                
                  strcat(wholeString,pieceOfString);    
                  // Add it to the whole
                  hidSendDataInBackground((BYTE*)pieceOfString,strlen(pieceOfString),0,0);     
                 
      
     if(wholeString[0] == CMD_LED2_ON)
     {
       Led2On();
     }
     else if(wholeString[0] == CMD_LED2_OFF)
     {
       Led2Off();
     }     
       else if(wholeString[0] == CMD_LED1_ON)
                    {
                      Led1On();
                    }
     else if(wholeString[0] == CMD_LED1_OFF)
                    {
      Led1Off();
                    }
                    else if(wholeString[0] == CMD_READ_DATA)
                    {                     
                      //USB데이터 전송
       hidSendDataInBackground((BYTE*)outBuffer,63),0,0);
                    }
                  bHIDDataReceived_event = FALSE;
                }
                break;
   //----------------------------------------------------------------------------------
   
           case ST_ENUM_SUSPENDED:
                __bis_SR_register(LPM3_bits + GIE);          // Enter LPM3 w/ interrupts
                break;
               
           case ST_ENUM_IN_PROGRESS:
                break;
               
           case ST_NOENUM_SUSPENDED:
                __bis_SR_register(LPM3_bits + GIE);               
                break;               
               
           case ST_ERROR:
                _NOP();
                break;
               
           default:;
        }
   
    }  // while(1)
} //main()



MSP430F5510 HID테스트 동영상

Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 11. 10:30

[CANTUS EVM] USB HID테스트 - USB로 센서 데이터 그래프에 표시

[CANTUS EVM] USB HID테스트 - USB로 센서 데이터 그래프에 표시


CANTUS는 저렴한 MCU임에 불구하고 USB기능이 있어 여러모로 사용할곳이 많은것 같다.
USB를 이용하여 3축 가속도 센서 데이터를 그래프로 표시하는 테스를 해 보았다. 기존 STM32를 이용하여 센서데이터를 USB로 전송하는 예제가 있어 쉽게 포팅할 수 있었다.

HID를 이용하면 드라이버필요 없이 USB에 연결할 수 있어 간단히 USB전송하기 좋다.

ADChip사에서 제공하는 USB API를 이용하면 아주 간단히  USB를 제어 할 수 있다. 깔끔하게 잘 동작한다.
하지만 라이브러이 형태이기 때문에 수정이나 다른 프로젝트에 계속 추가 하기가 쉽지 않아 사용자 처리 부분은 빼내서 처리했다.

그리고 한가지더.. 엔드포인트 수가 적고, 특히 64Byte 엔드포인트는 2개밖에 없다.



USB초기화 부분
 //USB초기화
 //-------------------------------------------
 setinterrupt(INTNUM_USB,usb_irq_f);
 EnableInterrupt(INTNUM_USB,TRUE);
 
 //USB Enable
 Sbi(*R_PAF5, (3<<(2*7)));
    Sbi(*R_P5oDIR, BIT7);
    Sbi(*R_P5oLOW, BIT7);
    Delay(100);
 
 usb_set_description(USB_Configuration_Descriptor,USB_Device_Descriptor,HID_ReportDescriptor,USB_StringDescriptor);
    usb_init();
 //-------------------------------------------



가속도 센서 데이터 수집 및 USB전송 코드
 while(1)
 {
  GetAccelValue(AXIS_X, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[0] = data;
  gUsbTxBuffer[1] = data>>8;
  
  GetAccelValue(AXIS_Y, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[2] = data;
  gUsbTxBuffer[3] = data>>8;
  
  GetAccelValue(AXIS_Z, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[4] = data;
  gUsbTxBuffer[5] = data>>8; 
  
  //USB로 센서 데이터 전송
  SendtoUsb(gUsbTxBuffer, sizeof(gUsbTxBuffer));
  
  Delay(4);
 }


CANTUS USB전송 테스트 동영상
USB HID로 3축 가속도 센서데이터를 전송하고 그래프로 표시하는 예제

Posted by nexp

댓글을 달아 주세요

  1. 파파존스

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.04.19 18:35 [ ADDR : EDIT/ DEL : REPLY ]