/TheFirstKeyboard

USB Keyboard -- Learn by Doing

Primary LanguageC

프로젝트 목표

키보드의 펌웨어를 개발한다.

의도

첫번째 생각

USB에 대해 공부해보고 이를 사용하여 게임용 조이스틱을 만든다.

USB를 사용해보는 도중

USB로 무언가를 개발하였다면 사용하는 환경에 맞는 디바이스 드라이버도 작성해야한다. 이를 우회하고자 USB HID로 범위를 축소하였다.

USB HID에서도 동일한 문제

USB HID로 바뀌더라도 대부분 키보드와 마우스, 게임패드 정도만 기본 드라이버로 작동할 수 있다. 그래서 조이스틱에서 키보드로 방향을 바꿨다.

개발 간에 발생한 문제

USB 관련 자료

USB에 대해 쉽게 알려주는 자료가 없었다. 주로 텍스트보다는 동영상 자료들이 정보가 더 좋아서 보는데 더 오래 걸렸다. 또, 주로 MCU 벤더에서 제작한 영상이라 특정 제품에 대한 내용도 있어서 더 복잡했던 것 같다. MCU 벤더가 아닌 일반 개발자들이 만든 동영상들에는 개략적인 부분은 이해하기 쉽고 좋았으나 USB 개발을 시작하기에 충분한 동영상은 없었다. 돌고 돌아 USB 공식 2.0 스펙 자료를 참고했고 그게 가장 도움이 됐다.

MCU와 USB

USB에 대해서도 명확히 이해하지 못한 부분이 많은데 이를 MCU에서 어떻게 명령을 줘야 하는지도 이해하기 힘들어서 초기 개발이 힘들었다. 오픈소스에 나온 구현들을 보아도 다들 제각각인 느낌이었다. 주로 3개의 프로젝트를 참고했는데 하나는 C로 구현한 키보드 펌웨어, 다른 하나는 어셈블리어로 구현한 USB 부트로더, 마지막으로 범용 USB 미들웨어인 LUFA이다. 애매한 부분은 LUFA 코드를 읽고 동작을 참고해서 구현했다.

USB 구현 이해도

USB 자제로도 방대하다고 생각했는데 USB와 얽혀있는 펌웨어, 디바이스 드라이버, MCU의 구현 등이 겹치면서 방향을 잃은 경우가 많았다. 아직도 USB에 대한 이해도가 높다고 생각하지 않는다.

디바이스 드라이버 vs PCB 아트워크

디바이스 드라이버는 해당 OS에서 어떻게 드라이버를 작동하는지에 대한 지식을 배워야하는 데 너무 오래 걸릴 것 같았다. 그에 비해서 키보드 PCB는 단순한 스위치들을 엮고 MCU 개발보드를 바로 연결하는 방법으로 간단하게 만들 수 있었기 때문에 USB 키보드 PCB를 제작하기로 했다.

실수

PCB를 설계하는 도중에 참고하던 자료들에서 풀업, 풀다운에 대한 언급이 없어 해당 사항을 고려하지 않았는데 발주 후에 생각해보니 당연해서 언급하지 않은 것 같다. 참고했던 자료의 PCB를 자세히 보니 모두 풀업, 풀다운이 돼있었다. 나중에 PCB 위에 풀다운 저항을 납땜하여 입력핀이 떠 있는 경우를 없앴다.

자료 영상

Schematic Image v0.2.0
Schematic Image
PCB Image v0.2.0
PCB Top Image
PCB Bottom Image
Keyboard Picture v0.1.0
Keyboard Picture