2022년 가을에 시작해 2025년 겨울까지 손에서 놓지 못한 물건이 있다. AGV 무선 조종기다. 펌웨어부터 회로, 케이스, 양산, 그리고 현장 A/S 까지 혼자 끌고 갔다. 잘 만든 이야기는 아니다. 다만 오래 붙들었던 이야기다.
무엇을 만들려 했나
구조는 단순하다. 세 덩어리가 줄지어 선다.
| 구분 | 내용 |
|---|---|
| 조종기 | ATmega328P + 블루투스 모듈 + OLED + 리튬전지 3.7 V / 2,000 mA |
| 수신기 | STM32F429 + 이더넷 + 와이어 엔코더(I2C) + RS232 · CAN |
| 상위 | B&R PLC 가 TCP/IP 로 수신기에 커맨드를 내린다 |
B&R 이 커맨드 10 을 내리면 조종기 데이터가, 11 을 내리면 와이어 엔코더의 길이와 각도가 올라온다. 사람이 조이스틱을 밀면 그 값이 블루투스를 타고 수신기로, 이더넷을 타고 PLC 로, 그리고 바퀴로 간다. 글로 쓰면 세 줄이다.
클럭 하나에 사흘
첫 벽은 부트로더였다. 외부 클럭을 8 MHz 로 쓰기로 해 놓고 퓨즈 비트를 맞추지 않으면 다운로드가 아예 안 된다. 어렵게 올렸더니 이번엔 시리얼 글자가 깨졌다.
원인은 같은 자리였다. 보율(BPS)은 클럭을 기준으로 계산된다. MCU 는 멀쩡히 돌고 다운로드도 되는데 통신만 깨지니, 통신 코드만 붙들고 한참을 헤맸다. 퓨즈 비트는 잘못 건드리면 MCU 가 그대로 죽는다. 죽인 칩이 몇 개인지는 세지 않았다.
방향
PCB 가 처음 조립되어 왔다. 전원을 넣었는데 MCU 가 아예 동작하지 않았다. 하루를 꼬박 회로도와 대조한 끝에 찾은 원인은 IC 를 반대로 꽂은 것이었다.
며칠 뒤에는 펑션키 여덟 개 중 일곱 개가 먹지 않았다. 디코더를 의심하며 코드를 뒤졌는데, 스위치를 거꾸로 조립한 것이었다. 그리고 그 디코더는 결국 내 설계 실수로 드러났다. 경우의 수를 잘못 세어 스위치 하나를 영영 쓸 수 없게 만들어 놓았다.
그해 가을에 배운 것은 이것이다.
코드를 의심하기 전에 방향을 보라.
보이지 않는 것들
조종기가 슬립 모드에 들어갔는데도 배터리가 줄었다. MCU 는 자고 있었지만 5 V 부스터와 3.3 V 레귤레이터가 깨어 있었다. 자는 척만 하고 있었던 셈이다. 전원단을 통째로 끊는 오토 파워 오프 회로를 새로 그렸다.
배터리 잔량은 정밀 ADC 를 쓰지 않고 다섯 칸으로만 나눴다. 하드웨어를 늘리는 대신 쓰는 사람이 알아볼 정도면 충분하다고 봤다.
수신기에서는 이더넷 클럭이 발진하지 않았다. 25 MHz 크리스털을 몇 번이나 바꿔 끼웠다. 원인은 LAN8742A 바닥면의 그라운드 처리를 빠뜨린 것이었다. 보이지 않는 면이었다. 같은 시기에 MAX3232 의 차지펌프 캐패시터도 하나 누락되어 있었다.
스위치를 지우다
초기 설계에는 페어링할 AGV 주소를 고르는 로터리 딥 스위치가 있었다. 그런데 1번부터 9번까지밖에 못 고른다. 대수를 늘리려면 하드웨어를 늘려야 했다.
결국 스위치를 지우고 화면으로 옮겼다. 오른쪽 버튼 두 개를 3초 누르면 주소 선택 화면이 뜨고, 조이스틱을 위아래로 움직여 고른 뒤 다시 두 버튼을 누르면 끝난다. 부품은 하나 줄었고 고를 수 있는 대수는 늘었다.
비슷한 판단이 하나 더 있었다. MCU 를 32 KB 짜리에서 128 KB 짜리로 올렸다. 값 차이는 천 원이었는데, 메모리가 빠듯해 한글을 화면에 띄우기조차 어려웠기 때문이다. 양산용 부품을 고를 때는 가격과 스펙만 보지 않았다. 국내에 물량이 있는가, 몇 년 뒤에도 구할 수 있는가가 더 중요했다. 성능이 가장 좋은 안을 두고 수급이 안정된 안을 택했다.
하드웨어로 풀던 것을 펌웨어로 옮기면 대개 이런 일이 생긴다. 원가는 줄고 유연해진다. 대신 코드가 늘고, 늘어난 코드는 언젠가 나에게 돌아온다.
수신기가 죽었다
2023년 4월, 현장에서 수신기 CPU 가 죽어서 돌아왔다. 왜 죽었는지 알 수 없었다. 회로도를 들고 전자과 교수님을 찾아갔다.
답은 전원 입력단에 있었다. 24 V 에서 5 V, 다시 3.3 V 로 내려가는 구간의 전압 마진이 너무 얇아 역으로 전류가 흐를 수 있다는 것이었다. 입력단에 전류 제한 코일을 넣으라는 조언을 받았다. 전류의 변화량이 클 때 그 변화를 눌러 주는 역할이다.
그 나이에 회로도를 들고 학교를 찾아가는 일이 부끄럽지 않았다고는 못 하겠다. 다만 모르는 걸 모른다고 말하지 않으면, 죽은 CPU 는 계속 돌아온다.
6천 원
원가를 줄이려고 블루투스 안테나를 딥 타입(14,000원)에서 SMD 타입(6,000원)으로 바꿨다. 2호기의 신호가 유난히 약했다. 스마트폰 앱으로 재 보니 1호기는 −50 dB, 2호기는 그에 한참 못 미쳤다.
제조사에 물으니 답이 한 줄이었다. 안테나 반경 5 mm 안에는 어떤 부품도 있으면 안 된다. 이미 배치를 끝낸 기판이었다. 8,000원을 아끼려다 결국 딥 타입으로 되돌렸다.
양산, 그리고 그 뒤
2023년 8월에 50대를 양산했다. 그런데 송신기에서 또 블루투스가 말썽이었고, 원인은 다시 클럭 설정이었다. 1년 전에 배운 것을 1년 뒤에 다시 배웠다.
그해 12월에는 군산에 내려가 7대를 백업했다. 이듬해 5월과 6월에는 수신기 소자가 연달아 나갔다. 7월에는 부품을 교체해 입고된 27대 중 8대가 불량이었다. 2025년 11월에도 나는 수신기 CAN 포트를 확인하고 있었다.
끝난 적이 없는 물건이었다. 3년 동안 이 조종기는 내게 계속 돌아왔고, 돌아올 때마다 내가 놓친 것을 하나씩 들고 왔다. IC 방향, 그라운드 한 면, 캐패시터 하나, 안테나 옆 5 mm.
그래도 지금 어딘가의 공장에서는 누군가 이 조종기를 쥐고 AGV 를 세우고 있을 것이다. 펑션키 여덟 개 중 하나는 내 계산 실수로 비어 있는 채로.
그 비어 있는 자리가, 이상하게도 가장 오래 기억에 남는다.

