제가 일하는 곳은 건물 자체가 100년쯤 된 아주 오래된 곳입니다.
전자공학 관련인데, 랩 공간 자체가 아주 넓고, 수많은 테이블이며 캐비넷 등이 도처에 널려있어요.
4-5년마다 대청소를 하는데, 아직도 1930년대 카메라, 1980년대 계산기 뭐 이런게 사방천지에서 나옵니다.
전 기계식 키보드가 뭔지 알고는 있었지만 전혀 관심도 없던 그런 부류였는데
우연찮게 대리석 질감이 나는 케이스를 가진 실리콘그래픽스의 빈티지 키보드를 하나 줍게 됐습니다.
써보니까 이 택타일한 느낌과 소리가 너무 맘에 들더라구요. 알프스의 크림 댐프 스위치였습니다.
딴 스위치들은 어떤 느낌인가 싶어서 알아보다보니 전반적으로 기계식 키보드에 관심이 생겼고
실험을 빙자해서 온갖 종류의 기계식 스위치를 주문해서 어떤 회사의 어떤 스위치가 어떤 느낌인지도 알아봤습니다.
안타까운건 이 실리콘그래픽스 키보드가 너무 오래된 놈이다 보니까 윈도우 키도 없고 NKRO도 아니어서 실사용에 아주 불편했습니다.
키가 아홉개 열개씩 동시에 눌리면 제 일 특성상 아주 편하거든요.
그래서 이걸 개조를 해볼까 하고 고민을 해봤는데 알프스 스위치 디솔더링 하는게 너무 귀찮았고
윈도우키용 여분 스위치랑 키캡을 어디서 구해야할지도 모르겠고,
스위치 지지용 메탈 플레이트도 깔끔하게 새로 만들지 못할 것 같아서 그냥 포기하고 살았습니다.

어느덧 반년쯤 지났을까.. 신입이 한명 들어왔는데 앱등이예요. 근데 아주 빈티지 키보드를 쓰고 있었습니다.
애플 extended keyboard ii 를 쓰더라구요. 눌러보니 제 실리콘그래픽스 그래나이트랑 아주 비슷한 느낌이었습니다.
찾아보니까 이것도 알프스 크림 댐프/화이트 댐프를 쓰더군요. 기분이 아주 좋아졌습니다.
왜냐면 AEKii 는 ctrl/alt 만 있는게 아니라 gui용 스위치도 옆에 같이 붙어있더라구요. 맥에서 command 키.
됐다. 이 키보드만 구하면 되겠구나 싶어서 이베이에서 20불 주고 하나 샀습니다.
노동절 겹치고 배송사고가 생기고 등등 우여곡절 끝 한달만에 AEKii 를 손에 넣었습니다.
근데 막상 받고 나니 이게 ADB 라는 protocol을 사용하지 뭡니까.. 
그래서 신입 앱등이한테 물어봤더니 자기는 iMate라는걸 사서 쓴답니다. USB로 변환시켜주는 converter입니다. 
한 30불 정도 하더군요. 뭐 그 정도는 괜찮죠. 그래도 사기 전에 마지막으로 간절히 바라며 iMate를 빌려서 NKRO를 테스트 해봤는데
역시나 이것도 NKRO가 아니었습니다. 검색이나 미리 좀 해볼걸. 게다가 왼쪽 오른쪽에 있는 Gui키 (command) 가
hardware 상에서 같은 trace를 씁니다. 따라서 근본적으로 왼쪽 오른쪽 Gui 식별이 불가능했습니다.
그래도 Key cap과 switch가 이미 거기 있다는게 어딥니까.. 기계공작 필요없이 머리만 쓰면 되는 작업들이니까요.

