HAPPY Hacking pro2 bluetooth 개조기 (3/4 )

done_happyhacking.JPG : (수정중 -_-;; HAPPY Hacking pro2 bluetooth 개조기 (3/4 )HAPPY Hacking pro 2 bluetooth  개조기.

 

===========================================================

목차

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=14020**9*48*

 

 

 

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의 키맵을 수정 해보겠습니다.

 

우선,

  1. KEYMAP_NORMAL_MODE에서  a, s, d  키  위치를 찾습니다.
  2. 그리고 volum dn / up, mute, Eject에 대한 값을 transrate.pdf값을 찾습니다.
    Keyboard volume up   : 0x80
    Keyboard volume down  : 0x81
    Keyboard mute         : 0x7F
  3.  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

    Serial.write(0xFD);        // Raw Report Mode
이전 댓글 59
행인09 2014-03-05 16:58
딱히 해피는 없지만 기다리고 있었습니다. 소스는 짤려서 github 에서..
으르중이 2014-03-05 19:49
감사합니다. 업데이트 목 빠지게 기다리고 있었습니다..
박병규(76) 2014-03-05 20:18
잘 보고 있습니다~
에이스미노 2014-03-07 01:37
굿  
에이스미노 2014-03-07 01:37
굿  
muggs 2014-03-07 17:24
대단하십니다.와.......
MoEn 2014-03-08 16:18
우와 이건 정말 대단하네요!!
강한량 2014-03-09 08:47
매회 보면서 대리만족을 느끼는중... 저도 언젠가 용기내어 제 해피를 뜯어보는 날이..
과학칩 2014-03-09 17:58
진짜 대단하세요..
흑백을삼킨공 2014-03-09 23:59
능력자분이시다..
JoYoungJun 2014-03-11 06:55
우와...대단하시네요!!
jTango 2014-03-13 01:25
이거 보니까 좀만 더 조작하시면 왼쪽에 펑션키 하나 더 놓으셔도 되겠네요. 재밌게 읽고 있습니다. 고맙습니다. 그런데 저 위에 코드는 다 C 언어죠?
sylar 2014-03-13 23:15
와우.. 작년 6월에 구상중이라고 글만 올리구선... 바쁘다는 핑계로 작업 하다 말았었는데...멋지십니다!!! 혹시 DC step up module 어떤거 사용 하셨는지 알 수있을까요??
진중하게 2014-03-14 11:50
대박이네여..
Sep 2014-03-14 18:18
요즘 블루투스 개조를 하나 하고 싶어서 이것저것 보고 있었는데 강좌 올려주셔서 감사합니다.
드라고나 2014-03-14 18:19
이거 대박이군요.. 저도 나중에 한대.. 부탁좀..ㅜㅜ
ribbon play 2014-03-14 21:21
워 능력이 대단하시네요...
sylar 2014-03-14 23:06
자세히는 아두이노에 쓰인 칩 데이터쉬트나 코시 전원 회로를 봐야 알겠지만.. 쓸데 없는 기능은 최대한 끄고 블루투스 모듈 전원 관리 및... 코시전원 회로에서 쓸모 없는 칩에 들어가는 전원을 끊거나 아예 떼내시면 최대한 파워 세이빙이 될거 같네요. 아두이노 와 블루투스 모듈 전원 관리만 해줘도 훌륭 할듯 합니다!!! 오늘부로 퇴직을 하여 주말부터 작업 해볼 생각인데 도움 주실거죠?^^ㅋㅋ 와우...아두이노에 들어간 ATMEL 칩 스펙을 보니...완전 저전력이네요....제가 원래 쓰려고 했던 칩보다 훨씬 저전력 이네요...제가 쓰려고 했던건 Cotex-M3 코어라...아두이노 까진 아니네요...아.. 아두이노 쓰는게 현명 할까요...ㅋㅋㅋ
김정기 2014-03-16 00:18
이런거 하시는 분들의 능력이 부럽....
고구마군 2014-03-16 22:58
정말대단하십니다
sylar 2014-03-17 20:30
하하하하;;; 동작 방식을 확인해 보니 제가 생각 하던 방식이 전혀 아니군요...ㅠㅠ 3번(key_pressed)이 키가 눌리면 level의 변화가 있을거라 생각 했는데... 그게 아니고 계속 폴링 해줘야 하는구만요... 머 이래..ㅠㅠ 이 키보드가 무선으로 안나오는 결정적인 이유겠네요..ㅋㅋㅋ 무선으로 나오려면 절대적으로 다시 설계 되어야 하겠네요. 흐어..ㅋㅋㅋ
주뇽s 2014-03-20 01:34
와우 대단하시네요!
BRyeon 2014-03-23 18:30
완성품이 언능 기대됩니다!
hanagun 2014-03-24 09:39
정말 대리만족입니다.. 다음편 완성편이 완전 기대됩니다~!
cknism 2014-03-31 15:18
대박이네요 멋집니다!!!
rayhue 2014-04-01 02:57
그동안 목빠지게 찾던 자료네요. ^^;; 
데덴네 2014-04-03 00:48
유선 키보드를 블루투스 키보드로 바꾸고 싶은 마음은 항상 가지고 있었는데 실제로 보니 엄청 어려운 거군요 ㅠㅠ 대리만족 하고 갑니다! 이런거 뚝딱 하시는 분들 보면 정말 부러워요
마크 2014-04-05 00:38
전문적인 정보 감사드립니다. ^^
리힌 2014-04-06 11:13
좋은 정보 감사합니다. 그냥 전 블투 키보드를 따로 구매해서 써야겠어요 ㅠㅠ
Housmile 2014-04-08 09:44
이건 뭐.. 대박이라고 말씀드릴 수 밖에.. 얼른 강좌가 나오길 기다리고 있었습니다. 나중에 시간내어 저도 도전해보려고요. 빠르게 스크랩해놔야지요. 하하하하하하 :)
근두운타고1 2014-04-10 18:17
잘보았습니다 좋은정보 감사합니다
박병규(76) 2014-04-12 03:06
4편을 애타게 기다리고 있답니다~
안녕님 2014-04-15 19:09
제가 전혀 모르는 놀라운 세상이군요; 능력자시네요..
거인의별 2014-04-17 15:02
저도 해피당 가입하면 꼭 도전해보고 싶네요.
tuna8611 2014-04-18 00:17
대단하십니다..
아스팔트 2014-04-18 09:43
손재주가 좋으시네요.
코드버드 2014-04-20 07:26
대단하시네요 ㄷㄷ
훈민정흡 2014-04-20 11:34
능역자시네여
연시리 2014-04-26 03:01
오 대단하시네요..잘배웠어요..감사합니다.
titanes 2014-04-26 19:52
잘 보고 갑니다
return 2014-05-06 12:00
잘 보고 갑니다.
sankill 2014-05-08 18:16
키보드 멋있네요.
소중한시간 2014-05-09 17:30
와..능려자 분들이시네요~ -0-
sklee203 2014-05-13 05:15
좋은 정보 감사합니다.
마음으로 2014-05-19 14:37
대단 하시다는~ㅎ
카레이스 2014-05-25 16:59
능력이 엄청나시네요.. 좋은자료 잘 보았습니다!
스파클 2014-06-19 14:15
손제주가 뛰어나시네요
화이트리카 2014-06-22 02:17
아 어렵습니다 
HappyCharles 2014-06-28 00:12
하...
안녕하세요1 2014-07-02 20:55
잘 봤습니다
shy 2014-07-07 03:49
아두이노는 한번 해봤는데................ 역시 어렵네요ㅠ
마늘냄새 2014-07-11 14:48
와 손재주가 정말 뛰어나시네요 배우고갑니다^^
Lego 2014-07-11 16:22
꿈의 키보드!!
수학사랑 2014-07-16 01:35
오 재주가 대단하십니다.
dojob 2014-07-20 08:11
엄청난 내공! 해피해킹 구매했는데 망치면 어쩌나 개조는 엄두를 못내겠습니다. ㅎㅎ
오파운드 2014-07-24 09:33
전 잘 이해가 안되네요 ㅠㅠㅠ 대단하시네요 ㅎㅎ
아그말리온 2014-07-24 13:56
어려워요~ㅠ 하지만 아시는분들이 보신다면 유용한 정보가 되겠네요~
Xeus 2014-08-01 10:20
어렵네요..
차카다키보드 2014-08-24 15:49
여기서 끈고 머리온도좀 낮추야겟네요 Cool 짱짱
← Best Article 목록으로