RobotArm OpenMV 机械臂 — 基础教程

星瞳科技OpenMV视频教程 - RobotArm机械臂基础接口教程!

1. 简介

本教程介绍如何为机械臂通电、连接、初始化以及常用指令的示例与常见故障排查方法。

项目代码库:OpenMV-Robot-Arm-Project

机械臂整体结构和坐标示意

机械臂遵循空间直角坐标系,坐标原点为三轴的相交点

2. 快速上手

  1. 使用 12VDC 电源线连接机械臂进行供电,也可以使用 12V 锂电池。
  2. 打开机械臂的开关。
  3. 连接 OpenMV 与 PC。
  4. Robot_arm.py 模块文件放入 OpenMV 的 SD 卡目录中。

  1. 打开 OpenMV IDE。

  2. 导入机械臂模块:

import Robot_arm as rb  # 机械臂控制模块
  1. 初始化机械臂端口,配置串口 3 为机械臂通讯串口:
robot = rb.Robot(3)  # 创建机械臂对象,串口3用于通信
  1. 运行复位功能:
robot.home_setting()  # 机械臂复位,若异常需重启机械臂后再次复位
  1. 获取当前末端执行器的 XYZ 坐标:
a = robot.get_xyz_point()  # 获取机械臂当前XYZE坐标
print(f"X:{int(a[0])} Y:{int(a[1])} Z:{int(a[2])}")  # 打印坐标信息
  1. 设置末端执行器的坐标,机械臂将移动到设定坐标:
robot.set_xyz_point(0, 174, 222, 0, 0)  # 设置XYZE坐标,坐标系为平面直角坐标系
  1. 使用舵机指令控制夹具张合角度:
robot.Servo(46)  # 控制夹具
  1. 使用继电器控制扩展电路开合:
robot.relay(True)  # 控制机械臂主板继电器
  1. 获取限位开关状态:
robot.get_key_val()  # 获取限位开关状态
  1. LCD 屏幕示例
import display                # 显示屏驱动模块
lcd = display.SPIDisplay()    # 创建SPI显示屏对象
img.draw_string(0, 0, "Hello Robot!", color=(255, 0, 0))  # 在图像上显示欢迎语
lcd.write(img)
  1. 扩展板驱动示例
from pyb import Pin
p_out = Pin('P1', Pin.OUT_PP)
p_out.high()
time.sleep_ms(1000)
p_out.low()

使用此程序可以控制 OpenMV 机械臂扩展板上的驱动电路,可以带动 5V 供电的电磁铁、激光笔等。

3. 常见问题与故障排查

  1. 按键识别不准

现象:如按下 1 号按键,但识别出来为 2 号按键。

原因:按键检测采用 ADC 采样(模拟),采样抖动较大,容易产生误检测。

解决方法:在 robot_arm.py 中调整按键 ad 值的判断范围,以下为示例实现:

def ad_key_control(self):
    """
    通过 ADC 模拟按键控制机械臂动作,仅保留短按(已移除长按功能)
    """
    ad_list = []
    for _ in range(50):
        if H7:
            ad_list.append((self.adc.read() * 3.3) / 4095)
        else:
            ad_list.append((self.adc.read_u16() * 3.3) / 65535)
        time.sleep_ms(1)
    ad_list.sort()
    filtered = ad_list[1:-1]
    mid_idx = len(filtered) // 2
    if len(filtered) % 2 == 0:
        ad = round((filtered[mid_idx - 1] + filtered[mid_idx]) / 2, 2)
    else:
        ad = round(filtered[mid_idx], 2)

    a = 0
    # print(ad)
    # 判断动作类型(短按)
    if 0.35 > ad > 0.15:
        a = 9
        time.sleep_ms(200)

    elif ad < 0.1:
        a = 3
        time.sleep_ms(200)

    elif 1.6 > ad > 1.4:
        a = 4
        time.sleep_ms(200)

    elif 1.3 > ad > 1:
        a = 6
        time.sleep_ms(200)

    elif 0.6 > ad > 0.4:
        a = 2
        time.sleep_ms(200)

    elif 1 > ad > 0.7:
        a = 8
        time.sleep_ms(200)

    elif 2 > ad > 1.7:
        a = 1
        time.sleep_ms(200)

    elif 2.3 > ad > 2.10:
        a = 7
        time.sleep_ms(200)

    elif 2.6 > ad > 2.45:
        a = 5
        time.sleep_ms(200)

    return a

修改举例

假如当前5号按键的ad范围为:

    elif 2.7 > ad > 2.6:
        a = 5
        time.sleep_ms(200)

检测出现问题,即当按下5号按键时,判断为其余按键时,将

#print(ad)

这段代码取消注释,保存后运行程序

按下5号按键,可以查看到当前5号按键按下时的ad范围:

当前5号按键的ad范围大部分位于2.4到2.6之间,不符合代码中2.7 > ad > 2.6的范围

此时,我们根据测试到的数值,重新修改5号按键的范围即可:

    elif 2.6 > ad > 2.45:
        a = 5
        time.sleep_ms(200)

更改代码后保存,按下5号按键可以正常检测

  1. 运动指令无反应

如果运行下列函数没有反应:

home_setting()
get_xyz_point()
get_key_val()
set_xyz_point()
relay()
Servo()

请按顺序检查:

  • 硬件接触:检查 OpenMV 与扩展板的接触是否正常,建议先焊接插针再插扩展板以避免接触不良
  • 串口连接:检查扩展板与机械臂 ESP32 主板之间的串口线是否断开或损坏
  • 硬件故障:检查 OpenMV、扩展板、ESP32 主板是否损坏
  • 串口通讯:确认串口通讯参数与线路正常

  • LCD 屏幕显示问题

调用 lcd.write 但没有画面时,检查:

  • OpenMV 与扩展板之间的接触是否良好
  • FPC 排线是否损坏
  • 扩展板或 LCD 按键扩展板是否损坏

画面异常(乱码、撕裂等):尝试断开所有电源后重启。

results matching ""

    No results matching ""