아들과 함께 만들어보는 인공지능(LLM) 로봇 만들기 프로젝트 — EP 7. 아두이노에서 라즈베리파이로, 로봇 두뇌 교체 과정

아들과 함께 만들어보는 인공지능(LLM) 로봇 만들기 프로젝트 — EP 7. 아두이노에서 라즈베리파이로, 로봇 두뇌 교체 과정

아두이노로는 한계가 왔다.

EP 6에서 만든 구조—아두이노 + Python 브릿지 노트북—는 작동했지만 매번 노트북을 연결해야 했다. 자율적으로 돌아다니는 로봇이 USB 케이블로 노트북에 묶여 있는 건 이상했다. Pi로 전환하면 브릿지와 ROS2 노드를 Pi 안에 올릴 수 있고, 로봇이 독립적으로 동작한다.

그리고 솔직히 아들이 이 전환을 기다리고 있었다. "언제 진짜 컴퓨터 달아?"가 몇 주째 들어오던 말이었다.


Pi 4 vs Pi 5 vs Banana Pi

세 가지 선택지를 비교했다. 기준은 하나였다. LLM은 Pi에 올리지 않는다. Pi는 ROS2 노드 실행, 카메라 파이프라인, 브릿지 역할만 한다. 무거운 추론은 Mac LLM 서버가 한다.

기기 가격(대략) RAM USB 3.0 발열 특이사항
Raspberry Pi 4B 4GB 55달러 4GB 2포트 심함 구하기 쉬움
Raspberry Pi 5 4GB 60달러 4GB 2포트 개선됨 재고 들쭉날쭉
Banana Pi M5 45달러 4GB 4포트 보통 ROS2 지원 불확실

Pi 5가 Pi 4보다 CPU 성능이 2~3배 높다. 카메라 파이프라인(640×480 30fps JPEG 인코딩)을 Pi 4에서 돌리면 CPU가 40~60% 차지한다. Pi 5에서는 20% 이하다. ROS2 노드 여러 개 동시에 돌리면 Pi 4에서 버벅임이 생기는 지점이 있었다.

Pi 5를 사고 싶었다. 재고 문제 때문에 잠깐 망설이다가 결국 Pi 4B 4GB로 갔다. 지금 당장 살 수 있었고, Pi 4도 우리 용도에 충분하다고 판단했다. Pi 5는 다음 버전에서.

Banana Pi는 ROS2를 직접 설치해서 테스트해봤는데, 커뮤니티 지원이 적어서 의존성 충돌이 몇 개 생겼다. 이걸 해결하는 데 시간을 쓰는 게 비효율적이라 제외했다.


아들이 하드웨어를 맡은 날

Pi를 받고 나서 아들한테 줬다. "이거 로봇에 달아봐."

진짜로.

지금까지 아들이 하드웨어를 담당한다고는 했지만, 실제로는 내가 옆에서 많이 관여했다. 이번엔 일단 혼자 해보게 했다.

아들이 Pi를 손에 들고 한참 봤다. GPIO 핀이 40개 나와 있는 걸 보더니 "이게 다 뭐야"라고 했다. 핀아웃 다이어그램을 출력해줬다. "이거 보면서 해봐."

아들이 Pi를 샤시에 부착하는 건 잘 했다. M2.5 스크루랑 스페이서를 쓰는 것도 설명하니까 이해했다.

문제는 전원 배선이었다.


결선 실수, Pi가 죽을 뻔한 날

아들이 L298N 모터 드라이버에서 5V 핀을 뽑아서 Pi GPIO 5V 핀에 연결했다. "5V는 5V에 꽂으면 되잖아"라는 논리였다.

틀렸다. L298N에서 나오는 5V는 모터 배터리에서 레귤레이터를 거친 건데, 이게 Pi GPIO에 직접 연결되면 Pi 공식 전원 입력(USB-C)을 우회해서 전력을 공급하게 된다. 전압 안정성을 보장할 수 없고, 최악의 경우 Pi 보드가 손상된다.

연결하기 직전에 봤다. "잠깐, 그거 연결하기 전에 한 번 확인해보자."

같이 핀아웃을 다시 봤다. GPIO 헤더의 5V 핀에 외부 전원을 연결하면 공식 전원 포트(USB-C)를 우회해 Pi 보드에 역전원이 공급된다는 것, 그래서 Pi에 전원을 줄 때는 반드시 공식 전원 포트를 써야 한다는 것, L298N 5V를 GPIO에 직접 연결하면 안 되는 이유를 설명했다. 그리고 모터 배터리와 Pi 전원을 분리하더라도 GND는 반드시 공통으로 연결해야 회로가 정상 동작한다는 것도 짚었다.

아들이 한참 들더니 "그럼 모터 전원이랑 Pi 전원은 따로 줘야 해?"라고 물었다. 그렇다. 별도 파워뱅크를 Pi USB-C에 연결하고, 모터는 Li-Po 배터리 따로. 이렇게 분리했다.

