추천글
===========================================================
목차
1. HHKB2를 개조에 장단점 및 필요한 부품들
2. HHKB2에게 Arduino 및 RN-42 HID 연결하자.
* HHKB2를 아두이노와 연결 방법
1) HHKB2 열기
2)전선 준비 및 HHKB pro2 상판 connector에 전선 연결하기.
* RN-42 HID를 아두이노에 연결 하자.
1) RN-42 HID 에 대해서..
* HHKB pro 2 <--> Arduino mini por <--> RN-42 HID 연결회로도
3. about Arduino Programming
* Key map 설정은 각자 입맛에 맞게….
4. HHKB2 조립 및 완성하기
* 각 모듈 배치 및 전원회로 해결하기
* 디버깅 및 테스트
===========================================================
개조에 따라 HHKB2의 고장은 본인의 책임을 알려 드립니다.
3회 준비물
아두이노 미니 프로
아두이노 개발환경
용어설명 :
펌웨어 :
사전적 용어
펌웨어는 일반적으로 롬(ROM)에 저장된 하드웨어를 제어하는 마이크로 프로그램을 의미합니다.
강좌에서의 정확한 의미
아두이노에서 올라가 HHKB로부터 받은 데이터를 HID report로 변경하여 RN-42에 전달 하는 역할
아두이노 펌웨어를 수정하여 키 배치를 변경 할 수 있다.
프로그래밍에 대한 모든 설명은 하지 않겠습니다.
딱!! 해피해킹의 키맵을 변경하는 정도로만 이야기 드리겠습니다.
1. 아두이노 개발 환경 구성
개발환경 및 펌웨어 다운로드 방법은 아래 링크를 통해서 익숙해 지시면 됩니다.
링크 내용을 다 알 필요는 없지만, 최소한 아두이노 미니 프로에 펌웨어를 올리는 방법만 알아 두시면 됩니다.
궁금한 점은 언제든지 질문 주세면 아는 범위에서 답변 드리겠습니다.
아두이노 개발IDE 설치 (프로그래밍을 하는 툴이라고 보시면 됩니다.)
http://blog.daum.net/junebug11/10
아두이노 미니 프로에 대한 IDE 설명 및 펌웨어 다운로드 방법
(usb to serial 케이블을 통해서 작성한 펌웨어를 아두이노에 올리는 방방법)
http://blog.naver.com/PostView.nhn?blogId=avredu&logNo=140205996484
2. 아두이노 해피해킹 펌웨어 수정.
제가 기본적으로 사용하고 있는 펌웨어는 강좌 1편에도 링크 걸어 드린…
Addsict (http://addsict.hatenablog.com/) 님이 github에 올려 놓은 펌웨어를 사용했습니다.
펌웨어 출처 (아래 소스는 에러 없이 쓸수 있는 소스입니다. )
https://github.com/addsict/YetAnotherHHKBController/blob/master/hhkb/hhkb.ino
수정 사항이 있으면 git hub를 통해서 업데이트가 되니 가끔? 확인 해보는 것도 좋을 것 같습니다.
펌웨어 링크를 열어서 그냥 훓터 봐 주세요.
3. 아두이노 프로그램 실행 순서
스케치 (IDE)로 프로그래밍을 하게
되면, setup()함수가 불리고, 반복적인 일을 처리하는
loop()가 자동적으로 불리게 됩니다.
Setup은 아두이노가 켜지면 한번 불리게 되고, loop는
반복을 하게 됩니다.
아래 기본 함수를 기반으로 아두이노 프로그램이 실행되게 됩니다.
void setup() {
}
void loop() {
}
4. 아두이노에 핀정보 설정
아래 핀은 실제 물리적으로 연결된 핀 정보입니다.
/* Arduino Pins */ int muxRowControlPin[] = {2, 3, 4}; int muxColControlPin[] = {5, 6, 7}; int enableColPin = 8; int keyReadPin = 9; |
아래 핀정보와 일치되는 것을 알수 있습니다.
========================================================================================
pro2 Description Arduino mini pro pins
-------------------------------------------------------------
1 Vcc(5V) 5V
2 Vcc(5V) 5V
3 TP1684 KEY: Low(0) when key pressed 9 input(with pullup)
4 TP1684 KEY_PREV: make threshold
5 HC4051 A(bit0)\ 2 output
6 HC4051 B(bit1) > select row(0 to 7) 3 output
7 HC4051 C(bit2)/ 4 output
8 LS145 A(bit0)\ 5 output
9 LS145 B(bit1) > select column(0 to 7) 6 output
10 LS145 C(bit2)/ 7 output
11 LS145 D(enable) Low(0) enables selected column 8 output
12 GND GND
13 GND GND
================================================================================
5. Happy Hacking Key 배열
프로그램에서 일반 사용자가 눈 여겨 보야 할 곳은 KEYMAP_NORMAL_MODE 과 KEYMAP_FN_MODE 의 배열 입니다.
두 개의 배열은 동일한 크기를 가집니다.
KEYMAP_NORMAL_MODE는 FN키가 눌리지 않았을 때 키가 눌리는 위치에 키 값을 의미 합니다.
(큰변화 없이 그냥 쓰도록 하겠습니다.)
KEYMAP_FN_MODE는 FN이 눌려졌을 때의 어떤 키 값을 선택할지에 대한 배열입니다.
이 배열에 값을 추가 / 삭제 하여 원하는 FN키 조합으로 원하는 키보드 동작을 할 수 있습니다.
키 배열에서 보이는 UNUSED는 아무런 동작이 없는 값입니다.
이런경우 OS에 맞는 키가 동작하게 됩니다.
따라서, 위에 두 가지 배열에 값을 (16진수) 변경하면 원하는 키보드 값으로 쓸수 있습니다.
KEYMAP_NORMAL_MODE의 0, 0은 숫자 2의 값으로 “0x1F”를 가지게 됩니다.
0x1f는 지난번 첨부 드린 코드표 (transrate.pdf) 를 보면 2와 @는 0x1F 값을 가지게 되고,
shift에 의해서 구분이 됩니다.
https://github.com/addsict/YetAnotherHHKBController/blob/master/hhkb/hhkb.ino
< 전체 코드 링크 : 스케치에 전체를 복사하여 붙여넣고 빌드를 할 수 있습니다. >
/* KEYMAP KEY TO HID KEYCODE*/ uint8_t KEYMAP_NORMAL_MODE[MAX_ROWS][MAX_COLS] = { {0x1F/* 2 */, 0x14/* q */, 0x1A/* w */, 0x16/* s */, 0x04/* a */, 0x1D/* z */, 0x1B/* x */, 0x06/* c */}, {0x20/* 3 */, 0x21/* 4 */, 0x15/* r */, 0x08/* e */, 0x07/* d */, 0x09/* f */, 0x19/* v */, 0x05/* b */}, {0x22/* 5 */, 0x23/* 6 */, 0x1C/* y */, 0x17/* t */, 0x0A/* g */, 0x0B/* h */, 0x11/* n */, UNUSED}, {0x1E/* 1 */, 0x29/*ESC*/, 0x2B/* TAB */, 0xE0/* CONTROL*/, 0xE1/* L-SHIFT*/, 0xE2/* L-Alt */, 0xE3/* L-GUI */, 0x2C/*SPACE */}, {0x24/* 7 */, 0x25/* 8 */, 0x18/* u */, 0x0C/* i */, 0x0E/* k */, 0x0D/* j */, 0x10/* m */, UNUSED}, {0x31/* \*/, 0x35 /* `*/, 0x2A/* DELETE */, 0x28/* RETURN */, UNUSED/* Fn */, 0xE5/* R-SHIFT */, 0xE6/* R-Alt */, 0xE7/* R-GUI */}, {0x26/* 9 */, 0x27/* 0 */, 0x12/* o */, 0x13/* p */, 0x33/* ; */, 0x0F/* l */, 0x36/* , */, UNUSED}, {0x2D/* - */, 0x2E/* = */, 0x30/* ] */, 0x2F/* [ */, 0x34/* ' */, 0x38/* / */, 0x37/* . */, UNUSED} }; |
< KEYMAP_NORMAL_MODE 키보드 맵 >
그럼 아래 FN에 대한 키맵을 입맛에 맛게 고쳐 보겠습니다.
transrate.pdf를 보게 되면 volum dn / up, mute, 값이 있는데 이것을 FN키가 눌린 상태에서
a , s ,d 키를 누르면, 기능이 수행 되도록 FN의 키맵을 수정 해보겠습니다.
우선,
- KEYMAP_NORMAL_MODE에서 a, s, d 키 위치를 찾습니다.
- 그리고 volum dn / up, mute, Eject에 대한 값을 transrate.pdf값을 찾습니다.
Keyboard volume up : 0x80
Keyboard volume down : 0x81
Keyboard mute : 0x7F - KEYMAP_FN_MODE에 동일한 위치에 위에 값으로 변경 해줍니다. 값으로 변경 해줍니다.
아래 코드를 보니 a, s, d에 이미 leftArrow, downArrow, rightArrow을 맵핑 시켜놔 있네요.
그값을 지우고 위에 볼륨 값으로 변경 합니다.
/* KEYMAP KEY TO HID KEYCODE(Function Mode)*/
uint8_t KEYMAP_FN_MODE[MAX_ROWS][MAX_COLS] = {
{0x3B/* F2 */, UNUSED, 0x52/* UpArrow */, 0x51/* DownArrow */, 0x50/* LeftArrow */, UNUSED, UNUSED, UNUSED},
{0x3C/* F3 */, 0x3D/* F4 */, UNUSED, UNUSED, 0x4F/* RightArrow */, UNUSED, UNUSED, UNUSED},
{0x3E/* F5 */, 0x3F/* F6 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED},
{0x3A/* F1 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED},
{0x40/* F7 */, 0x41/* F8 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED},
{UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED},
{0x42/* F9 */, 0x43/* F10 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED},
{0x44/* F11 */, 0x45/* F12 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}
};
|
< 수정전 >
KEYMAP KEY TO HID KEYCODE(Function Mode)*/ uint8_t KEYMAP_FN_MODE[MAX_ROWS][MAX_COLS] = { {0x3B/* F2 */, UNUSED, UNUSED, 0x80/* Vol up*/, 0x81/* Vol Down*/, UNUSED, UNUSED, UNUSED}, {0x3C/* F3 */, 0x3D/* F4 */, UNUSED, UNUSED, 0x7F /* Mute */, UNUSED, UNUSED, UNUSED}, {0x3E/* F5 */, 0x3F/* F6 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}, {0x3A/* F1 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}, {0x40/* F7 */, 0x41/* F8 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}, {UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}, {0x42/* F9 */, 0x43/* F10 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED}, {0x44/* F11 */, 0x45/* F12 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED} }; |
감이 딱 오십니까 ? FN키를 본인이 입맛에 맞게 구성할 수 있게 되었습니다.
이제 링크를 통해서 배운 펌웨어를 컴파일하여 아두이노 미니에 전송하면 사용자 키 맵을 구성이 완료가 됩니다.
참고로 제가 사용하는 캡은 아래와 같습니다.
윈도우에서 한글 변환을 R-GUI 키로
윈도우 키를 오른쪽 alt키로 변경 하였습니다.
FN이 눌린 상태에서 space enter 등등등 동시에 눌리도록 약간의 수정을 하였습니다.
/* KEYMAP KEY TO HID KEYCODE*/
uint8_t KEYMAP_NORMAL_MODE[MAX_ROWS][MAX_COLS] = {
{0x1F/* 2 */, 0x14/* q */, 0x1A/* w */, 0x16/* s */, 0x04/* a */, 0x1D/* z */, 0x1B/* x */, 0x06/* c */},
{0x20/* 3 */, 0x21/* 4 */, 0x15/* r */, 0x08/* e */, 0x07/* d */, 0x09/* f */, 0x19/* v */, 0x05/* b */},
{0x22/* 5 */, 0x23/* 6 */, 0x1C/* y */, 0x17/* t */, 0x0A/* g */, 0x0B/* h */, 0x11/* n */, UNUSED},
{0x1E/* 1 */, 0x29/* ESC */, 0x2B/* TAB */, 0xE0/* CONTROL */, 0xE1/*L-SHIFT*/, 0xE2/* L-Alt */, 0xE3 /*L-GUI*/, 0x2C/ *SPACE */},
{0x24/* 7 */, 0x25/* 8 */, 0x18/* u */, 0x0C/* i */, 0x0E/* k */, 0x0D/* j */, 0x10/* m */, UNUSED},
{0x31/*\*/, 0x35 /*`*/, 0x2A/*DELETE*/, 0x28/*RETURN*/, UNUSED/*Fn*/, 0xE5/*R-SHIFT*/, 0xE7 /*0xE6 R-Alt*/, 0xE6/*0xE7 R-GUI */},
{0x26/* 9 */, 0x27/* 0 */, 0x12/* o */, 0x13/* p */, 0x33/* ; */, 0x0F/* l */, 0x36/* , */, UNUSED},
{0x2D/* - */, 0x2E/* = */, 0x30/* ] */, 0x2F/* [ */, 0x34/* ' */, 0x38/* / */, 0x37/* . */, UNUSED}
};
/* KEYMAP KEY TO HID KEYCODE(Function Mode)*/
uint8_t KEYMAP_FN_MODE[MAX_ROWS][MAX_COLS] = {
{0x3B/* F2 */, UNUSED, UNUSED/* Up */, 0x80/* Down */, 0x81/* Left */, UNUSED, UNUSED, UNUSED},
{0x3C/* F3 */, 0x3D/* F4 */, UNUSED, UNUSED, 0x7F/* Right */, UNUSED, UNUSED, UNUSED},
{0x3E/* F5 */, 0x3F/* F6 */, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED, UNUSED},
{0x3A/* F1 */, UNUSED, 0x39 /*Casp*/, UNUSED, UNUSED, UNUSED, UNUSED, 0x2C},
{0x40/* F7 */, 0x41/* F8 */, UNUSED, 0x46, 0x4A, UNUSED, UNUSED, UNUSED},
{0x49, 0x4C, 0x2A/* DELETE */, 0x28, UNUSED, UNUSED, UNUSED, UNUSED},
{0x42/* F9 */, 0x43/* F10 */, 0x47 /*scrLock*/, 0x48, 0x50, 0x4B, 0x4D, UNUSED},
{0x44/* F11 */, 0x45/* F12 */, UNUSED, 0x52, 0x4F, 0x51, 0x4E, UNUSED}
}; |
아두이노에서 RN-42로 눌려진 키보드 값을 보낼때는 아래 와 같이 serial.write로 만들어 보내주면 됩니다.
//Sends a raw report for a keyboard HID
프로그래밍 관련 업데이트는 추후에도 계속 하겠습니다.
ㅜㅜ;;; 급 마무리...
유령회원
손재주가 좋으시네요.