embeded/robot

mycobot 280 pi / python

구차니 2026. 6. 29. 18:09

atom 이랑 팔에 힘빼는거(!) 테스트

 

from pymycobot.mycobot import MyCobot
from pymycobot import PI_PORT, PI_BAUD
mc = MyCobot(PI_PORT, PI_BAUD)
mc.set_color(0,0,255)
mc.get_digital_input(39) # atom 누르지 않고
1
mc.get_digital_input(39) # atom 누르고
0
mc.power_off() # atom off
mc.get_digital_input(39) # atom 안 읽힘
mc.get_digital_input(39)
mc.power_on() # atom on
mc.get_digital_input(39) # atom 누르지 않고
1
mc.get_digital_input(39) # atom 누르고
0
mc.is_power_on()
1
mc.power_off()
mc.is_power_on()
0
mc.power_on()


mc.power_off()
mc.is_all_servo_enable()
mc.power_on()
mc.is_all_servo_enable()

 

power_on 은 atom(LED, 버튼 일체형) 통신 뿐만 아니라

servo 전원 on/off도 같이 엮인다.

1.1 power_on()     Function: Atom open communication (default open)
1.2 power_off()     Function: Atom turn off communication
1.3 is_power_on() Function: judge whether robot arms is powered on or not

 

서보(관절별) 잠그고, 푸는 명령

2.11 release_servo(servo_id) Function: release a servo
5.4 focus_servo(servo_id)    Function: power on designated servo

 

gpt 보고 짜달라니 잘 짜준다

#!/usr/bin/env python3

import curses
import time

from pymycobot.mycobot import MyCobot
from pymycobot import PI_PORT, PI_BAUD

# -------------------------------------------------
# myCobot
# -------------------------------------------------
mc = MyCobot(PI_PORT, PI_BAUD)

SPEED = 40
STEP = 2.0        # mm
ROT_STEP = 2.0    # degree

released = True

mc.power_on()
time.sleep(1)

coords = mc.get_coords()

if coords is None:
    print("Cannot read robot coordinates.")
    exit(1)


# -------------------------------------------------
def draw_screen(stdscr, angles):

    stdscr.clear()

    stdscr.addstr(0, 0, "myCobot 280 Jog Controller")

    stdscr.addstr(2, 0, "A/D : X -/+")
    stdscr.addstr(3, 0, "W/S : Y +/-")
    stdscr.addstr(4, 0, "R/F : Z +/-")
    stdscr.addstr(5, 0, "Q/E : RX -/+")
    stdscr.addstr(6, 0, "ESC : Exit")

    stdscr.addstr(8, 0, f"Servo : {'LOCK' if released else 'RELEASE'}")

    stdscr.addstr(
        10, 0,
        f"X={coords[0]:7.2f}  "
        f"Y={coords[1]:7.2f}  "
        f"Z={coords[2]:7.2f}"
    )

    stdscr.addstr(
        11, 0,
        f"RX={coords[3]:7.2f}  "
        f"RY={coords[4]:7.2f}  "
        f"RZ={coords[5]:7.2f}"
    )

    if angles is not None:
        stdscr.addstr(13, 0, "Joint Angles")

        for i, a in enumerate(angles):
            stdscr.addstr(14+i, 0, f"J{i+1}: {a:7.2f}")

    stdscr.refresh()


# -------------------------------------------------
def main(stdscr):

    global coords
    global released

    curses.cbreak()
    curses.noecho()

    stdscr.nodelay(True)
    stdscr.keypad(True)

    angles = mc.get_angles()

    draw_screen(stdscr, angles)

    while True:

        # ------------------------------------------
        # Atom Button
        # ------------------------------------------

        button = mc.get_digital_input(39)

        if button == 0 and released:

            released = False

            mc.release_all_servos()

            draw_screen(stdscr, angles)

        elif button == 1 and not released:

            released = True

            mc.power_on()

            time.sleep(0.5)

            # Servo를 손으로 움직였을 수 있으므로
            # 이때만 실제 좌표를 다시 읽음
            new_coords = mc.get_coords()
            if new_coords is not None:
                coords = new_coords

            angles = mc.get_angles()

            draw_screen(stdscr, angles)

        key = stdscr.getch()

        if key == 27:
            break

        moved = False

        if released:

            if key == ord('a'):
                coords[0] -= STEP
                moved = True

            elif key == ord('d'):
                coords[0] += STEP
                moved = True

            elif key == ord('w'):
                coords[1] += STEP
                moved = True

            elif key == ord('s'):
                coords[1] -= STEP
                moved = True

            elif key == ord('r'):
                coords[2] += STEP
                moved = True

            elif key == ord('f'):
                coords[2] -= STEP
                moved = True

            elif key == ord('q'):
                coords[3] -= ROT_STEP
                moved = True

            elif key == ord('e'):
                coords[3] += ROT_STEP
                moved = True

            if moved:
                mc.send_coords(coords, SPEED, 1)
                draw_screen(stdscr, angles)

        time.sleep(0.02)


# -------------------------------------------------
if __name__ == "__main__":
    curses.wrapper(main)

 

[링크 : https://docs.elephantrobotics.com/docs/gitbook-en/7-ApplicationBasePython/7.2_API.html]