
HuggingFace의 Lerobot을 통한 SoArm101 로봇 프로젝트를 하게 되면서 로봇 관련 공부를 하게 되었고, 교육용 로봇팔에 관심있는 상태였다. 그러다가 기회가 닿게 되어 myCobot 280 M5라는 로봇을 이번에 만나보게 되었다. 생각보다 연결하는 과정에서 삽질을 좀 했다. 그냥 냅다 공식문서도 안 봤었고 매뉴얼 없이 검색이나 AI로 검색 그리고 질문하면서 들이 받았고, 클로드는 공식문서 내용도 뒤죽박죽이라고 하긴했다. 근데 안 봤으니 알리가 있을까? 어쨌든, pymycobot 버전이 바뀌면서 API도 달라져서 기존 블로그 글들이 안 맞는 경우가 많았다.
그래서 이번 글에서는 myCobot 280 M5를 Python으로 제어하기 위한 3가지 연결 방법 — USB, WiFi, Bluetooth(BLE)를 초보자도 따라할 수 있게 정리해봤다. 이 글은 교육용 로봇 입문 시리즈의 첫 번째 글이고, 다음 편에서는 카메라+OpenCV 비전, 그 다음에는 LeRobot/VLA 모델 연동까지 갈 예정.
준비물
하드웨어
- myCobot 280 M5 (6축 교육용 로봇팔)
- USB-C 데이터 케이블 (충전 전용 안 됨! 이거 때문에 처음에 안 잡혀서 삽질함)
- 전원 어댑터 (12V)
소프트웨어
- Python 3.x (나는 3.14 사용)
- pymycobot 4.0.4
- bleak (BLE 연결 시 필요)
환경 세팅
먼저 가상환경 만들고 pymycobot을 설치한다.
mkdir ~/cobot280 && cd ~/cobot280
python3 -m venv .venv
source .venv/bin/activate
pip install pymycobot
시리얼 포트 확인 (OS별)
| OS | 포트 확인 명령어 | 예시 |
|---|---|---|
| macOS | ls /dev/tty.usbserial-* | /dev/tty.usbserial-5B090248161 |
| Linux (Ubuntu) | ls /dev/ttyUSB* 또는 dmesg | grep tty | /dev/ttyUSB0 |
| Windows | 장치관리자 > COM 포트 | COM3 |
USB 케이블 꽂았는데 포트가 안 뜨면, 데이터 전송이 되는 USB-C 케이블인지 확인하자. 충전 전용 케이블은 시리얼 통신이 안 된다. 나도 이것 때문에 처음에 좀 헤맸다.
① USB 시리얼 연결 (가장 기본)
로봇팔을 처음 쓸 때 가장 먼저 하게 되는 USB 연결이다. M5Stack 화면에서 Transponder > USB UART를 선택하면 된다.

# usb_test.py — USB 시리얼 연결 기본 코드
from pymycobot import MyCobot280
import time
# macOS 포트 예시. Linux면 /dev/ttyUSB0, Windows면 COM3 등
mc = MyCobot280("/dev/tty.usbserial-5B090248161")
time.sleep(2) # 첫 연결 후 반드시 대기 (안 하면 -1 반환)
mc.power_on() # 서보 전원 켜기 (이거 안 하면 모터 안 움직임!)
time.sleep(1)
# 현재 관절 각도 읽기
print("현재 각도:", mc.get_angles())
# 모든 관절을 0도로 이동 (속도 30)
mc.send_angles([0, 0, 0, 0, 0, 0], 30)
time.sleep(3)
# Atom LED 색상 변경 (동작 확인용)
mc.set_color(0, 255, 0) # 초록색
print("LED 초록색으로 변경!")
# 그리퍼 테스트
mc.set_gripper_value(100, 50) # 열기
time.sleep(2)
mc.set_gripper_value(20, 50) # 닫기

