원문 캡처 · github.com
원문 캡처 · github.com

Raspberry Pi Pico W 또는 Pico 2 W를 SO-101/SO-100 로봇 팔의 독립형 컨트롤러로 사용하는 프로젝트다. Wi-Fi를 통해 내장 웹페이지, MQTT 또는 OpenAI Responses API 호환 원격 서버로 팔을 제어할 수 있으며, 선택 사항으로 바퀴 구동과 AI 채팅 기능도 제공한다.

프로젝트 저장소 · 시연 영상

웹페이지와 기능

서보가 보고한 값을 바탕으로 팔을 3D로 표시한다. 화면의 점을 클릭해 목표 위치를 지정한 뒤 Go를 누르거나 Enter 키를 입력하면 팔이 해당 위치로 이동한다. 웹페이지에는 보정, AI, 주행 기능이 있다.

  • 보정: 팔 관절의 동작 한계를 설정해 팔이 스스로 손상되는 일을 막는다.
  • 3D 매핑: 로봇의 좌우와 위아래 방향을 설정한다.
  • 포즈: OpenAI LLM 지식 기반에 사용할 여러 포즈를 정의한다.
  • AI: 상태 응답을 보여주는 채팅창을 제공한다. 마이크를 사용하려면 HTTPS가 필요하다.
  • 주행: 가상 조이스틱이나 게임패드로 바퀴를 제어한다.

보정 화면 · AI 화면 · 주행 화면

설정과 사용

Picohive는 디버그 로그와 무선 펌웨어 업데이트(OTA)에 쓰는 선택 사항이다. 사용하려면 Picohive에서 기기를 추가해 UUID, MQTT 비밀번호, 로그 키를 만들고 이름을 지정한다. 기기 설정에서 Export를 눌러 출력된 한 줄을 복사한다.

AI 채팅창을 사용하려면 API 키와 Responses API 및 저장 기능을 지원하는 서버의 모델이 필요하다. 예시 모델은 gpt-6.1-sol이다. 이 설정도 선택 사항이다.

기기에 펌웨어를 올리면 picow_config라는 액세스 포인트가 시작된다. 기본 비밀번호는 randompassword다. 이 액세스 포인트에 연결하면 설정 페이지가 자동으로 열리며, 열리지 않을 때는 http://192.168.4.1에 접속한다. 페이지에서 Wi-Fi와 웹 UI 사용자 이름·비밀번호를 설정한다.

원격 서버를 사용하는 경우 Picohive에서 복사한 설정 줄을 입력해 로그·OTA·충돌 보고를 설정할 수 있다. AI 기능을 사용할 때는 OpenAI 항목에 URL, 키, 모델, 프롬프트를 입력한다. 재부팅하면 기기가 설정한 Wi-Fi에 연결된다. 새 IP 주소는 Picohive 로그나 공유기에서 확인하고, 이후에는 해당 주소로 접속해 설정을 변경할 수 있다.

플래시 메모리를 지우려면 범용 flash_nuke.uf2를 사용한 뒤 펌웨어를 다시 올린다.

로봇 팔 조립과 보정

LeRobot의 절차를 따른다. 먼저 서보를 한 번에 하나씩 Pico에 연결해 ID가 겹치지 않도록 설정하고 전송 속도를 115200으로 맞춘다. 프로젝트 설명에 따르면 1K 저항을 사용한 구성에서는 1M 속도가 너무 높았다. 그런 다음 팔을 조립하고 배선을 연결한다.

웹페이지에서 보정 기능을 실행하고 팔을 손으로 움직여 동작 한계를 학습시킨다. 마지막으로 3D 모델에서 몇 가지 위치를 매핑해 로봇이 좌우와 위아래 방향을 구별하도록 한다.

펌웨어 빌드와 시뮬레이터

sh
git clone --recursive https://github.com/AdrianCX/picohive-robotarm.git
cd picohive-robotarm
os/build_via_podman.sh pico2_w # or pico_w

빌드 결과인 build/<board>/robotarm.uf2를 플래시한다. 이후 OTA 업데이트에 사용할 파일은 암호화된 robotarm.uf2.encrypted다. 직접 빌드하기 전에 OTA 문서에 설명된 대로 자체 OTA 키와 인증서를 만들어야 한다. HTTPS 인증서는 다음 명령으로 만든다.

