2022년 여름, 책상 위에 자동감김 릴 하나가 올라왔다. 잡아당기면 풀리고 놓으면 되감기는, 사원증 줄 같은 그 물건이다. 여기에 자석 하나와 칩 하나를 붙여서 AGV 가 앞차를 따라가게 만드는 것이 그해의 숙제였다. 2023년 3월에 손을 뗐다.
줄 하나면 된다
추종제어(following control)의 요구는 단순했다. 앞차와 뒤차를 와이어로 잇고, 뒤차가 앞차를 일정한 거리에서 따라가게 한다. 그러려면 두 가지만 알면 된다.
- 와이어가 얼마나 풀려 있는가 — 길이
L - 와이어가 어느 방향으로 당겨지고 있는가 — 각도
θ
L 이 목표보다 길어지면 가속하고 짧아지면 감속한다. θ 만큼
조향한다. 실제로 제어는 어렵지 않았다. 어려운 것은 이 두 값을 싸게, 그리고
튼튼하게 재는 일이었다.
자석 하나, 칩 하나
릴의 회전축에 지름 방향으로 착자된 자석(diametric magnet)을 붙인다. 그 위 1–2 mm 떨어진 자리에 AS5600 을 올린다. AS5600 은 홀 소자 배열로 자기장의 방향을 읽어 각도를 내놓는 12 비트 자기 각도 센서다. 한 바퀴를 4,096 으로 나누고, I2C 로 읽는다.
와이어를 당기면 릴이 돌고, 릴이 돌면 자석이 돌고, 자석이 돌면 각도가 바뀐다. 그 각도에 드럼 원주를 곱하면 길이가 된다. 이 구조의 좋은 점은 닿는 데가 없다는 것이다. 축과 센서가 접촉하지 않으니 마모가 없다.
대신 에어갭을 지켜야 한다. 1–2 mm 를 벗어나면 센서가 읽는 자기장 세기가 범위 밖으로 나간다. 기구적으로는 이 1 mm 를 유지하는 것이 전부였다.
길이축과 조향축, 두 군데를 재야 하므로 AS5600 은 두 개를 썼다.
다회전을 세는 스무 줄
AS5600 은 절대각을 준다. 그런데 그 절대각은 한 바퀴까지다. 4,095 다음은 0 이다. 와이어가 열 바퀴 풀렸다면 그 열 바퀴는 따로 세어 주어야 한다.
degAngle = output * 0.087890625;
// 한 샘플 사이에 반 바퀴 넘게 튀었다면, 돈 것이 아니라 경계를 넘은 것이다
if ((lastOutput - output) > 2047) revolutions++;
if ((lastOutput - output) < -2047) revolutions--;
position = revolutions * 4096 + output;
이 가정이 성립하려면 샘플링이 충분히 빨라야 한다. 와이어가 갑자기 풀릴 때가 위험하다. 한 샘플 사이에 반 바퀴 이상 돌아 버리면 회전수를 통째로 놓치고, 그 뒤의 길이는 전부 틀린다. 이 방식의 한계는 분해능이 아니라 속도에 있다.
각도 환산 계수 0.087890625 는 360 을 4,096 으로 나눈 값이다.
코드에 이 숫자가 그대로 박혀 있다.
0.038
길이 환산은 실측으로 맞췄다.
WireLength = position * 0.038 - 80; // -80 은 오프셋 → 향후 파라미터로 조정
0.038 은 카운트당 밀리미터다. 한 바퀴가 4,096 카운트이므로
0.038 × 4,096 ≈ 155.6 mm, 드럼 지름으로 환산하면 약 50 mm 가 된다.
보고서에는 설명용으로 지름 100 mm 를 가정해 원주 314 mm 라고 적어 두었지만,
실제 릴은 그 절반쯤이었다.
뒤에 붙은 -80 은 오프셋이다. 와이어를 끝까지 감았을 때가 0 이 아니라서
뺀 값이다. 주석에 “향후 파라미터로 조정”이라고 써 두었고, 실제로 나중에
밖으로 뺐다.
| 디버거에 찍힌 한 순간 | |
|---|---|
| revolutions | 1 |
| output (원시 각도) | 2,000 |
| position | 1 × 4,096 + 2,000 = 6,096 |
| degAngle | 2,000 × 0.087890625 = 175.78° |
| WireLength | 6,096 × 0.038 − 80 = 151.6 mm |
숫자가 손으로 계산한 값과 맞아떨어지는 것을 확인하고 나서야 다음으로 넘어갔다.
릴을 열다
그런데 그 0.038 이 처음부터 맞지는 않았다. 환산 상수가 어긋나서,
드럼 지름을 직접 재려고 릴을 분해했다.
안에는 태엽처럼 감긴 얇은 판 스프링이 들어 있었다. 와이어를 되감는 힘은 전부 여기서 나온다. 뚜껑을 여는 순간 그 스프링이 풀렸고, 다시 감는 요령을 몰라 끝내 복원하지 못했다. 릴을 새로 주문해야 했다.
그때 배운 것은 이것이다.
재려고 분해했다가, 잴 대상을 잃었다.
지금 생각하면 열 필요가 없었다. 와이어를 일정 길이만큼 뽑아 자로 재고, 그동안 올라간 카운트로 나누면 계수가 나온다. 그 다음부터는 그렇게 했다.
상수는 밖으로
값을 올리는 쪽은 블루투스였다. 상위 B&R PLC 가 커맨드를 내리면 수신 보드가 답하는 구조다.
| 커맨드 | 응답 |
|---|---|
| −10 | 조이스틱 값 |
| −11 | 와이어 엔코더의 길이와 각도 (float) |
| −12 | 파라미터 쓰기 — 길이축·조향축의 드럼 직경과 오프셋 |
세 번째가 중요했다. 드럼 직경과 오프셋을 펌웨어에 박지 않고 PLC 에서 써 넣을 수 있게 해 두었다. 릴을 교체하면 직경이 미세하게 달라지는데, 그때마다 펌웨어를 다시 구울 수는 없다. 이건 잘한 결정이었다.
블루투스 모듈의 전원은 MCU 가 트랜지스터로 끊었다 붙일 수 있게 오픈 컬렉터로 물려 두었다. 모듈이 먹통이 되면 사람이 가서 전원을 뽑는 대신 펌웨어가 재기동한다.
같은 수신 보드 이야기는 무선조종기 개발의 추억 에 따로 적었다. 거기서 커맨드 10 과 11 을 언급했는데, 그 11 이 바로 이 와이어 엔코더다.
굴러갔다
2023년 초, 프로토타입으로 AGV 추종 구동에 성공했다. 만능기판 위의 Nucleo-F429ZI, 점퍼선, 그리고 테이프로 붙인 릴이 전부였다.
돌아보면 제어가 가장 쉬운 부분이었다. 남은 질문은 전부 기구 쪽이었다. 와이어가 늘어지면 어떻게 되는가. 사람이 걸려 넘어지면. 릴 스프링의 수명은 몇 만 번인가. 현장의 분진 속에서 에어갭 1 mm 가 유지되는가.
그 질문들에 답하기 전에 다른 문제가 먼저 왔다.
이미 걸려 있었다
이 방식에 이미 특허가 걸려 있다는 것을 뒤늦게 알았다. 변리사에게 상담을 받았고, 회피가 쉽지 않다는 답을 들었다. 보고했지만 그대로 추진하라는 답이 돌아왔다. 결국 제품으로는 나가지 않았다.
기술적으로 되는 것과 팔아도 되는 것은 다른 문제다. 그리고 그 둘 사이의 거리는 대개 구현이 끝난 다음에야 보인다. 선행 특허 조사는 착수 전에 하는 것이다. 다 만들어 놓고 하는 조사는 조사가 아니라 확인이다.
3월에 손을 뗐다. 릴은 서랍에 들어갔다.
남은 것은 몇 개다. 자석 하나로 각도를 읽는 방법, 다회전을 세는 스무 줄, 열기 전에 생각하라는 것, 그리고 만들기 전에 찾아보라는 것.
요즘도 자동감김 릴을 보면 손이 먼저 간다. 다만 뚜껑은 열지 않는다.

답글 남기기