주의사항 정리:
power_on()반드시 호출해야 모터가 움직인다- 첫 연결 후
time.sleep(2)필수 — 안 하면get_angles()가-1반환 - 관절 각도 범위는 -150 ~ 150도. 범위 밖 값을 보내면 pymycobot이 예외를 던진다
- pymycobot 4.0+ 기준으로
from pymycobot import MyCobot280을 사용. 예전from pymycobot.mycobot import MyCobot는 deprecated
② WiFi (WLAN) 연결 — 무선으로 로봇팔 제어
USB 케이블 없이 무선으로 교육용 로봇팔을 제어할 수 있으면 훨씬 편하다. myCobot 280 M5는 M5Stack의 ESP32 WiFi를 통해 무선 연결을 지원한다.
근데 처음에 M5Stack에서 Transponder > WLAN을 선택하면 이렇게 뜬다:

“WiFi Connect Failed”가 뜨는 이유는 SSID와 비밀번호가 설정되지 않아서다. WiFi 정보를 먼저 USB 모드에서 설정해야 한다.
Step 1: USB 모드에서 WiFi 정보 설정
# wifisetup.py — USB 모드에서 WiFi SSID/PW 설정
from pymycobot import MyCobot280
import time
mc = MyCobot280("/dev/tty.usbserial-5B090248161")
time.sleep(2)
# WiFi SSID와 비밀번호 설정
mc.set_ssid_pwd("너의SSID", "너의비밀번호")
time.sleep(3)
# 설정 확인
print("WiFi 설정:", mc.get_ssid_pwd())
중요: ESP32는 2.4GHz WiFi만 지원한다! 5GHz 네트워크에 연결하면 실패한다. 공유기 설정에서 2.4GHz 대역 SSID를 확인하자.
Step 2: WLAN 모드로 전환
USB에서 SSID/PW 설정이 끝나면 M5Stack에서 Transponder > WLAN을 다시 선택한다.

잠깐 기다리면…

M5Stack 화면에 “WIFI Connected”와 함께 IP 주소, Port(9000)가 표시되면 성공이다!
Step 3: Python에서 WiFi로 연결
# wifi_test.py — WiFi 무선 연결
from pymycobot import MyCobot280Socket
import time
# M5Stack 화면에 표시된 IP와 Port 입력
mc = MyCobot280Socket("192.168.0.24", 9000)
time.sleep(2)
print("WiFi 연결 성공!")
print("현재 각도:", mc.get_angles())
print("서보 상태:", mc.get_servo_status())
# LED 색상으로 연결 확인
mc.set_color(255, 255, 0) # 노란색
print("Atom LED 노란색으로 변경!")
USB와 달리 MyCobot280Socket 클래스를 사용한다는 게 포인트. 나머지 API(get_angles, send_angles, set_color 등)는 동일하다.
트러블슈팅: WiFi 연결은 됐는데 Python에서 접속이 안 되면 AP 격리(Client Isolation)를 의심하자. 공유기에서 AP 격리가 켜져 있으면 같은 네트워크에 있어도 기기 간 통신이 차단된다.
③ Bluetooth (BLE) 연결 — 진정한 무선
WiFi보다 더 가볍게 연결할 수 있는 BLE(Bluetooth Low Energy) 방식이다. 근데 솔직히 이 부분이 가장 삽질을 많이 했다.

