취미생활/3D 프린터

[3D 프린터] 분리형 기계식 키보드 만들기 part 3 -펌웨어

바위맨 2022. 10. 9. 17:42
반응형

What?

프린터의 사용까지 가능한 상태로 설정이 완료되고, 추라고 글을 쓰는 이유는??? 바로 펌웨어의 수정이 필요하기 때문이다. 펌웨어가 무엇이냐.....?를 이야기하기 시작한다면, 더이상 취미 글쓰기가 아니라 강의에 가깝게 되어버릴것 같기 때문에 간단하게 서칭해서 도움이 될만한 자료만 링크해두고 갑니다.
답답한 마음이 오는거 같아서 왜 펌웨어를 수정해야 하느냐??라는 질문이 들것 같아서 미리 이야기를 하고자 한다. 그리고 우선 다시 질문을 해야할 것 같다. 과연 당신은 키보드를 사용하는 과정에서 불편함을 느끼지 못했는가??
우리가 현재 사용하는 키보드의 형식은 가장 대중적으로 Qwerty형식의 키보드를 대다수가 사용하고 있다. 그리고 "키보드"라는 단어를 생각하면 모두 동일하게 이 형태의 키보드를 떠올리고 있는데... 이런 생각이 해본적이 있는지 모르겠다. "과연 내가 사용하느 키보드가 최적의 형태인가" 글을 적고있는 본인도 동일한 고민을 했었고, 그 당시 알아본 결론은 절대로 효율적인 형태가 아니었다. 심지어 지금의 구조는 (그 당시의)기계가 모두 처리하는데 어려움이 있었기 때문에 타자의 속도를 늦추게 되는 방향으로 "비합리적"인 경로로 사용자가 움직이도록 설계가 되어있다. 그리고 그당시 정의된 형태는 모두의 일반적인 형태로 인식이 되어버렸으며 지금은 당연히 공통으로 사용하고 있다.
(Qwerty배열의 효율성에 대해서는 별로 말할 이야기도 없다. 엄청난 근거가 있기 때문에 블로그에 간단하게 확인할 수 있이니 나는 감사하는 마음으로 글을 인용한다-쿼티 배열에 대하여)
짧게만 글을 올리다가 갑자기 너무 길게 글을 쓰는거 같은데 일단 펌웨어를 수정해야하는 원인에 대해서는 설명이 되었을 터이니 이정도로 정리하고 넘어가자.
펌웨어란?? 간단하게 말해서 기계를 동작 정의 정도겠지만, 그래도 궁금할테니 클릭

펌웨어 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 일상에서 쉽게 볼 수 있는 텔레비전 리모컨은 펌웨어로 동작하는 기기의 하나이다. 펌웨어(firmware)는 컴퓨팅과 공학 분야에서 특정 하드웨어 장치에 포함된 소

ko.wikipedia.org


Then?

