USB HID로서의 Arduino


25

Arduino UNO를 사용하여 키보드와 같은 HID 장치를 만들 수 있습니까?

현재 Arduino의 버튼 입력이 직렬 라인에 출력됩니다. 그렇다면 현재 펌웨어를 HID 키보드처럼 작동 할 수있는 것으로 어떻게 변환 할 수 있습니까?

  • 새 윈도우 장치 드라이버를 작성해야합니까?
  • 직렬 데이터를 가져 와서 창에서 HID 입력으로 읽을 수있는 소프트웨어 계층을 만들어야합니까?
  • 가능하다면 이것을 달성하는 더 좋은 방법이 있습니까?

1
내가 틀렸을 수도 있지만 이것은 실제로 Arduino에 관한 것이 아닙니다. 그것은 윈도우의 사이드 디바이스 드라이버 개발에 관한 것입니다.
asheeshr

1
구글의 첫 번째 답변 : mitchtech.net/arduino-usb-hid-keyboard ... 그러나 어떤 Arduino를 지정하지 않았습니다. Leonardo에는 내장되어 있으며 적절한 드라이버가 이미 존재합니다 ( arduino.cc/en/Reference/MouseKeyboard 참조 ).
FredP

Uno를 사용하고 있지만 마지막으로 DFU 업데이트를 고려했기 때문에 게시 한 내용을 살펴볼 것입니다.하지만 대부분의 지역에서와 같이 구성 요소를 쉽게 사용할 수 있고 저렴하지 않기 때문에 벽돌 제품이 두렵습니다. 장소.
Anomaly

3
@AsheeshR이 문제는 현재 메타에 있습니다 : meta.arduino.stackexchange.com/q/102/46
Ricardo

1
Arduino Uno는 Atmega16u2를 USB 드라이버 칩으로 제공하므로 사용자는 DFU 또는 ICSP 플래싱을 사용하여 장치에 레오나르도 근처의 펌웨어를 푸시하여 Arduino를 HID 키보드로 작동시킬 수 있습니다. Windows 개발이 필요하지 않으며 기본적으로 USB / HID 장치가 인식되므로 빌드 할 드라이버가 없습니다. 즉, 그 질문은 다시 열어야합니다.
zmo

답변:


14

Arduino UNO를 사용하여 키보드와 같은 HID 장치를 만들 수 있습니까?

네! 그리고 여기에 그것을하는 방법에 대한 훌륭한 튜토리얼이 있습니다.

현재 Arduino의 버튼 입력이 직렬 라인에 출력됩니다. 그렇다면 현재 펌웨어를 HID 키보드처럼 작동 할 수있는 것으로 어떻게 변환 할 수 있습니까?

튜토리얼에서 알 수 있듯이 이벤트를 인쇄하는 대신 펌웨어 코드를 변환해야 실제로 이벤트가 트리거됩니다. 당신이해야 할 일은 코드에 추가하는 것입니다.

void triggerKey(uint8_t mod, uint8_t chr) {
    uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    // press key
    Serial.write(buf, 8);
    // emulate key press delay
    delay(10);
    buf[1] = 0x00;
    // release key
    Serial.write(buf, 8);
}

여기서하는 일은 직렬 회선을 통해 메인 Arduino 마이크로 컨트롤러 이벤트에서 USB 통신을 처리하는 더 작은 마이크로 컨트롤러로 전송하는 것입니다. 해당 마이크로 컨트롤러는 이러한 키 "버퍼"를 가져와 USB HID 키보드 키를 USB로 누를 때 전송합니다.

키 문자 ( chr여기 코드에서)는 실제로 USB를 통해 전송 된 키 코드이며 USB HID 드라이버가 해석 한 다음 키보드에 대해 설정 한 현재 레이아웃을 사용하여 실제 문자로 변환합니다.

mod문자, 키보드 (교대, 제어, 고도 ...)에있는 수정 키 중 하나입니다 0x00아무 수정되는 없습니다.

  • 새 윈도우 장치 드라이버를 작성해야합니까?

아니요, 필요 없습니다! DFU 업그레이드를 사용하면 arduino가 Windows에서 USB 키보드로 표시됩니다.

  • 직렬 데이터를 가져 와서 창에서 HID 입력으로 읽을 수있는 소프트웨어 계층을 만들어야합니까?

