추천글
===========================================================
목차
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
프로그래밍 관련 업데이트는 추후에도 계속 하겠습니다.
ㅜㅜ;;; 급 마무리...
유령회원
이거 보니까 좀만 더 조작하시면 왼쪽에 펑션키 하나 더 놓으셔도 되겠네요.
재밌게 읽고 있습니다. 고맙습니다.
그런데 저 위에 코드는 다 C 언어죠?
와우.. 작년 6월에 구상중이라고 글만 올리구선... 바쁘다는 핑계로 작업 하다 말았었는데...멋지십니다!!!
혹시 DC step up module 어떤거 사용 하셨는지 알 수있을까요??
저도 DC Step up module을 부품 사다가 만들거나, 모듈을 써야 하나 생각하다...
가지고 있던,
cosy mini bluetooth 키보드의 컨트롤러를 그냥 가져다 사용 했습니다. BT 부분은 짤라 버리고요.
cosy mini BT 키보드는 내부 배터리가 3.7V ~ 4.1v정도였구요.
http://www.kbdmania.net/xe/files/attach/images/6138/221/152/008/68efed7b647c1dcfdb3ca92bc28b578f.png
내부 배터리 vcc로 흘려 아래쪽으로 넣어주고.....
http://www.kbdmania.net/xe/files/attach/images/6138/221/152/008/8ca02c995cf1764982a8edb6cd28dbb4.png
3V를 BT 모듈로
5V를 아두이노 raw pin에 주었고
아두이노에 vcc쪽에서 해피해킹 키스위치쪽으로 연결 해줬습니다.
기성품을 이용하여 결국!!!
충전도 되는 HHKB pro 2 BT가 되었습니다.
자세히는 아두이노에 쓰인 칩 데이터쉬트나 코시 전원 회로를 봐야 알겠지만.. 쓸데 없는 기능은 최대한 끄고 블루투스 모듈 전원 관리 및... 코시전원 회로에서 쓸모 없는 칩에 들어가는 전원을 끊거나 아예 떼내시면 최대한 파워 세이빙이 될거 같네요. 아두이노 와 블루투스 모듈 전원 관리만 해줘도 훌륭 할듯 합니다!!!
오늘부로 퇴직을 하여 주말부터 작업 해볼 생각인데 도움 주실거죠?^^ㅋㅋ
와우...아두이노에 들어간 ATMEL 칩 스펙을 보니...완전 저전력이네요....제가 원래 쓰려고 했던 칩보다 훨씬 저전력 이네요...제가 쓰려고 했던건 Cotex-M3 코어라...아두이노 까진 아니네요...아.. 아두이노 쓰는게 현명 할까요...ㅋㅋㅋ
안녕하세요 답변이 늦었네용 ^^
전 아두이노 추천 해드려요.
아두이노 나름 저전력이에요 > <;;;;; 그리고 전원관리를 어느정도 할 수 있습니다.
코지 컨틀로러에서 블루투스를 제거 했습니다.
그리고 rn-42 HID에쪽 전원 관리는 보질 못 했어요 ㅜㅜ;;;
제 활동 지역을 말씀 드리면
회사는 강남역 근처, 사는 곳은 경기도 성남 쪽입니다.
직접 뵙고 도움을 드릴 수 있는 방법?
(제가 도움을 받을지도 모르겠어요!!!)
덧.....
320mAh *2 완충해서 실사용 시간이 대략 10~ 12시간 정도 되네요.
배터리가 문제에요 ....ㅜㅜ
네 뭐 전원 관리도 중요 하지만 배터리 사이즈도 중요 하죠. 사이즈가 크면 클수록 좋으니... 오픈마켓에서 배터리로 검색하면 적당한 사이즈의 배터리가 있을 겁니다... 제가 대충 쓸 수 있을 만한 배터리 사이즈를 찾아보니 604055 이하의 사이즈로 구매 하시는게 좋을 듯 합니다. 604055(두께,세로,가로) 해피해킹 오른쪽 지지대쪽 공간에 들어갈만한 사이즈 입니다. 제가 대충 보니까 이정도 사이즈면 1000mA 정도의 배터리 사이즈더군요!
그리고... 아두이노에 쓰인 칩 데이터북을 보니... 5V 16MHz면 전력을 어느정도 소모 하더라구요..ㅠㅠ 그런데 보니까 아두이노 에서는 클럭조정이 안되는거 같더라구요...(자세히는 확인 못했습니다만...) 그래서 일단 저는 다른 칩을 써서 구현을 해 볼 생각입니다...
그리고 코지 컨트롤러에 블루투스 말고도 메인컨트롤러 있지 않나요...? 그것도 제거를 해야 할텐데...칩을 떼기는 힘드시다면.. 칩쪽에 전원핀 근처 비드소자가 있을텐데..그걸 떼는 것도 방법 일 듯합니다..
(제가 말씀 드린 도움은.. 만나는 것까진 아니구.. 그냥 글 정도라도 해주십사 부탁드린거예요^^;)
오른쪽은 아직 쓰지 않고 있는데요 그쪽에 추가 배터리를 넣어 보도록 하겠습니다.
앗 그리고 오늘 코지의 컨트롤러에 전원을 차단 시도 해봐야겠어요 ^^
쿨팁 주셔서 감사 합니다.
참 !!
클럭 조정과 관련하여 아래 링크를 참조 해보시면 될 것 같습니다.
One way to save power is to change the frequency the chip runs at :::
http://playground.arduino.cc/Main/PowerSaving#.UyVKEbmKDwp
그리고.... set_sleep_mode를 이용하는 방법있는 것 같습니다.
http://www.gammon.com.au/forum/?id=11497
얼마동안 키 입력이 없으면 SLEEP_MODE_PWR_DOWN
키보드 키 눌림 인터럽트가 발생하는걸 가지고 아두이노를 깨우는 걸 만들어 보려고하는데...제가 소프트웨어 쟁이라서.... ..
스터디가 좀더 필요하네요.
그럼 좋은하루 되세요.
하하하하;;; 동작 방식을 확인해 보니 제가 생각 하던 방식이 전혀 아니군요...ㅠㅠ
3번(key_pressed)이 키가 눌리면 level의 변화가 있을거라 생각 했는데... 그게 아니고 계속 폴링 해줘야 하는구만요...
머 이래..ㅠㅠ 이 키보드가 무선으로 안나오는 결정적인 이유겠네요..ㅋㅋㅋ 무선으로 나오려면 절대적으로 다시 설계 되어야 하겠네요.
흐어..ㅋㅋㅋ
유선 키보드를 블루투스 키보드로 바꾸고 싶은 마음은 항상 가지고 있었는데 실제로 보니 엄청 어려운 거군요 ㅠㅠ
대리만족 하고 갑니다! 이런거 뚝딱 하시는 분들 보면 정말 부러워요
딱히 해피는 없지만 기다리고 있었습니다.
소스는 짤려서 github 에서..