그래서 어떻게 수정을 할 것이냐? 라면, 이 글에서 확인 할 수 있는 현재 제작중인 키보드의 원작자가 사용하시는 키보드의 배열을 기반으로 새로운 설정을 몇가지 적용할 계획이다.
키보드의 배열을 공유해주신 분도 많은 고민을 하고 구성을 진행했겠지만, 첫째로는 맥과 윈도우에서 오는 차이 때문에 설정을 할 필요가 있으며, 두 번째로 코딩을 해야하는 내 입장에서는 특수 기호또한 아주 낮은 빈도로라도 사용을 해야하기 때문에 나름 기억하기 쉬운, 사용하기 쉬운, 위치에 배열을 해야한다. 그리고 이런 배열을 하기 위해서는 펌웨어의 수정을 해야하기 때문에 이전 장에서 그렇게 장황한 설명을 진행하게 된 것.
물론 펌웨어의 수정만이 방법은 아니다. 어차피 업무를 진행하는 과정에서 키매크로를 많이 사용하는 상황에서 그냥 펌웨어에서 수정하지 않고, 매크로를 작성하는 방법도 있겠지만,,,,,,,, 굳이??? 할 수 있는걸 하지 않는것은 내성격에 맞지 않는다.
그래서 설정을 해보려고하는데... 윈도우에서는 QMK소프트웨어의 설치 자체가 쉽지가 않다. 다들 자세하게 설명을 해두지는 않았는데 읽어보니 결국은 리눅스 기만의 코드만 있기 때문에 윈도우에서는 힘든것. 그냥 VMwar에서 리눅스 하나 깔지머.. 시간 좀 걸리것네.
VMware를 사용해 볼까 하다가 보니 역시 귀찮음이 몰려와서 중간에서 중단하고 혹시하고 검색해보니
QMK Msys라는 프로그램이 있었다. 아마도. 윈도우 환경에서 빌드를 실행해야 하는데, 이런저런 제약을 가지고 윈도우에서 Msys를 이용한 환경 설정을 매번 하려니 너무 접근성도 떨어지고 그래서, 아예 자기들이 배포를 원하는 버전의 QMK소프트웨어를 설치한 Msys를 셋트로 배포를 해주는 것 같았다. 우리같은 사용자 입장에서는 너무나 고마운 일이기도 하고.. 그런데 이걸 사용해서 하는 과정에서도 참 어려움이 있었다. 빌드를 하려고 하면 오류 메시지가 발생하는것.

더보기

여기서 부터는 너무 자세하게 다른 이야기를 해야하기 때문에 분리해서 적어볼까 한다.

Msys 직접설치 시도

우선 Msys를 직접 설치하고 QMK를 설치하려고 진행했지만 이또한 문제가 발생했다.
리눅스 사용자라면 누구나 경험해 본 적이 있겠지만, 설치 과정에서 사용하는 여타 다른 라이브러리와의 충돌로 인해서 설치가 진행되지 않는다는 점이다. 이런 간단한 문제야 구글을 통해서 해결을 할 수 있겠지만, 대개의 문제들은 서로 라이브러리가 참조를 해서 사용하기 때문에 한군데서 문제가 발생하기 시작하면 주르르 문제가 이어지게 마련이다.

다른 방향으로의 검색

처음으로 (사실 진짜 처음 과정은 Vmware 에서 빌드 환경 구축이지만) 진행했던 방식은 이런저런 해결해야할 문제가 주르르 발생하기 때문에 이런것까지 골머리 싸매서 해결해서 하고 싶지는 않았다. 그래서 다른 방법이 없는가 검색하다 보니 나오는 QMK-Msys 프로그램 이름에서 부터 알려주듯이 윈도우 환경에서QMK를 사용하는 필요한 소프트웨어 두가지를 아예 설치해서 묶음 배포해주는 형태이다.

QMK-Msys사용

설치 파일을 배포하기 때문에 설치 자체는 너무 간단하기도 하고 처음 시작할 때부터 두 가지 명령만 알면 바로 사용이 가능한 프로그램 이었다.
qmk install
qmk compile -kb <키보드이름> -km default
그런데 git에서 다운받은 파일을 바로 폴더에 넣고 사용하려고 하면 부트로더 어쩌구 하는 에러가 발생하면서 되지 않는다. 설마하고
qmk new-keyboard 명령으로 새로운 키보드 추가를 통해서 wingB관련 정보를 입력해주고(이과정에서 키보드 이름에 대문자는 또 불가능하다고해서 공유된 파일 중 대문자 명을 하나씩 소문자로 수정해줌)
폴더 내에 공유받은 파일을 넣고 빌드를 실행하니 드디어 빌드가 됨을 확인할 수 있었다.

역시 취미인것은 부정할 수 없다. 그래도 성취감 @#@$&*^%&^@&%^j 기분 좋구만