그렇게 할 필요는 없으며 여러 가지 이유로 실제로 매우 나쁜 생각입니다.

  • 솔루션은 이식성이 없으므로 사용할 수있는 모든 플랫폼마다 무언가를 해킹해야합니다.
  • 귀하의 솔루션은 많은 새로운 코드를 암시합니다. 더 많은 코드를 작성하면 시스템에 더 많은 버그가있을 수 있습니다.
  • 솔루션은 사용자 프로그램 (예 : user land ) 에서 입력을받는 장치 드라이버 (예 : 커널 랜드 ) 처럼 작동하며 작동 하지 않으며 디버그하기가 어려우며 보안 문제가 발생하기 쉽습니다. .. 가능하다면!

Uno를 사용하고 있지만 지난번에 DFU 업데이트를 고려했기 때문에 게시 한 내용을 살펴볼 것입니다.

마지막으로, 아두 이노를 브릭 킹하는 것에 대한 의견이 있습니다. 저와 기사 의 저자가 펌웨어 플래시를 수행하는 arduino를 벽돌로 만들 수 없다고 생각 하십시오.

참고 :이 방법을 사용하여 장치를 '브레이킹'할 가능성은 없습니다. Arduino 부트 로더 펌웨어는 항상 DFU 프로토콜을 사용하여 업데이트 할 수 있습니다!

무언가가 심하게 잘못되어 작은 AVR (atmega8u2)에서 부트 로더 손상이 발생하더라도 다른 arduino 또는 atmel 프로그래머를 사용하여 USB 플러그 옆에있는 6 핀을 사용 하여 다시 부팅 할 수 있습니다 .

결국 Arduino와 마찬가지로 AVR을 브릭 킹 하는 유일한 방법은 퓨즈를 사용하여 프로그래밍 퓨즈를 재설정하는 것입니다. 그럼에도 불구하고 HVSP 를 사용하여 장치를 절약 할 수 있지만 새로운 칩을 가져 오는 데 어려움이없는 경우가 많습니다.


1
모든 유용한 정보에 감사드립니다.
Anomaly

AVR을 브릭 킹하는 올바른 방법은 과전류 / 과전압입니다. 그럼 토스트 될 것입니다 ...
user2973

그러나 벽돌이라고 불리는 것이 아니라 튀김 또는 토스트라고합니다. MCU를 통해 15amp를 입력하면 방을 뛰어 넘을 것입니다. ;-)
zmo

특정 키를 해제하는 방법? 키 HOLD를 에뮬레이트하고 릴리스하고 싶습니다. 또한 링크에서 문자는 배열 [2]로 이동하고 여기서 [1]로 이동합니다. 왜?
5argon

내 예에서 볼 수 있듯이 먼저 두 단계를 수행합니다. 먼저 키를 누른 다음 지연이 발생하면 놓습니다. 그렇다면 하드웨어 키보드 구현의 작동 방식에 대해 스스로 강의해야합니다. 자연스럽지 않고 배열의 각 값에 의미가 있습니다. atm을 공유 할 수있는 링크가 없어서 용서해주십시오.하지만 웹을 검색 할 때마다 새로운 코멘트를 게시하십시오. ☺
zmo

6

Arduino Bootloader를 완전히 대체하는 프로젝트를 만들었습니다. 스케치를 업로드하여 HID로 사용할 수 있습니다. Github의 Project HID를 참조하십시오 : https://github.com/NicoHood/HID


4
Arduino SE에 오신 것을 환영합니다! 라이브러리 사용 방법에 대해 조금 추가 할 수 있습니까? 감사!
익명 펭귄

2
읽어보기를 읽고 예제를 사용해보십시오. 모든 것이 여기에 모든 것을 속일 필요는 없습니다. Github의 모든 것은 최신입니다 :)

죄송합니다. 멋진 라이브러리처럼 보이지만 문서가 미흡합니다. 내가 알 수있는 한 실제 설치 지침은 없으며 위키의 전체 주제는 "TODO"라고 말합니다 (특히 게임 패드 주제는 완전히 비어 있습니다). :-/
BrainSlugs83

1
실제로 여기에 기본 설명을 제시 할 필요가 있습니다. 외부 링크가 없어도 대답은 의미가 있어야합니다. 그리고 이것은 아닙니다.
Chris Stratton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.