一、项目介绍
纠偏仪可广泛应用于工业自动化生产线中的物料输送、印刷机械、电子设备组装等领域,提高生产效率和产品质量。同时,也可适用于科研实验中对微小位移和角度变化的精确测量。
随着工业自动化和精密测量技术的发展,对于高精度、高可靠性的纠偏设备需求日益增长。传统纠偏装置依赖人工调整,效率低且精度不足。本项目旨在设计一款基于TMF8821传感器的纠偏仪,以解决传统纠偏仪在精度、响应速度和适应性方面的不足。TMF8821作为一款高性能的直接飞行时间(dToF)传感器,具有高精度测距、多区域配置、低功耗等优势,非常适合应用于纠偏系统中。
1.1 硬件介绍
本项目以欧司朗TMF8821激光测距芯片为核心,结合嵌入式系统与机电控制模块,构建了一套高精度自动纠偏系统。主要硬件组件包括:
- TMF8821传感器:一款高性能的直接飞行时间(dToF)测距传感器,由ams OSRAM公司推出。它采用了先进的激光散斑测距技术,具有高精度、高分辨率和快速响应的特点。该传感器能够在不同光照条件下稳定工作,测量范围可达数米,且功耗较低,非常适合应用于各种工业和科研领域的近距离测量场景。采用直接飞行时间(dToF)技术,测量范围为2 cm至250 cm,支持多区域检测,暗环境最大测距可达2.5米,具备高精度和抗干扰能力。
- TMF8821 dToF传感器模块:是基于TMF8821传感器设计的一款直接飞行时间(dToF)传感器,与RP2040游戏机管脚匹配,插上直接可以使用,模块侧面预留了扩展接口,可以自由焊接/调试/抓取数据。
- 主控单元:RP2040 Game Kit是基于树莓派RP2040的嵌入式系统学习平台,USB Type-C供电,采用RP2040作为主控,支持MicroPython、C/C++编程,性能强大。
RP2040 Game Kit 和 TMF8821 dToF传感器模块 如下图所示:
合体照正面和背面
1.2 功能概览
- 距离测量:利用TMF8821传感器对物体与传感器之间的距离进行实时测量,并将测量数据传输给主控芯片,精度达毫米级。
- 实时偏差检测:主控芯片根据预设的纠偏算法,结合传感器测量的距离数据,计算出物体在水平或垂直方向上的偏差角度。
- 多模式操作:支持手动调试与自动纠偏模式,通过LCD界面显示实时数据。
- 模块化设计:传感器与主控单元可快速拆卸维护,提升系统灵活性。
1.3 设计思路
本项目的设计思路是基于TMF8821传感器的高精度测距特性,结合主控芯片的强大运算能力。通过传感器采集距离数据,主控芯片进行数据过滤和处理。结合纠偏算法运算,实时计算出垂直距离和偏差角度,通过LCD实时显示。并且支持扩展输出控制信号给执行机构,执行机构根据控制信号调整物体的位置,从而实现自动纠偏的目的。为了提高系统的稳定性和可靠性,在设计过程中还考虑了误差补偿、抗干扰等技术措施。
二、功能实现
2.1 软件流程图
2.2 实现过程
2.2.1 硬件驱动开发
- 基于MicroPython注册I²C总线设备,定义引脚并初始化通信协议。
i2c=machine.I2C(0,sda=Pin(16),scl=Pin(17),freq=400000)
tmf8821_inst = TMF8821(i2c, en_pin=21, int_pin=22)
- 实现TMF8821的读写函数,包括寄存器配置、数据采集及中断处理,确保传感器数据稳定传输。
def i2cTxRx(self, device_addr: int, tx: list, rx_size: int) -> bytearray:
self.i2c.writeto(device_addr, bytes(tx))
if rx_size == 0:
return bytearray(0)
data_buffer = bytearray(rx_size)
self.i2c.readfrom_into(device_addr, data_buffer)
return data_buffer
def i2cTx(self, device_addr: int, tx: list) -> int:
try:
self.i2c.writeto(device_addr, bytes(tx))
return 0 # Return 0 indicating success
except OSError as e:
print("I2C error:", e)
return -1 # Indicate an error occurred
2.2.2 传感器数据处理
2.2.2.1 解析TMF8821的测距结果,过滤噪声数据,通过滑动窗口算法平滑输出。
class RecursiveAverageFilter:
def __init__(self, window_size):
self.window_size = window_size
self.values = []
self.sum = 0
def update(self, new_value):
if len(self.values) >= self.window_size:
# Remove the oldest value from the sum and the list
oldest_value = self.values.pop(0)
self.sum -= oldest_value
# Add the new value to the list and update the sum
self.values.append(new_value)
self.sum += new_value
# Calculate the average
average = self.sum / len(self.values)
return average
leftFilter = RecursiveAverageFilter(window_size=WINDOW_SIZE)
2.2.2.2 根据预设阈值判断偏差方向(左偏/右偏),计算偏差量。
根据 TMF8821 传感器数据手册可知, 使用 spad_map_id = 1
模式,得到 3*3 的数据,视场角为 33°x32°。因此,可以将面与面的夹角简化为点与线的夹角,通过分别计算 x、y 轴的夹角以及两个对角之间的夹角来获得点与平面的夹角,因而传感器这个点的接收和发射角相校于传感器所在的平面是固定的。因此计算出来的夹角数据也可以看作是平面与平面的夹角。
以上分析,可以简化点与线的垂直距离和点与线的垂点夹角计算。假设,传感器所在位置为 P 点,传感器采集到的 X 轴数据为到平面直线L的 A、B、C 三点的距离。使用三角学中的正弦定理和余弦定理。下面是公式推导
- 计算AB的长度
使用余弦定理,在△APB中:
求得AB的距离( d )。 - 建立坐标系求解PO
设A为原点(0,0),B为(d,0),P的坐标为(x,y),PO的长度( h = y )。根据PA和PB的几何关系:
消去( y^2 )得:
代入求得 ,即PO的长度。 - 计算角APO
角APO的顶点为P,利用向量点积公式:
接下来根据公式推导实现算法
def calculate_po_and_angle(PA, PB, angle_APB_deg):
angle_APB = math.radians(angle_APB_deg)
# 计算AB的长度d
d_squared = PA**2 + PB**2 - 2 * PA * PB * math.cos(angle_APB)
d = math.sqrt(d_squared)
# 计算x坐标
x = (PA**2 - PB**2 + d**2) / (2 * d)
# 计算PO长度(y坐标)
y = math.sqrt(PA**2 - x**2)
# 计算角APO的角度
theta_rad = math.acos(y / PA)
theta_deg = math.degrees(theta_rad)
return y, theta_deg
2.2.3 人机交互实现
- LCD显示实时距离、偏差状态及系统模式。
# 绘制偏差参考线
display.line(120, 170, xA, 55, st7789.RED)
display.line(120, 170, xB, 55, st7789.RED)
display.line(120, 170, xC, 55, st7789.RED)
display.line(120, 170, xO, 55, st7789.GREEN)
# 展示实时距离数据与偏差角度
display.text(font2, "{:03d}mm".format(round(d)), 40, 200, st7789.GREEN)
display.text(font2, "{:03d}".format(xTheta), 185, 200, st7789.RED)
三、功能展示
3.1 距离测量功能展示
在实际测试环境中,将纠偏仪放置在距离物体不同位置处,通过观察系统显示屏或上位机软件界面上显示的距离数据,可以直观地看到TMF8821传感器对物体距离的实时测量结果。随着物体与传感器之间距离的变化,显示屏上的数据也会相应地发生变化,证明了传感器能够准确地测量物体的距离。
3.2 纠偏功能展示
启动纠偏仪后,故意使物体在水平或垂直方向上偏离设定的基准位置一定角度。此时,可以在显示屏上看到参考线位置的偏移与角度变化。
四、总结
遇到的问题
- TMF8821 传感器的视场角为 33°x32°,当偏差角度过大时,容易使测得的数据不在一个平面上而导致数据失真。这种情况只能减小距离来保证测量结果数据在同一平面上,确认计算结果的准确性。
- 一开始测试时,想通过卡尺来模量测试结果的准确定,结果发现在小距离的情况下偏差较大。仔细阅读数据手册方才得知TMF8821 测量有效距离为 2cm ~ 400cm。因此,在小距离测试的情况下需要在获取到的数据基础上减去一定阈值。
心得体会
通过实际测试和验证,证明该纠偏仪能够满足预期的功能要求,具有良好的应用前景。当然,在项目过程中也遇到了一些问题和挑战,如传感器数据的误差处理、执行机构的精度校准等,但通过不断地探索和尝试,最终都得到了较好的解决。未来,可以进一步优化纠偏算法、探索AI算法(如神经网络)与纠偏系统的融合,提高系统的响应速度和稳定性,以适应更加复杂和严格的应用场景需求。
五、参考资料
- https://github.com/ams-OSRAM/tmf8820_21_28_driver_arduino
- https://github.com/ams-OSRAM/tmf8820_21_28_driver_python
- https://docs.micropython.org/en/latest/index.html
- https://www.eetree.cn/platform/3616
- https://blog.csdn.net/qq_42679415/article/details/136740895
- https://gitee.com/eetree-git/RP2040_Game_Kit