티스토리 뷰

반응형

안녕하세요. 09LABS입니다.

요즘 커스텀 키보드를 만들면서 STM32 계열 MCU를 사용하고 있는데, 칩 가격이 정말 미친듯이 올라서 15,000원
정도 하고 있는 상황입니다. 그래서 QMK 문서를 찾아보니 지원하는 MCU 목록 리스트는 아래와 같습니다.

Compatible Microcontrollers

https://github.com/qmk/qmk_firmware/blob/master/docs/compatible_microcontrollers.md

 

GitHub - qmk/qmk_firmware: Open-source keyboard firmware for Atmel AVR and Arm USB families

Open-source keyboard firmware for Atmel AVR and Arm USB families - GitHub - qmk/qmk_firmware: Open-source keyboard firmware for Atmel AVR and Arm USB families

github.com

Atmel AVR 계열
Atmega16U2 / Atmega32U2
Atmega16U4 / Atmega32U4
AT90USB64 / AT90USB128
AT90USB162

Non-native USB MCU
Atmega32A
Atmega328P
Atmega168P
- 168 / 168P와 328 / 328P는 패키지 상 차이가 없는 것으로 알고있으나, 펌웨어 빌드 시 명시해주는 것이 좋습니다.

ARM 계열
STM32F0X2
STM32F103
STM32F303
STM32F401
STM32F405
STM32F407
STM32F411
STM32F446
STM32G431
.....

STM 계열의 가격은 모델마다 다르지면 F103의 경우 15,000원, F303의 경우 35,000원 입니다.
따라서 AVR 계열 중 Non-native USB인 168과 328을 쓰는 것이 현명합니다. (3800 ~ 5500원)

그래서 Non-native USB는 무슨 차이인가 해서 찾아보니
Native USB 포트를 지원하지 않기 때문에 가상 USB 포트를 지원해주는 V-USB 부트로더를 사용해야 한다고 합니다.
별거 아니겠지~ 되겠지~ 하고 찾아보니 생각보다 자료가 엄청 없었습니다.
심지어 Non-native USB MCU를 사용하는 키보드도 거의 없었지만 아주 잘 정리되어있는 키보드를 찾았습니다.

TKL 키보드를 만들 때 영감을 얻었던 coseyfannitutti의 discipline 키보드의 경우 Atmega32A를 사용하고
같은 제작자의 Numpad를 찾아보니 discipad의 MCU는 Atmega328P를 사용했습니다.

먼저 Non-native USB MCU인 Atmega32A와 Atmega328P의 경우 펌웨어 업로드 과정이 어떻게 되는지 확인해보니

  1. USBasploader 부트로더를 업로드 한다. (원작자 git repository에 수정본 있음)
  2. QMK 펌웨어 또는 커스텀 펌웨어를 빌드한 뒤 hex 파일을 준비한다.
  3. 키보드의 전원을 뽑고 BOOT 스위치를 누른채로 고정한다.
  4. RESET 스위치를 한번 눌러준다.
  5. BOOT 스위치를 떼준다.
  6. 부트로더 모드 진입이 완료되면 avrdude 또는 QMK Toolbox를 사용하여 키보드 펌웨어를 업로드 한다.

여기서 주의해야할 점은 부트로더와 키보드 펌웨어가 업로드 되는 영역이 다르고, 키보드로 동작하려면 부트로더가
먼저 업로드 된 상태여야 한다는 점 입니다.

이 때 까지만 해도 쉬운 줄 알았지....

방법은 대충 알았으니 회로를 구성해볼까요?
미친듯이 삽질을 해서 결국엔 Kicad를 다운로드 받고 discipad 회로도를 참고하여 구성하였습니다.

Atmega328P 회로 구성

테스트를 해보니 Atmega168 / 328 둘 다 잘 동작하는 것을 확인했습니다. 아두이노 나노로도 잘 동작했구요....
간단히 요약 드리자면....

  • [USB D+] --> 75 Ohm 저항 --> Atmega 4번 핀에 연결
  • [USB D-] --> 75 Ohm 저항 --> Atmega 5번 핀에 연결 <USB D- 핀에서 1.5K Ohm 저항을 5V에 연결 해야 함>
  • USB D+, D-에는 제너다이오드 연결 필수
  • BOOT 스위치는 GND와 Atmega 11번 핀에 연결
  • RESET 스위치는 풀업 저항을 구성하여 Atmega RESET 핀(1번 핀)에 연결