그래서 AEKii USB NKRO project를 시작했습니다. 목표는 간단합니다. AEKii를 USB용 NKRO로 만들면 끝.
재미로 시작한거라서 바닥부터 끝까지 아무 도움없이 완성하는게 목표였구요, 제가 하는 일이 이쪽인 관계로 어려움은 없었습니다.
근데 제 AEK ii랑 신입의 AEKii가 같은 알프스 크림댐프 인데 신입 키보드가 훨씬 찰진 느낌이 강했고 소리도 훨씬 좋더라구요.
뭐가 차이점일까 열심히 뜯어서 비교해봤는데 leaf switch의 tab들이 얼마나 휘어져있나에 따라 느낌이 아주 천차만별로 달라지더군요.
제꺼가 완전 새것에 가까운 스위치였고 신입건 10년쯤 쓰던 키보드라서 스위치 탭들이 조금씩 안쪽으로 휘어있었습니다.
헌것 같은 상태 덕분에(?) 눌릴때마다 leaf spring이 아주 약한 metallic 소리를 냈던건데
제귀엔 그게 훨씬 소리도 좋았고 느낌도 좋았습니다. 여튼 그래서 일단 키를 하나씩 다 열어서 스프링부터 튜닝했습니다.
탭들을 아주 약간씩 안쪽으로 굽혔습니다. 그러고 나서 눌러봤더니 아주 만족스러웠습니다.
그러고나서, 드디어 제대로 된 프로젝트 시작.

이거 시작하기 전까지 키보드의 electrical connection에 대해서 아예 몰랐습니다.
AEKii PCB를 보고 나서야 이게 Matrix로 구성되어있고 왜 Ghosting이 생기고 등을 이해했습니다.
Matrix를 유지할것인가? 를 꽤 고민했습니다. PCB도 왠만하면 손 안대고 너덜너덜 손으로 전선납땜 하려던 차였기 때문에
Diode를 키마다 덜렁덜렁 허공에 달아놓기는 심적 배리어가 컸습니다. 물리적으로도, 전기적으로도 아주 불안정하지 않겠습니까.
다음으로 생각났던게 LCD Display용으로 나오는 Microcontroller들이었는데
얘네들은 Port가 80개씩 있습니다. 두개만 쓰면 진짜 Full-blown NKRO를 만들 수 있다는 장점이 있고,
첫번째 방법에 들어가는 다이오드값이나 두번째 방법에 추가되는 MCU 1개값이나 거의 비스무리해서 그냥 두번째로 마음을 정했습니다.
결국 이렇게 정하고 났더니, AEKii 오리지날 PCB 위에 존재하는 모든 IC들은 전부 쓰지 않게 됐습니다. 
케이스/메탈지지대/키캡/스위치만 쓰게 됐네요. 속 창자가 다 바뀌는것이죠. PCB는 디솔더링이 귀찮아서 안뜯고 놔두기로 정했습니다.
하지만 모든 Key들이 전부 Isolate되어야 하기 때문에 PCB Trace들도 전부 칼로 끊어서 각각 키가 독립적이 되게 만들었습니다.
GND line을 공유할 수 있을 경우에만 Key들 사이의 PCB Trace를 남겨놓았구요.
앞에 언급했다시피 AEKii 는 왼쪽 오른쪽 GUI가 전기적으로 붙어있습니다만
이제 모든 Key가 isolate 되었기 때문에 이 문제도 해결됐습니다. 이제 오른쪽 GUI키를 다른 key로 mapping해서 쓰고있어요.
특이하게도 AEKii의 Capslock은 latching switch를 쓰더라구요. 독특한 구조였는데 굳이 MCU code exception을 만들고 싶지 않아서
ADB key의 보통 cream/white damped switch와 바꿔꼈습니다. ADB key는 지금 latching 되는 switch라서
다다다다다다 눌러야 되는 키를 연결해놨습니다. 와우 접속유지할때 동전 안꼽아도 되겠네요...

