펌웨어는 보드 위에서 이미 동작합니다. LED가 켜지고, 버튼이 카운트되고, USB가 열립니다. 그 보드는 아직 공기 속에 있습니다. 케이스를 덮는 순간, 같은 코드가 다른 물건이 됩니다.
이 글은 특정 보드의 핀맵을 공개하지 않습니다. 소량 기기에서 펌웨어와 케이스가 어긋나는 지점과, 그 어긋남을 닫는 순서를 현장 기준으로 적습니다.
먼저 맞출 것은 핀이 아닙니다
케이스 도면을 열기 전에 세 가지를 보드와 같이 봅니다.
- 손이 누르는 위치 — 버튼의 중심이 케이스 바깥에서 어디인지
- 빛이 나오는 위치 — LED가 케이스 두께를 통과하는지, 도광이 필요한지
- 꽂히는 위치 — USB·전원·센서 구멍이 보드 커넥터와 같은 높이에 있는지
이 세 위치가 스케치에 없으면, 펌웨어의 핀 번호는 정확해도 완성품은 빗나갑니다. 코드는 핀을 보고, 사용자는 구멍을 봅니다.
드라이 핏, 전원 넣기 전
첫 만남은 점등이 아닙니다. 보드를 케이스에 넣어 보는 일입니다. 나사 보스와 USB 쉘, 버튼 캡과 스위치 스템이 간섭하면, 코드를 고치기 전에 플라스틱을 고칩니다.
- 보드만 넣는다. 전선·배터리 없이 안착을 본다
- 뚜껑을 닫고 USB가 들어가며 보드가 밀리지 않는지 본다
- 버튼 캡을 올리고 스위치가 이미 눌린 채인지 확인한다
캡이 미리 눌려 있으면 펌웨어는 부팅부터 입력을 받습니다. 버그가 아니라 기구입니다. 이 상태에서 디버그를 시작하면 한 주를 코드에 씁니다.
버튼 스트로크
케이스 밖에서의 클릭감은 스위치 스펙이 아닙니다. 캡 두께, 보스 높이, 고무 키트의 압축이 더해진 값입니다. 펌웨어의 디바운스 시간은 이 기구가 정해진 뒤에 맞춥니다.
너무 짧은 디바운스는 캡이 튀는 기구에서 이중 입력이 됩니다. 너무 긴 디바운스는 짧은 스트로크 케이스에서 입력을 삼킵니다. 같은 코드가 출력 하우징과 절삭 하우징에서 다르게 느껴지는 이유입니다.
버튼 테스트를 탁상 공중에서 하지 않습니다. 케이스를 닫고, 실제 누르는 손가락 방향으로 스무 번. 그 기록이 디바운스의 근거입니다.
빛이 벽을 통과할 때
보드 위의 LED는 밝습니다. 케이스 안에서는 죽습니다. 도색, 두께, 내부 반사, 라이트 가이드의 유무가 펌웨어의 brightness 값보다 큽니다.
소량에서는 PWM을 먼저 최대로 올리고 케이스를 깎는 일이 많습니다. 순서를 반대로 갑니다. 케이스의 창을 정한 뒤, 그 창에서 읽히는 최소·최대 밝기를 펌웨어에 넣습니다. 창이 없으면 펌웨어의 애니메이션은 사용자에게 없습니다.
USB와 열, 그리고 리셋
케이스 안 배치는 펌웨어의 리셋 경로를 바꿉니다. 부트 버튼을 구멍 없이 넣으면 현장 업데이트는 케이스를 여는 일이 됩니다. 소량 기기에서 케이스를 여는 일은 스크래치와 분실 나사를 만듭니다.
- 업데이트 구멍을 둘 것인지, 열어서 꽂을 것인지 먼저 정합니다
- 리셋 핀이 케이스 리브에 눌리지 않게 피합니다
- 충전 중 발열 부품 위에 손가락이 오래 닿는 벽을 피합니다
펌웨어에 워치독이 있어도, 리셋 스위치가 케이스에 눌려 있으면 기기는 반복해서 처음부터입니다.
한 장의 맞춤 기록
펌웨어 저장소와 케이스 도면은 폴더가 다릅니다. 만나는 지점만 한 장으로 남깁니다.
- 버튼·LED·커넥터의 케이스 좌표
- 닫은 상태에서의 실측 스트로크와 디바운스 값
- 밝기 단계가 창 밖으로 구분되는 개수
- 업데이트 방법 — 구멍, 열기, 또는 둘 다 아님
이 한 장이 있으면 다음 하우징 버전에서 코드를 처음부터 의심하지 않습니다. 펌웨어가 케이스를 만난다는 것은, 두 도면이 한 물건의 순서가 된다는 뜻입니다.
조립 순서 — 코드보다 안착
펌웨어 저장소를 열기 전에 케이스가 보드를 받아들여야 합니다. 순서를 반대로 하면 한 주의 디버그가 기구의 간섭을 코드로 번역합니다. 현장이 쓰는 순서는 아래입니다.
- 보드만 안착. 전선·배터리·안테나는 아직 없음
- 뚜껑 닫힘. USB 쉘이 보드를 밀지 않는지
- 버튼 캡 올림. 스위치가 이미 눌린 채인지
- 전원. 첫 점등은 케이스 안에서만 기록
- 스트로크 스무 번. 손가락 방향은 실제 사용 방향
- 창 밖 밝기. PWM은 창을 정한 뒤에
6번 전에 애니메이션을 넣지 않습니다. 창이 없는 애니메이션은 사용자에게 없는 기능입니다.
맞춤 기록의 필드 순서
펌웨어 폴더와 케이스 도면 폴더는 합치지 않습니다. 만나는 한 장만 만듭니다. 칸의 순서는 손이 만지는 순서입니다.
- 하우징 버전과 보드 리비전 — 날짜 포함
- 버튼·LED·커넥터의 케이스 좌표
- 닫은 상태 스트로크(실측)와 디바운스 값
- 창 밖으로 구분되는 밝기 단계 수
- 업데이트 경로 — 구멍 / 열기 / 둘 다 아님
- 리셋·부트 핀이 리브에 닿는지
- 충전 중 손이 오래 닿는 벽의 유무
일곱 칸이 비면 다음 하우징에서 코드를 다시 의심합니다. 칸이 있으면 의심의 첫 대상은 플라스틱입니다.
실패 모드
같은 코드가 다른 물건이 되는 실패는 대개 핀맵이 아닙니다.
- 탁상 공중에서 버튼을 테스트한다 — 캡·보스·키트의 압축이 빠진 채 디바운스를 정함
- PWM을 최대로 올리고 창을 나중에 깎는다 — 창이 생기면 단계는 이미 포화
- 부트 버튼을 구멍 없이 넣는다 — 현장 업데이트가 스크래치와 분실 나사가 됨
- 리셋이 케이스에 눌린 채 출고한다 — 워치독이 있어도 기기는 처음부터만 반복
- USB 높이만 도면에서 맞춘다 — 뚜껑을 닫은 뒤 쉘이 보드를 민다
실패를 코드 이슈로 올리면 한 주가 사라집니다. 먼저 드라이 핏, 그다음 점등. 이 순서만 지켜도 버그 절반은 기구로 남습니다.
하우징이 바뀔 때
출력 하우징에서 절삭 하우징으로 가면 같은 펌웨어가 다른 손을 만듭니다. 바꿀 때 다시 도는 최소 루프가 있습니다.
- 드라이 핏 세 단계
- 스트로크 스무 번
- 창 밝기 단계 수
- 업데이트 구멍이 아직 맞는지
루프가 끝나면 맞춤 기록의 하우징 버전만 올리고, 코드를 처음부터 의심하지 않습니다. 펌웨어가 케이스를 만난다는 그림은 이 한 장의 좌표입니다. 좌표가 있으면 손은 그 그림으로 돌아옵니다.