How?
코드를 빌드 할 수 있는 환경까지 구축한 상태에서 더 해야할 일은 어떻게 하면 내가 최상의 사용감을 얻을 수 있는지이다.
구축 과정에서 확인된 필요키만 해도 벌써 대괄호, Del, Home, End가 있다. 대부분 키를 다른 레이어에라도 넣어야 겠다.
그러기 위해서또 필요한 정보는 바로 QMK에서 키보드 입력에 대해서 정해놓은 정의를 알아야 한다. 그래야 코드 상에서 어떤 키가 눌렸을 때, 해당 명령이PC로 전달되8777788mmmmmllpppp면서 키보드로서의 역활을 다 할수 있기 때문이다.
우선 지금 추가해야하는 명령을 정리해보면
- 우측 : PgDn, PgUp
- end, home
- 대괄호, 역슬러쉬
일차로 수정된 키보드의 매핑 결과는 다음과 같다.
애초에 공유받은 매핑 파일에서 일부 위치를 추가로 수정했다.
아무래도 나의 사용 용도에서는 거의 모든 특수키를 사용해야 했으며, 동시에 다른 키의 사용이 다르기 때문이다.
므튼 환경 설정도 완료되어 있으니 사용하면서 하나씩 개선해보는걸로 하자.
풀 와이어링 키보드 만들기는 여기까지로 하는걸로 한다.
다만 키캡을 교환할고 당기면 간혹 딸려나오는 키들이 있기 때문에 완전히 동작 잘되는게 확인됨ㄴ 글루건으로 뒤쪽을 좀 덮어줄 필요가 있을듯 하다.

#include QMK_KEYBOARD_H
#include "wingb.h"


#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2

#define RAISE MO(_RAISE)
#define LOWER MO(_LOWER)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  [_QWERTY] = LAYOUT(
     KC_GRV ,    KC_1  , KC_2  , KC_3  , KC_4  , KC_5  ,                         KC_6  , KC_7  , KC_8  , KC_9   , KC_0    ,KC_EQL,
     KC_TAB ,    KC_Q  , KC_W  , KC_E  , KC_R  , KC_T  ,                         KC_Y  , KC_U  , KC_I  , KC_O   , KC_P    ,KC_MINS,
     MO(_LOWER), KC_A  , KC_S  , KC_D  , KC_F  , KC_G  ,                         KC_H  , KC_J  , KC_K  , KC_L   , KC_SCLN ,KC_QUOT,
     KC_LSFT ,   KC_Z  , KC_X  , KC_C  , KC_V  , KC_B  ,                         KC_B  , KC_N  , KC_M  , KC_COMM, KC_DOT  ,KC_SLSH,
     KC_LCTL ,   KC_ESC , KC_LALT , KC_LSFT, KC_LCMD,KC_SPC,                  KC_SPC , KC_RALT , KC_LEFT ,KC_UP , KC_DOWN,KC_RGHT ,
                                              KC_ENT, KC_BSPC,                 KC_BSPC,  KC_RSFT
  ),
 
  [_LOWER] = LAYOUT(
     KC_F1 , KC_F2    ,  KC_F3  , KC_F4 , KC_F5 , KC_F6 ,                       KC_F7,   KC_F8 , KC_F9   , KC_F10   ,KC_F11  ,KC_F12 ,
     _______,_______  , KC_UP   ,_______,_______,_______,                        _______, KC_7  , KC_8    , KC_9     ,_______ ,_______,
     _______,KC_LEFT  ,KC_DOWN  ,KC_RGHT,_______,KC_LBRC,                        KC_RBRC, KC_4  , KC_5    , KC_6     ,_______ ,KC_DEL,
     KC_LSFT,KC_HOME  ,KC_PGUP  ,KC_PGDN,_______,KC_LPRN,                        KC_RPRN, KC_1  , KC_2    , KC_3     ,_______ ,_______,
     KC_ESC ,KC_LCTL , KC_LALT  , KC_LSFT, KC_LCMD,KC_SPC,                      KC_SPC , KC_0 , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT ,
                                              KC_ENT, KC_BSPC,                 KC_BSPC, KC_ENT
  )

};


bool process_record_user(uint16_t keycode, keyrecord_t *record) {
	return true;
}
반응형