그 이후로 아들이 배선할 때 전원 라인은 반드시 나한테 확인을 받는다. 스스로 만든 규칙이다.


마이그레이션 과정

아두이노에서 Pi로 바꾸면서 달라진 것들이 있다.

바뀐 것:
- 모터 드라이버 핀 제어: Arduino digitalWrite/analogWrite → Pi RPi.GPIO 또는 gpiozero
- 초음파 센서: NewPing 라이브러리 → gpiozero.DistanceSensor 또는 adafruit-circuitpython-hcsr04
- 시리얼 통신: Pi 자체가 브릿지 역할, USB 케이블 노트북 불필요
- ROS2 노드: Pi에서 직접 실행 가능

그대로인 것:
- 핀맵 (CLAUDE.md 업데이트만 하면 됨)
- LLM 서버 통신 구조 (WebSocket)
- 브릿지 코드의 로직 (Python, 포트 번호만 바뀜)

CLAUDE.md에 Pi 섹션을 추가했다.

## 하드웨어 구성 (현재: Raspberry Pi 4B)
### 핀맵 (BCM 번호 기준)
| 컴포넌트 | BCM 핀 | 비고 |
|---|---|---|
| L298N IN1 | 17 | 좌측 모터 방향 A |
| L298N IN2 | 27 | 좌측 모터 방향 B |
| L298N ENA | 18 | 좌측 모터 PWM (HW PWM) |
| L298N IN3 | 22 | 우측 모터 방향 A |
| L298N IN4 | 23 | 우측 모터 방향 B |
| L298N ENB | 13 | 우측 모터 PWM (HW PWM) |
| HC-SR04 Trig | 24 | |
| HC-SR04 Echo | 25 | 3.3V 레벨 (Pi GPIO) |

### 주의
- HC-SR04는 5V 출력인데 Pi GPIO는 3.3V 허용
- Echo 핀에 전압 분배기 또는 레벨 쉬프터 필요 (4.7kΩ + 10kΩ 분배기 사용 중)
- ENA, ENB는 HW PWM 가능한 핀으로 배정 (18, 13번)

HC-SR04 에코 핀 전압 문제가 하나 더 있었다. HC-SR04는 5V로 동작하고 에코 출력도 5V다. Pi GPIO는 3.3V 허용이라 직접 연결하면 안 된다. 전압 분배기를 추가해야 한다. 아두이노 시절에는 이게 문제없었는데(Arduino는 5V IO) Pi로 오면서 생긴 새 고려사항이다.

아들이 전압 분배기 개념을 설명해줄 때 이해했는지 모르겠다. 저항 두 개로 전압을 낮추는 건 설명했는데 표정이 "일단 알겠어" 수준이었다. 직접 빵판에 만들어보면서 멀티미터로 전압 재봤더니 그때서야 "아, 진짜 낮아진다"라고 했다. 눈으로 봐야 아는 아이다.


처음으로 Pi에서 돌아갔을 때

ROS2 설치하고, 노드 올리고, 브릿지 스크립트 실행하고. 처음으로 Pi가 LLM 서버에 연결됐을 때 터미널 출력이 나왔다.

[robot_bridge] LLM 서버 연결: ws://192.168.1.100:8765
[sensor_node] HC-SR04 초기화 완료 (Trig:24, Echo:25)
[motor_node] L298N 초기화 완료
[robot_bridge] 센서 데이터 전송 중...

로봇이 거실을 돌아다녔다. 노트북 케이블 없이. 파워뱅크를 달고 혼자.

아들이 그걸 보면서 "이제 진짜 로봇이다"라고 했다.

맞는 말이다. 이전까지는 기술적으로는 작동했지만 케이블에 묶여 있었다. 지금은 다르다.


배터리 소모

실측 배터리 수명은 이렇다. Li-Po 3셀 2200mAh 배터리, 모터 2개 구동 기준.

  • 모터만 (LLM 통신 없음): 약 45분
  • LLM 통신 포함 전체: 약 32분
  • Pi + LLM 통신, 모터 정지 상태: 약 2시간

LLM 통신이 배터리를 생각보다 많이 먹는다. WiFi 지속 연결이 CPU를 쓰고, 데이터 송수신도 있다. 32분은 테스트나 시연에는 충분하지만 장시간 운용에는 짧다. 나중에 배터리 용량을 늘리거나, LLM 호출 빈도를 줄이는 방식을 고려해야 한다.

댓글

이 블로그의 인기 게시물

개발자는 코드를 쓰는 사람이 아니다 — AI 시대에 남는 자리는 '책임'에 있다

Harness Engineering in Practice — How Anthropic Designs AI Agents

What Is Harness Engineering — Designing the Reins for AI Agents