당장 스위치까지 연결해서 테스트할 필요는 없으니 기본 회로만 구성해서 테스트 하면 됩니다.
이제 회로 구성이 끝났으니 USBasploader 부트로더를 ISP 업로더를 사용하여 Atmega MCU에 올려주면 됩니다.

부트로더 빌드 & 업로드

참고자료
coseyfannitutti - discipad Bootloader

 

GitHub - coseyfannitutti/USBaspLoader: An (V)USB bootloader firmware for AVR-MCUs emulating the popular USBasp for programming i

An (V)USB bootloader firmware for AVR-MCUs emulating the popular USBasp for programming itself - GitHub - coseyfannitutti/USBaspLoader: An (V)USB bootloader firmware for AVR-MCUs emulating the popu...

github.com

먼저 위 Github Repository 링크에서 atmega328p 브랜치로 이동해서 파일을 다운로드 받습니다.
<아래 설명은 Mac OS 기준으로 설명합니다>

먼저 Mac OS에 기본적으로 avrdude가 설치되어있지 않으므로 Homebrew를 설치해야합니다.
Homebrew가 설치되어 있으면 아래 과정은 생략하셔도 됩니다.
터미널을 켜고 아래와 같이 명령어를 입력해준 뒤 엔터를 치면 Homebrew가 설치됩니다.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 2> /dev/null

설치가 완료되었으면 brew 명령어를 사용하여 avrdude를 설치합니다.

brew install avrdude

avrdude는 AVR MCU에 부트로더나 프로그램을 올릴 때 사용하는 툴 입니다.
설치가 잘 되었는지 확인하려면 터미널에 avrdude라고 입력한 뒤 엔터를 입력하면 실행되는 것을 확인할 수 있습니다.

부트로더 업로드를 위해서는 ISP 프로그래머가 필요합니다.
적당히 저렴한 ISP 업로더를 구매합니다. 

저는 두개 다 가지고 있는데 잘 작동됩니다.

이제 사용하는 ISP 업로더에 따라 Makefile.inc 파일을 일부 수정해야 합니다.
최상위 디렉토리에 Makefile.inc 파일을 열어 41번 줄에 가면 ISP Programmer를 설정할 수 있습니다.
기본은 USBtiny ISP 업로더이므로 사용하시는 ISP 업로드로 바꿔주시면 됩니다.
저는 AVRISP MkII를 사용하여 아래와 같이 변경하였습니다.

cd ~/Downloads/USBaspLoader-atmega328p
vi Makefile.inc

# PROGRAMMER contains AVRDUDE options to address your programmer
# PROGRAMMER = -c pony-stk200
# PROGRAMMER = -c usbasp
PROGRAMMER = -c avrisp2

