Basic Control

This tutorial covers the fundamentals of controlling your Mini-Arm.

Connecting to the Robot

from mini_arm import MiniArm

# Create connection (auto-detects port)
arm = MiniArm()
arm.connect()

# Verify connection
if arm.is_connected:
    print("✓ Connected to Mini-Arm")
    print(f"  Firmware: {arm.firmware_version}")
    print(f"  Port: {arm.port}")

Joint Space Control

Control individual joints by index (0-5) or name:

# Move by joint index
arm.set_joint(0, 45)   # Base to 45°
arm.set_joint(1, -30)  # Shoulder to -30°

# Move by joint name
arm.set_joint("base", 45)
arm.set_joint("shoulder", -30)

# Move all joints simultaneously
joint_angles = [0, -45, 90, 0, 45, 0]
arm.set_joints(joint_angles)

# Get current joint positions
current = arm.get_joints()
print(f"Current angles: {current}")

Joint Speed Control

# Set global speed (percentage of max)
arm.set_speed(50)  # 50% speed

# Set speed for specific joint
arm.set_joint_speed(0, 25)  # Base at 25% speed

# Move with custom duration
arm.set_joint(0, 90, duration=2.0)  # Take 2 seconds

Cartesian Control (IK)

Move the end-effector to XYZ positions using the onboard inverse kinematics solver:

# Move to position (mm)
arm.move_to(x=100, y=0, z=150)

# Move with orientation (degrees)
arm.move_to(
    x=100, y=50, z=100,
    roll=0, pitch=90, yaw=0
)

# Relative movement
arm.move_relative(dx=10, dy=0, dz=-20)

# Get current pose
pose = arm.get_pose()
print(f"Position: ({pose.x}, {pose.y}, {pose.z})")
print(f"Orientation: ({pose.roll}, {pose.pitch}, {pose.yaw})")

Gripper Operations

# Simple open/close
arm.gripper_open()
arm.gripper_close()

# Partial opening (0-100%)
arm.gripper_set(50)  # Half open

# Check gripper state
print(f"Gripper position: {arm.gripper_position}%")

Homing

# Move all joints to home (0°)
arm.home()

# Home individual joint
arm.home_joint(0)

# Set custom home position
arm.set_home_position([0, -45, 90, 0, 45, 0])
arm.home()  # Now goes to custom position

Complete Example

from mini_arm import MiniArm
import time

def main():
    # Connect
    arm = MiniArm()
    arm.connect()

    try:
        # Home the robot
        print("Homing...")
        arm.home()
        time.sleep(1)

        # Pick and place demo
        print("Moving to pick position...")
        arm.move_to(x=100, y=50, z=50)
        arm.gripper_open()

        print("Lowering...")
        arm.move_to(x=100, y=50, z=10)
        arm.gripper_close()

        print("Lifting...")
        arm.move_to(x=100, y=50, z=100)

        print("Moving to place position...")
        arm.move_to(x=-100, y=50, z=100)

        print("Placing...")
        arm.move_to(x=-100, y=50, z=10)
        arm.gripper_open()

        print("Done!")
        arm.home()

    finally:
        arm.disconnect()

if __name__ == "__main__":
    main()

Next Steps