【项目介绍】
本项目使用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) # 配置 SCL 和 SDA 引脚
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个点分别返回的数据,并通过计算求得与平面的夹角和中心距离。