sh
util/make_cert.sh <address>

같은 앱을 서보 시뮬레이션을 사용하는 Linux용으로도 빌드할 수 있다. 프로젝트는 웹페이지를 valgrind와 gdb로 다룰 때 유용하다고 설명한다.

sh
os/build_via_podman.sh linux # build/linux/robotarm
os/run_via_podman.sh # http://localhost:8080, https://localhost:8443
os/run_via_podman.sh --valgrind # or --gdb

하드웨어와 배선

기본 배선 설정은 src/config/general_config.h에 있으며, 배선이 다르면 이 파일에서 변경한다. 전체 배선 그림은 저장소의 배선 이미지에서 볼 수 있다.

  • 서보 버스는 GPIO 0(UART0 TX)을 1k 저항을 거쳐 연결하고 GPIO 1(RX)도 서보의 데이터 선에 연결한다. 속도는 115200 baud이며 설정 이름은 ARM_BAUDRATE다.
  • 서보에는 전원 공급 장치에서 12V와 접지를 직접 연결하고, Pico의 접지도 서보 접지와 연결한다.
  • 앞쪽 DRV8833은 왼쪽 모터를 GPIO 17/16에, 오른쪽 모터를 GPIO 18/19에 연결한다.
  • 뒤쪽 DRV8833은 왼쪽 모터를 GPIO 15/14에, 오른쪽 모터를 GPIO 12/13에 연결한다. 각 쌍은 전진·후진 제어에 사용된다.
  • GPIO 20은 두 드라이버의 sleep(EEP)에 연결하고 high로 유지한다.
  • Pico에는 벅 컨버터의 5V 출력을 VSYS에 공급한다.

서보 버스는 모든 서보가 데이터 선 하나를 공유하는 반이중 방식이다. Pico 핀은 3.3V이므로 서보 데이터 선의 유휴 전압이 3.3V 이하인지 확인해야 한다. 그렇지 않으면 레벨 시프터를 사이에 둔다. Waveshare 버스 서보 드라이버 보드는 이 처리를 이미 하며 같은 두 핀에 연결된다.

모터 하나의 두 핀은 PWM 슬라이스 하나를 공유한다. GPIO 번호를 옮길 때도 gpio/2 % 8 규칙을 유지해야 한다. 짝수 핀은 A, 홀수 핀은 B다. MOTOR_PWM 1은 핀을 PWM으로 구동하고, 0은 켜기/끄기 방식으로 구동한다. 배선도는 다음 명령으로 생성한다.

sh
python3 docs/pictures/wiring.py docs/pictures/wiring.svg

부품과 메모리 정보

팔에는 SO-101 출력 부품 또는 키트, STS3215 서보 6개(12V), 26650 배터리 2개가 필요하다. 이 빌드에 사용하는 출력 부품은 stl/에 있다. 전자 부품은 Raspberry Pi Pico 1 W, Pico용 5V 벅 컨버터(프로젝트 설명에 따르면 mini360도 사용 가능), 1k 저항, DRV8833 모터 드라이버 2개다. 나중에 카메라를 추가하려면 Pico 2를 사용하는 것이 좋다고 안내한다. 섀시는 선택 사항이며, 추가할 경우 DC 모터와 바퀴 4개를 사용한다.

저장소에는 다음 메모리 로그가 실려 있다.

text
[2026-10-25 13:52:12] 192.168.100.69 657 app[build/pico_w/robotarm] version[1.0] os[b697060-dirty] buildid[db40f1ac39e2b3ee3d07d2199aa628118cf588b3] Heap[12308/223652] Free[211344] MinFree[151552] LargestFree[192458] Stack[4236/16384] lastRestartReason[reboot_command]

프로젝트 설명은 최악의 경우에도 Pico에 여유 메모리가 상당히 남아 있으며(150KB), 스택 사용량도 적절하다고 밝힌다.

앱의 라이선스는 AGPL-3.0-or-later다. os/ 하위 모듈은 MPL-2.0을 따르며, 라이선스는 해당 디렉터리의 LICENSE 파일에 있다.