MCU는 Microchip의 PIC18F97J94 를 썼습니다. Full-speed USB도 지원하고, Port가 80개가 넘습니다.
심지어 60개가 넘는 Port에 대해 Internal Pull-up 까지 지원해줍니다. 이거 Diode고 Resistor고 추가할 필요도 없이 꿩먹고 알먹깁니다.
하지만 필요한 키는 100개가 넘기 때문에 MCU 2개가 필요했구요. MCU 2개는 SPI로 붙였습니다. 하난 Master, 하난 Slave.
DMA도 지원해서 Slave쪽은 정말 코드가 20줄도 안되는 것 같네요.
Master쪽은 USB HID Descriptor 어떻게 만드는지 살펴보느라 시간이 좀 걸렸네요.
하지만 이것 역시 Descriptor look-up에 시간이 많이 들 뿐, 특별히 고난이도의 코딩이 필요하고 그런건 아니었습니다. "스펙을 잘 읽자!"
MCU의 max internal clock도 64MHz로 꽤나 빠른편입니다.
USB Host의 Enumeration 제한때문에 polling이 0.1ms 정도에서 제한이 걸리긴 하는데
시중에 파는 1ms 키보드들을 생각해봤을때 아주 괜찮은 듯 싶습니다.
내친김에 Key input latency를 완전 최소화시키고 싶어서 Debouncing도 새롭게 만들어봤습니다.
일반적인 switch debouncing은 보통 Stable input 될때까지 몇단 정도 버퍼를 두고 이게 안정화되면 컴퓨터로 전송합니다.
따라서 버퍼들이 같은 값을 가지게 될 때까지 몇ms 에서 몇십ms는 키가 눌렸지만 아직 대기타고 있는 상태고
이게 Latency로 보이게 됩니다. 뭐 몇십ms 정도는 별 상관없는것 아닐까 싶기도 하지만 게임할때는 중요하기도 하니까요.
이 키보드에 새로 넣은 Debouncing 방법은 첫번째 transition edge이 detect되는 순간 컴퓨터로 Key값을 전송하고
그 해당 키만 transition lock을 일정시간동안 거는 방식으로 해놨습니다. 한 15ms 정도 lock 시키니까 깔끔하게 끝났습니다.
두번째 연타가 15ms 안에 들어올 일은 인간인 이상 없을테니 첫번째 input만 latency가 없으면 될거라 생각했습니다.
물론 이건 알프스 스위치, 그것도 제가 가진 크림댐프에 기반한 값이니 체리나 기타 다른 스위치는 다시 저 값을 실험해봐야겠죠.

가장 고역이었던 작업은 PCB Trace를 칼로 하나하나 파서 key를 isolate하는 작업이었습니다. 허나 반대로 대롱대롱 다이오드와 저항을
키마다 달아야하는 다른 케이스보다는 훨 쉽고(!), 가장 중요한게 실수할 여지가 거의 없기 때문에 작동보장(!)이 제대로 되는 방법이었습니다.
또 한가지의 고역은 100개가 넘는 키 하나하나에 전선을 달아서 MCU에 달아주는 것.
너무 반복작업을 싫어하는 관계로 하루에 키 10개정도씩 했습니다. 아오...
전선은 AWG30짜리 가는걸 썼는데, 그래도 선 100개가 뭉치니 꽤나 부피가 커집니다.
여기저기 구석구석 잘 펴서 원래 케이싱에 들어가게끔 했습니다.

케이스 밑바닥을 드릴로(ㅋㅋ) 후잡하게 뚫어서 MCU board를 바깥으로 끄집어 냈고
USB 연결해서 컴퓨터로! 깔끔하게 보드 housing 까지 만들려고 했었으나
컴퓨터에 꼽아서 되는 순간 모든게 귀찮아서 테이프로 붙여버렸습니다.
떨어져서 고장나면 다시 프로젝트를 재개하도록 하겠습니다. 이 후기도 이 키보드로 썼습니다.

제작 중간중간에 사진을 찍어놓지 않아서 최종 사진만 올립니다.

IMG_20160922_201528.jpg


IMG_20160922_201607.jpg


IMG_20160922_201622.jpg


NKROtest.png


한손으로 누를 수 있는만큼 눌러봤습니다. ㅋㅋ