편찌

myCobot 280 M5 완전 정복 #1 — USB, WiFi, Bluetooth 3가지 연결 방법 총정리 (Python)

myCobot 280 M5 교육용 로봇팔 셋업 전체 모습
myCobot 280 M5 + 맥북으로 로봇팔 제어하는 셋업

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포트 확인 명령어예시
macOSls /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를 선택하면 된다.

myCobot 280 M5 Python 코딩 맥북 터미널
USB로 연결한 뒤 Python으로 제어하는 모습
# 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)   # 닫기
myCobot 280 Atom LED 초록색 Python set_color 동작 확인
set_color(0, 255, 0) 실행 — Atom LED가 초록색으로 바뀐 모습

주의사항 정리:

  • 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을 선택하면 이렇게 뜬다:

myCobot 280 M5Stack WiFi 연결 실패 화면 SSID 미설정
WiFi Connect Failed — SSID가 설정되지 않은 상태

“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을 다시 선택한다.

myCobot 280 WiFi 연결 시도 중 Connecting
WiFi Connecting… 연결 시도 중

잠깐 기다리면…

myCobot 280 WiFi 연결 성공 IP Port 9000 표시
WIFI Connected! IP 주소와 Port 9000이 표시된다

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) 방식이다. 근데 솔직히 이 부분이 가장 삽질을 많이 했다.

myCobot 280 M5Stack Bluetooth BLE 모드 UUID 표시
Bluetooth enabled — BLE MAC 주소와 UUID가 표시된다

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 fa
  • set_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_anglesset_color 모두 BLE 경유로 정상 동작하는 걸 확인했다.

연결 방식 비교

항목USBWiFiBLE
설정 난이도쉬움보통어려움
응답 속도빠름보통느림
유선/무선유선무선무선
범위케이블 길이WiFi 범위~10m
Python 클래스MyCobot280MyCobot280Socketbleak (직접 구현)
추천 용도개발/디버깅일상 사용실험/IoT

개인적으로 개발할 때는 USB, 실제로 쓸 때는 WiFi가 가장 편하더라고요. BLE는 pymycobot 공식 지원이 없어서 직접 패킷을 만들어야 하는 게 좀 번거롭지만, 가볍게 연결하기에는 좋다.

동작 확인된 API 목록

이번에 3가지 연결 방식으로 실제 테스트해본 pymycobot API 목록이다. 교육용 로봇팔 입문할 때 참고하면 좋을 것 같다.

API기능USBWiFiBLE
get_angles()현재 6축 관절 각도 읽기OOO
send_angles()목표 각도로 이동OO
send_angle()단일 관절 이동OO
set_color(r,g,b)Atom LED 색상 변경OOO
power_on()서보 모터 전원 ONOO
release_all_servos()서보 잠금 해제 (자유 이동)OO
set_gripper_value()그리퍼 열기/닫기OO
get_servo_voltages()서보 전압 확인OO
get_servo_status()서보 상태 확인OO
set_ssid_pwd()WiFi SSID/PW 설정O

BLE는 직접 패킷을 만들어서 보내는 방식이라 아직 get_anglesset_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 FailedSSID/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 교육용 로봇팔 전체 모습
myCobot 280 M5 — 6축 교육용 로봇팔

이번 글에서는 교육용 로봇팔 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가지 연결 방법 (현재 글)

#2 — Docker로 ROS2 환경 구축하기 (Windows/macOS/Linux)

댓글 2개

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다