一、项目简介
本项目基于艾迈斯欧司朗TMF8821多区域直接飞行时间(dToF)传感器,结合Raspberry Pi RP2040微控制器平台,构建了一套角度系统。系统通过分析传感器输出的多区域测距数据中的部分数据,实时计算被测平面与传感器模块之间的空间夹角及最小垂直距离,实现了非接触式角度测量功能。通过选取特定检测区域数据构建几何模型,结合余弦定理与三角函数关系,实现平面参数的快速解算。
二、硬件组成
1、TMF8821传感器模块
- 多区域dToF传感器(支持3x3、4x4区域模式)
- 940nm VCSEL光源,Class 1人眼安全
- 最大检测距离5米,±3%精度
- I2C数字接口(默认地址0x41)
2、RP2040主控平台
- Raspberry Pi官方双核ARM Cortex-M0+处理器
- 133MHz主频,264KB SRAM
- 支持MicroPython固件开发
- 集成硬件I2C、SPI、UART接口
- LCD显示屏(240x240分辨率)
3、辅助硬件
传感器固定支架
三、硬件框图
本次活动提供了主控平台和传感器。
四、设计思路
本项目主要使用TMF8821传感器模块进行多区域数据采集,取其中中心区域长度数据构建成平面几何结构(三角形),一般采集出的数据为3*3数据,其中第5个数据为中心数据,其与传感器处于垂直状态,然后通过余弦定理实现第三个边的测量,并再次通过余弦定理计算相关角度,基本原理如下:
夹角的测算:
我们可以在tof数据中得知A和B的长度,视场角师傅定的所以c的角度就是视场角的一般,根据余弦定理:
C*C = A*A+B*B-2*A*B*cos(c);
可以得到C的长度,同样通过余弦定理可以得到a的角度,在通过直角三角形得到目标夹角的大小(90-a)。
最小距离的测算:
实际上就是上图的H,通过直角三角形,知道a的角度(或者夹角90-a)以及B的长度通过,正弦或余弦公式计算既可以:H=cos(90-a)*B。
五、软件流程
六、关键代码介绍
本次的开发设计主要代码包括传感器驱动和平面算法两个部分。
传感器驱动
class Tmf8821Utility(Tmf8821App):
def __init__(self, ic_com: I2C_com):
super().__init__(ic_com)
def open(self, i2c_settings: I2C_Settings = I2C_Settings()):
return super().open(i2c_settings)
def init_bootloader_check(self):
print("Started Bootloader check")
self.enable()
if not self.isAppRunning():
print("Image not found. Initiate Image Download")
self.downloadAndStartApp()
print("Application {} started".format(self.getAppId()))
def measure_frame(self, number_of_frames: int = 1):
frames = list()
status = self.startMeasure()
if status != Tmf8821Device.Status.OK:
return
read_frames = 0
while read_frames < number_of_frames:
if self.readAndClearInt(self.TMF8X2X_APP_I2C_RESULT_IRQ_MASK):
read_frames = read_frames + 1
frame = self.readResult()
frames.append(frame)
self.stopMeasure()
return frames
我们首先需要进行接口的适配,然后进行传感器的配置,最后定期读取传感器数据;
算法代码:
def TirangleGPS(A,B):
angle_A = A
angle_B = B
angle_C = 0
a_rad = math.radians(16)
COSangle_a = math.cos(a_rad)
angle_C2 = angle_A*angle_A+angle_B*angle_B-2*angle_B*angle_A*COSangle_a
angle_C = math.sqrt(angle_C2)
COSangle_x = (angle_B*angle_B+angle_C2-angle_A*angle_A)/2/angle_B/angle_C
print(COSangle_x)
COSangle_x = max(-1,min(1,COSangle_x))
x_rad = math.asin(COSangle_x)
COSangle_x = math.cos(x_rad)
length = angle_B*COSangle_x
angle = math.degrees(x_rad)
return length,angle
我们将固定的传感器长度数据传入这个函数中,最后返回最小距离以及夹角数据,注意两条线之间的角度是视场角的一般,这里用16度;使用math.cos时注意,这里的参数是弧度,所以使用之前需要将角度转化为弧度,使用完之后在进行逆转换。
七、效果展示
通过简约的效果进行展示,直观的表现任务的两个参数,具体效果可参看视频。
八、心得体会
在测试过程中也遇到了一些问题和挑战,比如math的使用,当然本次设计还有很大的优化空间,本次主要实现了基本的驱动以及算法测算,由于数据的漂移问题,整体结果还不是很稳定,后续可以加入一些滤波算法进行处理。
非常感谢电子森林和艾迈斯欧司朗组织的本次竞赛,也算是对2024的完美收官,让我们可以接触最新的传感器TMF8821,感受TOF传感器的魅力,还锻炼了实践能力,让我们切实感受到TOF传感器的巨大潜力,为后续检测设备开发奠定了技术基础。通过本次竞赛,本人在传感器应用、嵌入式开发和算法转化等方面积累了宝贵经验,这些经验将直接应用于后续的系统开发中。