RobotArm OpenMV 机械臂 — 基础教程
星瞳科技OpenMV视频教程 - RobotArm机械臂基础接口教程!
1. 简介
本教程介绍如何为机械臂通电、连接、初始化以及常用指令的示例与常见故障排查方法。
项目代码库:OpenMV-Robot-Arm-Project

机械臂整体结构和坐标示意
机械臂遵循空间直角坐标系,坐标原点为三轴的相交点
2. 快速上手
- 使用 12VDC 电源线连接机械臂进行供电,也可以使用 12V 锂电池。
- 打开机械臂的开关。
- 连接 OpenMV 与 PC。
- 将
Robot_arm.py模块文件放入 OpenMV 的 SD 卡目录中。

打开 OpenMV IDE。
导入机械臂模块:
import Robot_arm as rb # 机械臂控制模块
- 初始化机械臂端口,配置串口 3 为机械臂通讯串口:
robot = rb.Robot(3) # 创建机械臂对象,串口3用于通信
- 运行复位功能:
robot.home_setting() # 机械臂复位,若异常需重启机械臂后再次复位
- 获取当前末端执行器的 XYZ 坐标:
a = robot.get_xyz_point() # 获取机械臂当前XYZE坐标
print(f"X:{int(a[0])} Y:{int(a[1])} Z:{int(a[2])}") # 打印坐标信息
- 设置末端执行器的坐标,机械臂将移动到设定坐标:
robot.set_xyz_point(0, 174, 222, 0, 0) # 设置XYZE坐标,坐标系为平面直角坐标系
- 使用舵机指令控制夹具张合角度:
robot.Servo(46) # 控制夹具
- 使用继电器控制扩展电路开合:
robot.relay(True) # 控制机械臂主板继电器
- 获取限位开关状态:
robot.get_key_val() # 获取限位开关状态
- LCD 屏幕示例
import display # 显示屏驱动模块
lcd = display.SPIDisplay() # 创建SPI显示屏对象
img.draw_string(0, 0, "Hello Robot!", color=(255, 0, 0)) # 在图像上显示欢迎语
lcd.write(img)
- 扩展板驱动示例
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 号按键,但识别出来为 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号按键可以正常检测
- 运动指令无反应
如果运行下列函数没有反应:
home_setting()
get_xyz_point()
get_key_val()
set_xyz_point()
relay()
Servo()
请按顺序检查:
- 硬件接触:检查 OpenMV 与扩展板的接触是否正常,建议先焊接插针再插扩展板以避免接触不良
- 串口连接:检查扩展板与机械臂 ESP32 主板之间的串口线是否断开或损坏
- 硬件故障:检查 OpenMV、扩展板、ESP32 主板是否损坏
串口通讯:确认串口通讯参数与线路正常
LCD 屏幕显示问题
调用 lcd.write 但没有画面时,检查:
- OpenMV 与扩展板之间的接触是否良好
- FPC 排线是否损坏
- 扩展板或 LCD 按键扩展板是否损坏
画面异常(乱码、撕裂等):尝试断开所有电源后重启。