지원 가능한 ISP 프로그래머 목록

  2232HIO          = FT2232H based generic programmer
  4232h            = FT4232H based generic programmer
  arduino          = Arduino
  arduino-ft232r   = Arduino: FT232R connected to ISP
  atmelice         = Atmel-ICE (ARM/AVR) in JTAG mode
  atmelice_dw      = Atmel-ICE (ARM/AVR) in debugWIRE mode
  atmelice_isp     = Atmel-ICE (ARM/AVR) in ISP mode
  atmelice_pdi     = Atmel-ICE (ARM/AVR) in PDI mode
  avr109           = Atmel AppNote AVR109 Boot Loader
  avr910           = Atmel Low Cost Serial Programmer
  avr911           = Atmel AppNote AVR911 AVROSP
  avrftdi          = FT2232D based generic programmer
  avrisp           = Atmel AVR ISP
  avrisp2          = Atmel AVR ISP mkII
  avrispmkII       = Atmel AVR ISP mkII
  avrispv2         = Atmel AVR ISP V2
  buspirate        = The Bus Pirate
  buspirate_bb     = The Bus Pirate (bitbang interface, supports TPI)
  butterfly        = Atmel Butterfly Development Board
  butterfly_mk     = Mikrokopter.de Butterfly
  bwmega           = BitWizard ftdi_atmega builtin programmer
  C232HM           = FT232H based module from FTDI and Glyn.com.au
  c2n232i          = serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts
  dasa             = serial port banging, reset=rts sck=dtr mosi=txd miso=cts
  dasa3            = serial port banging, reset=!dtr sck=rts mosi=txd miso=cts
  diecimila        = alias for arduino-ft232r
  dragon_dw        = Atmel AVR Dragon in debugWire mode
  dragon_hvsp      = Atmel AVR Dragon in HVSP mode
  dragon_isp       = Atmel AVR Dragon in ISP mode
  dragon_jtag      = Atmel AVR Dragon in JTAG mode
  dragon_pdi       = Atmel AVR Dragon in PDI mode
  dragon_pp        = Atmel AVR Dragon in PP mode
  flip1            = FLIP USB DFU protocol version 1 (doc7618)
  flip2            = FLIP USB DFU protocol version 2 (AVR4023)
  ft232r           = FT232R Synchronous BitBang
  ft245r           = FT245R Synchronous BitBang
  jtag1            = Atmel JTAG ICE (mkI)
  jtag1slow        = Atmel JTAG ICE (mkI)
  jtag2            = Atmel JTAG ICE mkII
  jtag2avr32       = Atmel JTAG ICE mkII im AVR32 mode
  jtag2dw          = Atmel JTAG ICE mkII in debugWire mode
  jtag2fast        = Atmel JTAG ICE mkII
  jtag2isp         = Atmel JTAG ICE mkII in ISP mode
  jtag2pdi         = Atmel JTAG ICE mkII PDI mode
  jtag2slow        = Atmel JTAG ICE mkII
  jtag3            = Atmel AVR JTAGICE3 in JTAG mode
  jtag3dw          = Atmel AVR JTAGICE3 in debugWIRE mode
  jtag3isp         = Atmel AVR JTAGICE3 in ISP mode
  jtag3pdi         = Atmel AVR JTAGICE3 in PDI mode
  jtagkey          = Amontec JTAGKey, JTAGKey-Tiny and JTAGKey2
  jtagmkI          = Atmel JTAG ICE (mkI)
  jtagmkII         = Atmel JTAG ICE mkII
  jtagmkII_avr32   = Atmel JTAG ICE mkII im AVR32 mode
  lm3s811          = Luminary Micro LM3S811 Eval Board (Rev. A)
  mib510           = Crossbow MIB510 programming board
  mkbutterfly      = Mikrokopter.de Butterfly
  nibobee          = NIBObee
  o-link           = O-Link, OpenJTAG from www.100ask.net
  openmoko         = Openmoko debug board (v3)
  pavr             = Jason Kyle's pAVR Serial Programmer
  pickit2          = MicroChip's PICkit2 Programmer
  ponyser          = design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts
  siprog           = Lancos SI-Prog <http://www.lancos.com/siprogsch.html>
  stk500           = Atmel STK500
  stk500hvsp       = Atmel STK500 V2 in high-voltage serial programming mode
  stk500pp         = Atmel STK500 V2 in parallel programming mode
  stk500v1         = Atmel STK500 Version 1.x firmware
  stk500v2         = Atmel STK500 Version 2.x firmware
  stk600           = Atmel STK600
  stk600hvsp       = Atmel STK600 in high-voltage serial programming mode
  stk600pp         = Atmel STK600 in parallel programming mode
  ttl232r          = FTDI TTL232R-5V with ICSP adapter
  tumpa            = TIAO USB Multi-Protocol Adapter
  UM232H           = FT232H based module from FTDI and Glyn.com.au
  uncompatino      = uncompatino with all pairs of pins shorted
  usbasp           = USBasp, http://www.fischl.de/usbasp/
  usbasp-clone     = Any usbasp clone with correct VID/PID
  usbtiny          = USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/
  wiring           = Wiring
  xplainedmini     = Atmel AVR XplainedMini in ISP mode
  xplainedmini_dw  = Atmel AVR XplainedMini in debugWIRE mode
  xplainedpro      = Atmel AVR XplainedPro in JTAG mode

이제 부트로더 빌드 후 MCU에 업로드 해주면 되는데요, 회로도는 위에서 보여드린 것과 같이
MOSI, MISO, SCK, RESET, VCC, GND 핀에 맞게 ISP 프로그래머에 연결해주면 됩니다.
그리고 아래 명령어를 터미널에 입력하여 펌웨어 빌드 후 플래싱, 퓨즈비트 설정까지 마치면 부트로더는 준비됩니다.

