시작은 PCB 부터
매번 애용하고 있는 JLC PCB에서 주문했고 가격은 배송비 포함 6만 2천원 정도.
3D 모델 공유하면 주는 7달러 쿠폰을 써서 5만원 정도에 주문할 수 있었다.
배송 옵션은 S.F Express로 골랐는데 생산+받아보기까지 약 10일 정도 걸렸던 것 같다.
제작하고 픽업하는데 5일 정도 걸린거로 나왔으니 배송 자체는 꽤 빠른편이다.
the Ave 때도 그렇고 그동안 카일 소켓에 쓰루홀 다이오드만 써왔는데
이번에는 TTC 핫스왑 소켓 + 온보드 다이오드로 설계해봤다.
기존 카일 소켓은 생각없이 떔질하다보면 위아래 바꿔껴서 스위치를 못끼는 경우가 있었는데
TTC 소켓은 점대칭 구조라 실장할 때 위아래를 구분할 필요가 없다는게 최대 장점이고
사진처럼 위쪽 빈 공간에 다이오드를 넣는 식으로 공간을 최대한 아낄 수 있어서 좋다.
부품들이 다 작은데다 방향까지 신경써야돼서 눈이 좀 아프긴한데
슈카월드 틀어놓고 생각없이 땜질하다보니 어느새 끝나있었다.
문제는 컨트롤러와 커넥터가 올라가는 메인 보드의 FPC 커넥터 부분.
1mm 피치라는 말에 별거 아니네 했는데 역시 플럭스 없이는 무리였다;; (플럭스 안사둠)
납끼리 뭉친게 핀 안쪽으로 들어가면 구제 방법이 없길래 기판 3개를 날려먹었고
4개째에서 겨우 좀 잘된 것 같아 보여서 일단 넘어갔다.
그래서 완성된게 이거.
입체적으로 갈라진 부분이 많다보니 구성이 꽤 난잡하다.
커넥터도 생각없이 배치하다보니... (사실 생각은 했지만 뇌용량이 딸려서;;)
매트릭스쪽과 컨트롤러 쪽의 핀배치가 반대로 된 부분도 꽤 있었다.
기판은 공개전에 수정할 곳이 꽤 많아서 체크리스트도 따로 작성해두고 수정 중이다.
아무튼 이래저래 납떔도 끝났겠다 키 + LED만 구성해둔 테스트용 펌웨어로 LED 테스트.
LED 부분은 Vcc / GND가 병렬로 쭉 연결되고 DIO는 일렬로 이어주는 구조이므로
중간부터 안나올 경우 끊긴 부분의 LED 방향을 체크해보거나 납땜을 다시해주면 보통 다 해결된다.
Split 연결은 Full Duplex로 구성했다.
왠지는 몰라도 QMK 문서 Split Wiring 항목에 바로 안나오던데
통신용 핀으로 TX RX 2개를 소모하는대신 저항을 따로 준비하지 않아도 된다.
정석은 TX-RX / RX-TX 로 교차시켜서 선을 따줘야 하지만
RP2040은 소프트 스왑을 지원해서 개떡같이 연결해도 찰떡같이 돌아간다.
config.h :
#define SERIAL_USART_FULL_DUPLEX
#define SERIAL_USART_TX_PIN GP0
#define SERIAL_USART_RX_PIN GP1
#define SERIAL_USART_PIN_SWAP
여기서 맨 밑의 SWAP이 Slave쪽의 TX/RX를 스왑해 준다는 뜻.
그렇게 기판만 만들어 놓고 한참 지나서 받아본 하우징.
주문은 PCB랑 같이 넣었던 것 같은데 JLC 측에서 생산전에 컨펌해주는게 있어서 꽤 걸렸다.
상판은 블랙레진, 하판은 8111X 레진으로 출력했고 총 13만원 정도가 나왔다.
믿고 쓰는 JLC답게 프린팅 수준은 추가 가공 없이 바로 조립이 가능한 정도였다.
특히 조이스틱과 터치패널 부분은 설계대로 정확하게 나와서 감탄스러울 정도.
근데 조립하다보니 발견한게 하판 뒷꽁무니 부분을 너무 좁게 설계해놔서 TRRS 케이블이 안들어갔다;;
커넥터 핀 부분 규격이야 당연히 다 맞았지만 손잡이 부분이 두꺼운걸 생각 못해서 생긴 문제.
사진은 갈아서 넓혀준 뒤 찍은건데 곡선 디자인이다보니 매끄럽게 넓힐수가 없어서 어설프게 됏다.
사실 여기서 좀 현타가 많이 오긴했는데 뭐 이런거 체크하려고 뽑은 프로토 타입이니까...
이렇게 조립 과정에서 발견한 문제점들은 모델파일에 바로바로 적용해줬다.
아래 쪽이 수정한 버전.
TRRS 케이블 손잡이 부분이 두꺼운건 1센치 가까이도 가길래 1.1cm까지 넓혀줬다.
그렇게 어지쩌지 끝!
...이면 좋겠지만 예상치 못한 문제가 발생했다
우선 조이스틱 XY 핀을 아무렇게나 할당해놨었는데
뒤늦게 문서를 읽어보니 아날로그 핀에 할당해야됐다.
그리고 앞에서도 불안하다 싶었던 FPC 커넥터.
눈이 안좋아서 육안으로 봐서는 분명 잘 연결된거 같은데
정작 해당 컨트롤러를 마스터로 잡고 터치패드를 연결해보면 작동이 되지를 않았다.
더 시도해보기엔 여분 기판도 여분 커넥터도 한개 밖에 안남은데다가
테스트할 때마다 컨트롤러를 갈아넣을 수도 없는 노릇..
결국 그래서 [minimal-fpc-i2c-pcb] 를 주문해서 I2C로 연결하기로 했다.
물론 커넥터 납땜은 내가 하기엔 무리라고 판단해서 PCBA로 주문했다.
FPC 커넥터 (PCBA) + 새로 뽑은 메인보드 기판 + 배송비까지 다 합쳐서 6만원 정도. (돈지랄)
조이스틱이 들어가는 왼쪽 기판은 조이스틱 XY 핀을 아날로그 핀에 다시 할당해줬고
터치패드가 들어가는 오른쪽 기판은 납땜하기 편하게 I2C 핀아웃으로 변경했다.
Cirque Trackpad - FPC - I2C 변환 PCB - I2C 핀 이런식으로 연결된다.
...그럼 이제 다 해치웠나 싶지만...언제나 그렇듯 지금부터가 진짜 시작인 법.
에러가 안날때까지 무한 수정
특히 이번 펌웨어는 유난히 우여곡절이 많았다.
일단 QMK 문서에 있는 조이스틱 코드 예제가 제대로 된게 없어서 삽질을 오지게 했다.
거기다 조이스틱 모듈도 Idle 값이 미묘하게 틀어져 있어서
그거 알아낸다고 또 3일정도 소모했던 것 같고..
꾸역꾸역 해결하고 나니 이번엔 뭐이리 예민한지 좀만 건들여도 계속 인풋이 발생하길래
결국 QMK 제공 조이스틱 코드는 버리고 자체 스캔 코드를 넣고 데드존을 넓게 설정하는 걸로 해결했다.
config.h :
#define JS_X_PIN GP28
#define JS_Y_PIN GP29
#define JS_X_MID 720
#define JS_Y_MID 755
#define JS_DEAD 200
keymap.c :
void matrix_scan_user(void) {
if (!JS_R && JS_X > JS_X_MID+JS_DEAD) {
JS_R = true;
register_code(KC_WH_R);
} else if (JS_R && JS_X < JS_X_MID+JS_DEAD) {
여기서 JS_DEAD가 입력을 무시하는 데드존 기능.
그러다 중간부터 진짜 머리 터질뻔 했던게
rules.mk에서 아날로그 드라이버만 켜주면 Slave쪽 연결이 안되는 문제였는데
TRRS쪽 납땜만 몇번이나 다시해줬는데도 해결안되고..
아예 컨트롤러 TX RX 핀에서 선따서 넣어줘도 안되고..
비슷한 구성의 Stront를 보니까 mcuconf.h가 있길래 이거 넣어야 하나 싶어서 만들어줫더니
이번엔 뭔 QMK 문서에도 안나오는 ADCx 세팅을 해줘야 한댄다.
QMK 디코에 물어보니 ChibiOS 쪽 세팅 값이라서 QMK에는 안나올거라는데
막상 ChibiOS 쪽 페이지 가도 안나오는건 매한가지.
QMK 디코에도 아는 사람이 없어서 포기하려던 타이밍에
I2C 관련 세팅 항목 이름이 "RP_I2C_USE_I2C1" 이길래
똑같이 "RP_ADC_USE_ADC1"로 만들어줘 봤는데 어이없게도 정답이었다;;
물론 이게 Slave쪽 연결 안되는걸 해결해주진 못했고;;;;;;
연결 안되는 문제는 결국 QMK 디코의 elpekeñin 님이 해결해주셨다.
keymap.c :
void matrix_scan_user(void) {
if (is_keyboard_master()) {
JS_X = analogReadPin(JS_X_PIN);
JS_Y = analogReadPin(JS_Y_PIN);
자체 조이스틱 스캔 코드에서 Master인지 체크하고 아날로그 핀값을 읽어오는 구문이 있는데
해당 핀에 대한 모드 지정 (아날로그 핀으로 쓸지 디지털 핀으로 쓸지) 이 선행되지 않아서
Slave측이 뻗어버리는 것 같았다. (정황상)
긴가민가 하면서 알려준 핀 지정 코드를 추가해봤는데
keymap.c :
void pointing_device_init_user(void){
if (is_keyboard_master()) {
setPinInputHigh(JS_X_PIN);
setPinInputHigh(JS_Y_PIN);
기가막히게도 해결돼버렸다.
그 밖에도 디버그 하면서 몇개 알게 된게 있는데
'report_joystick_t' has no member named 'axes'
이건 config.h에서 조이스틱 관련 세팅이 누락될 경우 뜨는 에러다.
config.h :
#define JOYSTICK_BUTTON_COUNT 0
#define JOYSTICK_AXIS_COUNT 2
#define JOYSTICK_AXIS_RESOLUTION 10
22년도 쯤에 작성된 옛날 코드들을 참조해서 만들다보면
JOYSTICK_AXES~ 로 잘못 적어서 컴파일이 안될 수 있다.
(23년도 쯤에 JOYSTICK_AXIS~ 로 바뀌었음)
그리고 Cirque Trackpad는 FPC 케이블로 연결할경우
위에 적은 [minimal-fpc-i2c-pcb] 로 연결하는거면 정방향 케이블이면 된다.
만약 SPI로 연결하려는데 잘 모르겠으면 무조건 앞뒤 정방향인거랑 역방향인거 2개 같이 사라.
근데 사실 잘 모르겠으면 그냥 시도를 안하는게 돈아끼는 방법이긴 하다.
keymap.c :
void pointing_device_init_user(void){
pointing_device_set_cpi(800);
그리고 QMK 디코의 pfn0님이 알려준 코드인데
Cirque Trackpad 사용시 포인터 속도 조절은 이 코드로 하면 된다.
또 키 입력은 잘되고 키보드 연결 직후에만 터치패드가 잘 작동하다 잠시 후 먹통되는 경우
이건 FPC 케이블이 씹혔거나 핀위치가 틀어져서 커넥터 안에서 쇼트난거다.
코드 문제는 아니니 시간낭비 하지말고 그냥 위치를 잘 잡아주면 해결된다.
고생고생해서 ErgoRox50 프로토 타입 완성!
https://github.com/ReGenBot03/Ergorox50
아직은 Schematics랑 QMK 코드만 올려뒀고
모델파일이랑 PCB는 몇가지 좀더 수정해서 공개할 예정이다.
끗.