M5Stack에서 Transponder > Bluetooth를 선택하면 “Bluetooth enabled”와 BLE MAC, UUID가 표시된다.
중요: BLE(Bluetooth Low Energy)라서 일반 블루투스 페어링 목록에 안 뜬다! 맥이나 윈도우 블루투스 설정에서 장치를 검색해도 안 보이는 게 정상이다. BLE 전용 라이브러리로 연결해야 한다.
그리고 한 가지 더 — pymycobot에는 MyCobot280 전용 BLE 클래스가 없다. 그래서 bleak 라이브러리로 직접 BLE 통신을 해야 한다.
pip install bleak
BLE 프로토콜 이해하기
myCobot 280 M5의 BLE는 Nordic UART Service (NUS)를 사용한다. pymycobot의 시리얼 프로토콜 패킷을 BLE UART로 직접 보내면 된다.
- TX (로봇→PC, Notify):
6E400003-B5A3-F393-E0A9-E50E24DCCA9E - RX (PC→로봇, Write):
6E400002-B5A3-F393-E0A9-E50E24DCCA9E
패킷 구조: FE FE [길이] [명령코드] [데이터...] FA
get_angles:fe fe 02 20 faset_color(R,G,B):fe fe 05 6a R G B fa
BLE 연결 코드 (전체)
# bt_test.py — BLE(Bluetooth Low Energy) 연결
import asyncio
from bleak import BleakScanner, BleakClient
DEVICE_NAME = "mycobot280m5ble"
UART_TX_UUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" # Notify (로봇→PC)
UART_RX_UUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" # Write (PC→로봇)
async def main():
# 1. BLE 장치 스캔
print("BLE 스캔 중...")
devices = await BleakScanner.discover(timeout=5)
target = None
for d in devices:
print(f" 발견: {d.name} ({d.address})")
if d.name and DEVICE_NAME in d.name:
target = d
if not target:
print("mycobot280m5ble 를 찾지 못했습니다.")
return
print(f"\n타겟 발견: {target.name} ({target.address})")
# 2. BLE 연결
async with BleakClient(target.address) as client:
print(f"BLE 연결 성공! (connected={client.is_connected})")
# 3. Notify 구독 (로봇 응답 수신)
def on_notify(sender, data):
print(f" ← 수신: {data.hex()}")
await client.start_notify(UART_TX_UUID, on_notify)
# 4. get_angles 명령 전송
cmd = bytes([0xFE, 0xFE, 0x02, 0x20, 0xFA])
print(f"→ get_angles 전송: {cmd.hex()}")
await client.write_gatt_char(UART_RX_UUID, cmd)
await asyncio.sleep(2)
# 5. LED 파란색으로 변경
cmd_led = bytes([0xFE, 0xFE, 0x05, 0x6A, 0x00, 0x00, 0xFF, 0xFA])
print(f"→ set_color(파란색) 전송: {cmd_led.hex()}")
await client.write_gatt_char(UART_RX_UUID, cmd_led)
await asyncio.sleep(1)
await client.stop_notify(UART_TX_UUID)
print("BLE 테스트 완료!")
asyncio.run(main())
코드가 좀 길지만, 핵심은 간단하다: BLE로 연결 → pymycobot 프로토콜 패킷을 직접 만들어서 보내기. get_angles와 set_color 모두 BLE 경유로 정상 동작하는 걸 확인했다.
연결 방식 비교
| 항목 | USB | WiFi | BLE |
|---|---|---|---|
| 설정 난이도 | 쉬움 | 보통 | 어려움 |
| 응답 속도 | 빠름 | 보통 | 느림 |
| 유선/무선 | 유선 | 무선 | 무선 |
| 범위 | 케이블 길이 | WiFi 범위 | ~10m |
| Python 클래스 | MyCobot280 | MyCobot280Socket | bleak (직접 구현) |
| 추천 용도 | 개발/디버깅 | 일상 사용 | 실험/IoT |
개인적으로 개발할 때는 USB, 실제로 쓸 때는 WiFi가 가장 편하더라고요. BLE는 pymycobot 공식 지원이 없어서 직접 패킷을 만들어야 하는 게 좀 번거롭지만, 가볍게 연결하기에는 좋다.
동작 확인된 API 목록
이번에 3가지 연결 방식으로 실제 테스트해본 pymycobot API 목록이다. 교육용 로봇팔 입문할 때 참고하면 좋을 것 같다.
| API | 기능 | USB | WiFi | BLE |
|---|---|---|---|---|
get_angles() | 현재 6축 관절 각도 읽기 | O | O | O |
send_angles() | 목표 각도로 이동 | O | O | – |
send_angle() | 단일 관절 이동 | O | O | – |
set_color(r,g,b) | Atom LED 색상 변경 | O | O | O |
power_on() | 서보 모터 전원 ON | O | O | – |
release_all_servos() | 서보 잠금 해제 (자유 이동) | O | O | – |
set_gripper_value() | 그리퍼 열기/닫기 | O | O | – |
get_servo_voltages() | 서보 전압 확인 | O | O | – |
get_servo_status() | 서보 상태 확인 | O | O | – |
set_ssid_pwd() | WiFi SSID/PW 설정 | O | – | – |
BLE는 직접 패킷을 만들어서 보내는 방식이라 아직 get_angles와 set_color만 테스트했다. 패킷 구조만 맞추면 나머지 명령도 보낼 수 있긴 하다.
트러블슈팅 총정리
삽질했던 내용을 정리해뒀다. 교육용 로봇 처음 세팅할 때 대부분 이 문제들을 만나게 될 거다.
| 증상 | 원인 | 해결 |
|---|---|---|
| 시리얼 포트가 안 잡힘 | 충전 전용 USB 케이블 | 데이터 통신 가능한 케이블로 교체 |
get_angles()가 -1 반환 | M5Stack이 USB UART 모드가 아님 | Transponder > USB UART 선택 |
get_angles()가 -1 반환 (2) | 연결 직후 바로 호출 | time.sleep(2) 추가 |
| 모터가 안 움직임 | power_on() 미호출 | 반드시 power_on() 먼저 실행 |
send_angles() 예외 발생 | 관절 범위(-150~150) 초과 | 범위 내 값으로 수정 |
| WiFi Connect Failed | SSID/PW 미설정 | USB 모드에서 set_ssid_pwd() 실행 |
| WiFi 연결 실패 (2) | 5GHz WiFi에 연결 시도 | 2.4GHz SSID로 변경 |
| WiFi 됐는데 Python 접속 불가 | AP 격리(Client Isolation) | 공유기에서 AP 격리 해제 |
| BLE 장치가 블루투스 목록에 안 뜸 | BLE는 일반 페어링 불가 | bleak 등 BLE 전용 라이브러리 사용 |
| pymycobot import 에러 | pymycobot 4.0+ API 변경 | from pymycobot import MyCobot280 |
마무리 & 앞으로의 방향

