분명 고3일 때 하라는 공부는 안 하고 블로그에 글을 쓰고 있었는데, 정신차려보니 어느덧 군 복무도 끝나가고 있습니다.
    새로운 마음으로 공부하고 작업한 내용을 기록하고자 새 Jekyll 블로그를 만들었습니다.

    댓글을 쓰셔도 보기가 어려우니, 불편하시더라도 궁금한 점은 옮긴 새 블로그에 댓글로 달아 주시면 성심성의껏 답변해 드리겠습니다. 감사합니다.
    2021년 2월 14일

    새 블로그 주소는 https://luftaquila.io입니다.
     

    LUFT - AQUILA

    A sky sailing Electron.

    luftaquila.io




    블로그를 이전하면서 글도 같이 옮기고 있습니다.

    블로그 이전 공지 : https://luftaquila.tistory.com/56

     

    이 글은

    https://luftaquila.io/blog/diy/arduino-hid-control-1/

     

    아두이노로 마우스 & 키보드 입력 제어 (1)

    HID 장치가 뭐길래

    luftaquila.io

    로 이동되었습니다!


    댓글을 쓰셔도 보기가 어려우니, 불편하시더라도 궁금한 점은 옮긴 새 블로그에 댓글로 달아 주시면 성심성의껏 답변해 드리겠습니다.

     

     

    원래 글을 보려면 더 보기를 누르세요

    더보기

    비행 시뮬레이션 게임 중에 HAWX라는 친구가 있는데, 이걸 하다가 갑자기 조이스틱으로 조종을 좀 해 보고 싶어졌습니다.

    하지만 쌩 그지인 저에게 이런 거창한 조이스틱은 사치에 불과하죠(...)

     

     

    그리고 모름지기 메이커라면 뭐든 직접 만들어 봐야 하는 것 아니겠습니까?! 아두이노로 만들어 보겠습니다!

    초저가 저예산 아두이노 조이스틱 만들기 프로젝트 본격 개시!

    이때까지만 해도 이 프로젝트로 개삽질을 하게 될 줄 몰랐습니다. 멀고도 먼 삽질의 길

     

    필요한 부품

    아두이노 보드 1개, 조이스틱 모듈 1개

    아두이노 조이스틱 모듈입니다. 보통 800원 정도에 팝니다.

    이게 참 골때려요. 상품은 800원인데 배송비가 2,500원이란 말이죠. 집근처에 오프라인 매장 좀 있었으면...

    아무튼 저는 학교 친구 꼬셔서 먹을거 물려주고 천원에 샀습니다. 이득!

     

    만약 이 글을 보고 계시는 독자님께서 아두이노 레오나르도 보드를 가지고 계신다면, 축하드립니다.

    이 프로젝트를 완성시키는 데 필요한 삽질의 9할을 생략하셔도 됩니다. 완전 복받으신 거에요.

     

    만약 가지고 계신 보드가 우노, 메가 등등 그냥 흔한 보드라면, 환영합니다.

    멀고도 험난한 삽질의 길을 이제부터 저와 함께 걸어 보도록 하겠습니다! 야 신난다!

     

    ------------------------------------------------------------------------------------

     

    ※글이 너무 길어져 3편으로 쪼갰습니다.

     

    1편, 이 글은 HID 장치가 무엇이고 왜 우노에서는 HID로 인식이 안 되는지,

    아두이노 MCU의 구성과 HID로 인식시키기 위한 HoodLoader의 작동방식으로 구성되어 있습니다.

    2편에서는 앞서 설명한 HID 장치로 인식시키기 위한 HoodLoader 부트로더를 굽는 방법의 설명을 드릴 겁니다.

    3편은 이 포스팅의 본 목적인 HID 장치로 인식시켜 조이스틱을 구현하는 제작기입니다.

     

    각 편 링크 :

    아두이노로 마우스 / 키보드 입력 제어 (1) - HID 장치로 만들기

    아두이노로 마우스 / 키보드 입력 제어 (2) - HoodLoader2

    아두이노로 마우스 / 키보드 입력 제어 (3) - 조이스틱 제작

     

    -------------------------------------------------------------------------------------

     

    이 극렬한 차이는 축복받은 레오나르도 보드가 HID 디바이스를 그냥 기본적으로 지원하기 때문에 일어납니다.

    컴퓨터의 키보드나 마우스 등 입력장치를 제어하려면 Human Interface Device, HID라는 인터페이스가 필요합니다.

     

    보통 사용하시는 유/무선 마우스, 키보드 등이 전부 다 이 HID 인터페이스를 사용합니다.

    윈도우키 + R 눌러서 실행 창 띄우신 다음에 devmgmt.msc 입력하셔서 장치관리자를 실행시켜 보세요.

    마우스 및 기타 포인팅 장치 탭을 확장시키면 아마 HID 규격 마우스 같은 이름으로 나오는 장치가 하나쯤은 있으실 겁니다.

     

     

    이걸 레오나르도 보드는 그냥 기본으로 지원합니다.

    Mouse.h나 Keyboard.h 인클루드하고 USB로 컴퓨터에 꽂으면 바로 HID 장치로 잡혀요. 하지만 나머지 보드는 그딴 거 없습니다.

     

    가지고 계신 보드가 레오나르도가 아니시라면, 아두이노 스케치에서 파일 - 예제 - 09.USB 탭의 예제를 아무거나 컴파일해 보세요.

    부우우우운명히 Mouse.h, Keyboard.h 라이브러리가 설치되어 있는데! #include로 포함시켜 놨는데!

     

    'Mouse' 가 없습니다. 스케치에서 '#include < Mouse.h>' 를 포함했나요?

    'Keyboard' 가 없습니다. 스케치에서 '#include < Keyboard.h>' 를 포함했나요?

     

    라는 미친 에러 메시지를 뿜어냅니다. 진짜 와 저 여기서 거품물고 쓰러지는 줄 알았습니다.

    이게 왜 안 되는지, 보드들이 HID 장치를 지원을 안 하기 때문이라는 걸 깨닫는 데까지 3시간이 걸렸습니다.

     

    똑같은 예제를 툴 - 보드 설정에서 레오나르도로 잡고 하면 컴파일이 잘 됩니다. 딴 보드만 안 됩니다.

    이게 다 빌어먹을 딴 보드들이 HID 디바이스를 지원하지 않기 때문입니다.

     

    -------------------------------------------------------------------------------------------

     

    후우... 심호흡을 좀 하고, 좀 쉬었다가광고를 보셨다가 다른 아두이노 보드들도 HID로 인식되게 하는 법을 설명드리겠습니다.

    이 부분이 좀 복잡합니다. 그냥 센서들만 가지고 행복하게 코딩하던 때와 다르게 부트로더를 건들어야 하거든요.

     

    아두이노 MCU들에 대한 근본적인 이해가 좀 필요합니다.

    명백하게 삽질이지만, 부트로더 등을 잘 모르시던 분께서 성공시키시면 아두이노 보드에 대한 이해도가 훌쩍 올라갈 거에요.

    역시 사람은 삽질하면서 성장하는 것 같습니다. <퍽

     

    개삽질한 불쌍한 필자가 학교 앞 문구점에서 100원짜리 불량식품이라도 사먹을 수 있게 광고 한 번만 클릭해 주세요! ㅠㅠ

    한국어로 제대로 설명하는 블로그가 없어서 영문으로 뒤져서 가장 쉬운 방법 알아내느라 힘들었습니다 흑흑

     

     

     

    아무튼 각설하고, 아두이노 보드들에는 두 개의 MCU가 들어갑니다.

     

     

    우노 보드를 보면 ATmega328과 16u2가 들어가 있습니다.

    넓적하게 다시마같이 생겨먹은 것이 328이고 USB포트 쪽의 작은 것이 16u2입니다.

     

    이건 우노의 핀맵인데요, 보시면 두 MCU들의 역할 차이를 보실 수 있습니다.

    핀마다 라벨이 덕지덕지 붙어있는 보드 가장자리 핀들은 전부 328이 관할하는 핀입니다.

    사진 왼쪽에 연갈색으로 박스쳐진, ATMEGA 8U2/16U2 ICSP라고 적힌 곳에 있는 핀만 16u2가 다루는 핀이에요.

     

    흔히 아두이노를 할 때 사용하는 기능들, 디지털/아날로그 핀으로 데이터 값 읽어오고 출력 보내고 하는건 전부 328이 담당합니다.

    16u2는 USB to Serial 기능을 합니다. 컴퓨터와 데이터 주고받기 담당이라고 보시면 되겠습니다.

     

    보드에 스케치를 업로드하면 그 스케치가 가는 곳은 328이고, 16u2는 사용자가 코딩하는 것이 불가능하게 되어 있습니다.

    앞으로는 편의상 328은 I/O MCU, 16U2는 USB MCU라고 부르겠습니다.

     

     

    하지만 이 상태로는 우리의 목적인 HID 장치 인식이 불가능합니다.

    레오나르도의 MCU인 ATmega32u2는 328과 16u2를 합쳐놓았다고 봐도 무방합니다. 혼자 USB 통신하고 IO핀 다루고 다 합니다.

    그래서 바로 기본 탑재 Mouse.h 등등을 사용할 수 있는 것이죠.

     

    하지만 우노의 IO MCU인 328은 순수 IO MCU이기에 USB to Serial 기능이 없어 HID장치로 사용이 안 되는 겁니다.

    16u2는 HID로 인식이 가능하지만 프로그래밍이 불가능할 뿐더러 IO핀도 없고요.

     

     

    이걸 HID로 인식시키는 방법으로 dfu-programmer를 이용한 펌웨어 바꿔치기가 있습니다.

    하지만 이건 여기서 설명 안 할 겁니다. 무지하게 불편하거든요.

     

    스케치로 코딩한 다음 보드에 업로드하고, 아두이노 기본 펌웨어 지운 다음에 HID로 인식시켜주는 펌웨어 깔고 리셋하면 됩니다.

    근데 이 상태에서는 스케치 업로드가 안 돼요. 보통 아두이노 하면 뭐 조금 바꾸고 업로드하는게 일상인데, 여기선 그게 안 된단 얘깁니다.

     

    코딩한 다음에 업로드하고, 기본 펌웨어 지우고 HID 펌웨어 깔고 리셋하고, 테스트해보니 안 돌아가서 HID펌웨어 지우고 기본 펌웨어 깔고 리셋하고, 다시 스케치 수정해서 업로드하고 기본 펌웨어 지우고 HID 펌웨어 깔고 리셋하고.......

     

    -----------------------------------------------------------------------------------------

     

    비효율적이기 짝이 없습니다. 그래서 우리는 HoodLoader2라는 부트로더를 이용할 겁니다.

     

    HoodLoader는 기본 아두이노 부트로더를 CDC 부트로더와 고속 USB-Serial 브릿지로 바꿔치기해 줍니다.

    CDC 부트로더가 바로 USB MCU인 8/16/32u2 등에 프로그래밍이 가능하도록 만들어 주는 놈입니다.

    동시에 USB-Serial 브릿지는 328같은 I/O MCU에 프로그래밍이 가능하게 만들어 주고요.

     

    결과적으로 프로그래밍 가능한 MCU를 두 개로 만들어 주는 셈입니다.

    HID 프로젝트와 연동되어 거의 모든 보드들에서 우리의 목적인 HID장치 인식도 가능하게 해 줍니다.

    HoodLoader2의 동작 개념도입니다. 16u2를 코딩 가능하게 만들고 328과 하드웨어 시리얼로 연결합니다.

    즉, 328에서 Serial.print 등으로 시리얼 통신을 쏴 주면 16u2에서 Serial1.read() 등으로 받을 수 있습니다.

     

    그 외에 뭐 57600 보드 레이트로는 통신이 불가능하다거나 하는 세부적인 내용이 더 있긴 합니다만, 여기선 적지 않겠습니다.

    필요하신 분께서는 공식 위키 https://github.com/NicoHood/HoodLoader2/wiki에서 확인하시면 됩니다.

     

    한 가지 명심하실 점은 USB MCU, 즉 16u2에선 I/O 핀, 특히 아날로그 핀을 못 쓴다는 점입니다.

    모든 I/O 입출력은 328을 통해 이루어져야 하고 16u2는 그걸 컴퓨터에 보냈다 받았다 하는 중간 연결자 역할만 합니다.

     

    --------------------------------------------------------------------------

     

    다음 편 보기 : 아두이노로 마우스 / 키보드 입력 제어 (2) - HoodLoader2

     

    모든 편 링크 :

    아두이노로 마우스 / 키보드 입력 제어 (1) - HID 장치로 만들기

    아두이노로 마우스 / 키보드 입력 제어 (2) - HoodLoader2

    아두이노로 마우스 / 키보드 입력 제어 (3) - 조이스틱 제작

     

     

    Posted by LUFT - AQUILA
    • 이레
      2018.06.08 15:19

      짝퉁(호환) 아두이노 나노 칩을들 봐도 16u2칩은 안보이네요. 혹시 나노or짝퉁은 하지못하는걸까요?

      • BlogIcon LUFT - AQUILA
        2018.06.08 15:50 신고

        아마 나노랑 우노 호환보드들은 거의 다 CH340 칩셋을 사용할텐데, 저도 이 칩 사용하는 보드들에는 시도해본 적이 없어서 잘 모르겠습니다. CH340 드라이버 깔려 있으면 16u2랑 똑같이 세팅하고 해도 될 것도 같기는 한데 확답은 못 드려요... ㅋㅋㅋ

    • 이레
      2018.06.23 23:07

      답변 감사합니다. 어딜 공부해야될지는 덕분에 알것같습니다. 고마워요


    • 2018.08.26 14:05

      안녕하세요. 궁금한게 있어서요.. 위에서 아두이노 하나가지고 키보드 관련 코딩을 하면 헤더파일을 포함했냐고 오류가 나는데요. 그렇다면 펌웨어를 변경하는 사람들은 어찌 먼저 스케치로 컴파일해서 올리고 펌웨어를 변경해서 키보드 입력을 먹이게 되는걸 하는건가요?
      스케치 로 업로드 하는건 펌웨어 변경하면 못올린다고 하셨자나요. 이부분은 좀 이해가 안가서욤.

    • 정해욱
      2018.12.02 13:02

      이 블로그정말 재밋네요. 구글링 한시간하다가 우연히 한국어로 검색해보니 여기에오게됫습니다. 우노여서 HID 인식이안되는거엿군요...진짜 개고생햇ㄴ네여 ㅠㅠ 엘리트데인져러스나 스타시티즌처럼 인기많은 비행겜들은 양덕아재들이 만든 커스텀 조이스틱이나 아두이노 모드가 엄청나게많습니다. 전 어려워서 이해못하겟구..조이스틱이 하나잇는데 두개로쓰면 진짜재밋거든요. 우주에서는 3축(yaw pitch roll)에 상하좌우 움직임이추가된 6dof기동이필요한데, 일반 비행겜은 스틱하나로되지만 전 두개가 필요해요. 여튼 정말 글 너무 유용하게잘읽엇습니다. 행복한하루되세요.

    • BlogIcon Quadrangled
      2020.03.10 19:29

      CH340는 HID를 지원하는 마이크로컨트롤러가 아니라 USB to TTL 역활만 하는 전용 칩셋이기 때문에 CH340 아두이노은 저 방법이 안 먹힙니다...

    • yswysw
      2020.12.18 16:11

      만약에 호환보드여도 16u2 MCU와 ATMEGA MCU가 있으면 이 방법이 가능한 것인가요?