2024艾迈斯欧司朗竞赛 - 基于TMF8821的dToF传感器模块 - 搭配RP2040游戏机测量角度
该项目使用了RP2040游戏机、TMF8821 dToF传感器模块,实现了角度测算的设计,它的主要功能为:计算平面与传感器板的YAW及PITCH角,以及传感器板到屏幕的最小距离。。
标签
嵌入式系统
Funpack活动
显示
开发板
RP2040
dToF
Jahg
更新2025-03-10
108

【项目介绍】

本项目使用RP2040 Game Kit板卡和TMF8821 dToF传感器模块,实现角度测量的功能,是2024艾迈斯欧司朗dToF传感器光电设计竞赛的任务一。

本项目的主要难点在于如何驱动TMF8821 dToF传感器模块,以及如何计算平面与传感器板的YAW及PITCH角,并将测量的数值显示到屏幕上


【硬件介绍】

完成项目的第一步是熟悉板卡和传感器。RP2040 Game Kit板卡是基于RP2040的游戏套件,外形如一个mini的游戏手柄,具备手柄的方向键,AB,SEL,Start按键,当然本次任务中不会用到。将板卡通过USB_C连接到PC后,会有一个串口出现,PC端使用Thonny进行microPython编程。通过工具-选项,设置端口后,即可看到RP2040的内部文件系统,将所需的.py文件上传到板内即可运行对应程序。

​对于传感器,这是一个dToF传感器,它是一种基于直接飞行时间原理的测距技术,用于精确测量物体与传感器之间的距离。它通过发送高密度光脉冲并捕捉其反射回来的时间差来计算距离,具有快速响应和高精度的特点。dToF传感器广泛应用于消费电子、自动驾驶、机器人导航等领域,尤其在需要实时、准确的距离数据时表现突出。与传统测距技术相比,dToF传感器在复杂环境中仍能保持较高的测量稳定性,适用于室内定位、物体识别等多种应用场景。TMF8821 dToF传感器模块可以实现3*3的区域测试,所以可以实现对平面的角度测量。


硬件连接图如下:


【项目设计思路介绍】

基于此,为了完成任务1:角度测算:将板卡组合后固定,并保证与面前的平面存在一定夹角,通过程序测算出板卡距离屏幕的夹角和垂直中心距离。需要进行需求的拆解。


任务拆解如下:

1)初始化屏幕;

2)绘制屏幕基础元素;

3)初始化dToF传感器;

4)读取传感器数据;

5)计算角度和最小距离;

6)绘制计算数据到屏幕上。


【软件流程图和关键代码介绍】

软件流程图如下:



对于需求1):配置SPI0,实例化st7789类。

#初始化屏幕
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)

display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)


对于需求2):填充屏幕颜色为蓝色,绘制xy轴

#填充背景
display.fill(st7789.BLUE)

# 绘制坐标系
def draw_2d_axes(tft):
tft.line(120, 210, 120, 20, st7789.RED)#X
tft.line(20, 120, 220, 120, st7789.GREEN)#Y

draw_2d_axes(display)


对于需求3):初始化I2C为Pin16、Pin17,并初始化TMF8821 dToF传感器。

#配置TMF8821 start
tm8821 = I2C(0, scl=Pin(17), sda=Pin(16),freq=400000) # 配置 SCLSDA 引脚
ENABLE = Pin(22, Pin.OUT)
INIT_MESSURE(tm8821,tmf8828_image,tmf8828_image_length,ENABLE)
#配置TMF8821 end


对于需求4):调用驱动部分函数,读取传感器数据,为3*3共9个点的数据。

    #读取9个点的距离数据
distances=readdistance(tm8821,distances)


对于需求5):调用函数计算角度和最小距离。

    n,P= calNormandP(distances)
#计算最小距离
dis =plane_distance_to_origin(n[0],n[1],n[2],P[4][0],P[4][1],P[4][2])
#计算角度
pitch_deg, yaw_deg = calculate_angles(n[0],n[1],n[2])


对于需求6):绘制计算数据到屏幕上。

    #显示角度
display.text(font1, "YAW_A= %0.2f" %(yaw_deg) , 20 , 10)
display.text(font1, "PITCH_A=%0.2f" %(pitch_deg) , 20 ,130)
#显示最小距离
display.text(font1, "MIN_Dist=%04d" %(dis) , 20 , 200)


最后,程序主体为死循环,循环内有10ms延时控制负载。

#开启主循环
while True:
sleep_ms(10)
drawData(distances)


基于以上软件需求,在RP2040 Game Kit上插上TMF8821 dToF传感器小板子,供电后,屏幕正常显示数据,完成本次任务。


【功能展示图及说明】

任务效果如下描述:

给连接好的硬件供电后,显示屏幕初始化为蓝色并绘制坐标轴,待初始化好TMF8821 dToF传感器后,会显示YAW角度,PITCH角度和平面距离中心值,改变Game Kit和前方平面的相对关系,可看到数值随着运动变化。


实物演示图片:


【对本次竞赛的心得体会】

本次任务,熟悉了RP2040的使用,它可以很方便使用microPython编程,也熟悉了dToF传感器,了解如何初始化和调用它,能够读取到3*3个点分别返回的数据,并通过计算求得与平面的夹角和中心距离。

附件下载
image_data.py
tmf8821.py
main.py
团队介绍
个人作品
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号