cd ~/Downloads/USBaspLoader-atmega328p
make firmware # 펌웨어 빌드
make flash # 펌웨어 플래시
make fuse # 퓨즈 비트 설정

이제 거의 다 왔습니다.

행복회로 풀가동 :D

QMK 펌웨어 빌드 후 업로드

QMK 펌웨어 빌드 방법은 어렵지 않습니다. (물론 제 기준?)
참고자료 : QMK Setup

 

QMK Firmware Docs

The full documentation of the open-source firmware

docs.qmk.fm

2번에 OS별로 정리가 잘 되어있으나 저는 macOS 기준으로 설명드립니다.

brew install qmk/qmk/qmk # qmk 설치
qmk setup # qmk 설정

Documentation 상에 커스텀으로 만든 펌웨어도 테스트할 수 있도록 Fork된 Repository도 지원한다고 되어있습니다.
QMK가 설치되었으면 아래와 같이 명령어를 입력하여 펌웨어를 빌드할 수 있습니다.

qmk compile -kb <keyboard> -km <keymap>

저는 discipad를 참고하였으니 discipad를 빌드해보겠습니다.

qmk compile -kb coseyfannitutti/discipad -km default

기본 설정대로 따라했다면 위와 같은 텍스트가 뜨고 ~/qmk_firmware 디렉토리에 빌드됩니다.
이제 펌웨어를 업로드 할 차례입니다. USB 케이블을 연결하기 전 아래와 같은 순서로 연결해주면 됩니다.

  • BOOT 스위치를 누른채로 유지한다.
  • USB 케이블을 연결한다.
  • RESET 스위치를 한번 눌러준다. (BOOT 스위치는 누른채로 유지)
  • BOOT 스위치를 떼준다.

위와 같은 순서로 진행해야 부트로더 모드로 진입이 가능합니다.
부트로더 모드 진입이 완료되면 아래와 같이 명령어를 입력하여 펌웨어를 업로드 합니다.

qmk flash -kb coseyfannitutti/discipad -km default

정상적으로 업로드가 완료되면 아래와 같이 표시되며 업로드가 완료됩니다.
업로드가 완료되면 리셋 스위치를 한번 눌러줍니다. 그러면 키보드로 작동하게 됩니다.

 

QMK Toolbox 사용법

QMK Toolbox는 CLI(Command Line Interface)에 익숙하지 않으신 분들을 위해 쉽게 펌웨어를 업로드 할 수 있는 프로그램입니다.
손쉽게 펌웨어 업로드가 가능하며 직접 빌드한 펌웨어 파일을 업로드할 수도 있습니다.

QMK Toolbox 다운로드 링크

 

Release Latest Beta · qmk/qmk_toolbox

Commits 742b148: Remove default keymap download section (#314) (Ryan) #314

github.com

OS 별로 다운로드가 가능합니다.

QMK 툴박스를 실행하면 위 화면과 같이 Local File과 QMK에 릴리즈 된 키보드 펌웨어를 직접 받을 수 있도록 제공합니다.
키보드, 키맵을 직접 선택하여 업로드가 가능하니 다운받고 싶은 키보드를 선택해서 Load 버튼을 눌러주면 알아서 펌웨어를 다운로드 합니다.

부트로더 모드로 진입하면 QMK 툴박스에서 자동으로 USBasp를 인식하여 업로드 준비를 마칩니다.

MCU 모델을 선택한 뒤 Flash 버튼을 누르면 아래 사진과 같이 표시되며, 펌웨어를 자동으로 업로드합니다.
(사진 상엔 실패로 뜨는데 경로를 지우느라 저렇게 표시되었습니다. 정상적으로 업로드 되면 Read / Write 동작이 표시됩니다.)

이렇게 해서 USBasploader 부트로더 업로드부터 QMK CLI, QMK Toolbox 사용법에 대해 알아봤습니다.
사실 업로드 성공하는데 까지 거의 3일이 걸렸습니다. (실제 개발기간 포함하면 4개월)
다음 업로드는 Numpad 제작기가 아닐까 싶네요. 다만 2일에 미국 출장이라 2월달 쯤 올리지 않을까 싶습니다.
문의사항은 댓글로 남겨주시면 '언젠가' 답글 달아드립니다.
그럼 즐거운 자작 생활 되시길 바라며.... 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함