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

 

우선,

  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
    Serial.write(0x09);        // Length
    Serial.write(0x01);        // Descriptor 0x01=Keyboard

    // send key codes(8 bytes all)
    Serial.write(modifiers);   // modifier keys    
    Serial.write(0x00, 1);     // reserved
    Serial.write(keycode0);    // keycode0
    Serial.write(keycode1);    // keycode1
    Serial.write(keycode2);    // keycode2
    Serial.write(keycode3);    // keycode3
    Serial.write(keycode4);    // keycode4
    Serial.write(keycode5);    // keycode5



프로그래밍 관련 업데이트는 추후에도 계속 하겠습니다.

ㅜㅜ;;; 급 마무리...


 


profile

유령회원