이번 글에서는 교육용 로봇팔 myCobot 280 M5를 Python으로 연결하는 3가지 방법을 정리했다. USB 시리얼, WiFi, BLE 전부 동작 확인 완료.
사실 이 로봇팔로 할 수 있는 게 진짜 무궁무진하다. 연결만 해도 이렇게 많은데, 여기서부터 뻗어나갈 수 있는 방향이 엄청 많다:
- 카메라 + 컴퓨터 비전 — OpenCV로 물체 인식, 색상 트래킹, 위치 추정
- 티칭 모드 — 사람이 직접 로봇팔을 움직여서 동작을 기록하고 재생
- ROS2 연동 — 로봇 운영체제와 연결해서 더 복잡한 모션 플래닝
- 강화학습 — 시뮬레이션에서 학습한 정책을 실제 로봇에 적용 (Sim-to-Real)
- LeRobot / VLA 모델 — HuggingFace LeRobot, SmolVLA 등으로 자연어 로봇 제어
- 멀티 로봇 협업 — 여러 대의 로봇팔을 동시에 제어
- 3D 프린팅 그리퍼 — 용도별 커스텀 그리퍼 제작
- 디지털 트윈 — 시뮬레이션 환경에서 로봇을 미리 테스트
교육용 로봇이라고 해서 할 수 있는 게 제한적일 거라 생각했는데, 오히려 이 정도 스펙이면 웬만한 연구용 프로토타이핑도 충분히 가능한 것 같다. 6축에 그리퍼까지 있고, USB/WiFi/BLE 3가지 연결까지 되니까.
다음 글에서 뭘 다룰지는 아직 정확히 안 정했는데, 하나씩 진행하면서 공유할 예정이다. 관심 있으면 지켜봐주세요!
myCobot 280 완전 정복 시리즈
#1 — USB, WiFi, Bluetooth 3가지 연결 방법 (현재 글)
멋있어요!
USB, WiFi, Bluetooth 연결 방법 정리 정말 유용하네요! 초보자도 쉽게 따라 할 수 있게 설명해주셔서 감사합니다.