2024艾迈斯欧司朗竞赛 - 基于TMF8821快速进行夹角与垂直距离测算
该项目使用了TMF8821、MicroPython语言,实现了夹角与垂直距离测算的设计,它的主要功能为:使用RP2040 Game Kit进行TMF8821驱动获取数据,并显示夹角与垂直距离测算结果。
标签
MicroPython
RP2040
TMF8821
2024艾迈斯欧司朗竞赛
孤独的单行者
更新2025-03-06
24

一、项目简介

本项目致力于开发一套基于艾迈斯欧司朗TMF8821多区域直接飞行时间(dToF)传感器与RP2040微控制器平台的非接触式角度测量系统。通过巧妙结合RP2040 Game Kit的强大性能与dToF模块的高精度测距能力,我们实现了对被测平面与传感器模块之间空间夹角及最小垂直距离的实时计算。系统核心在于对dToF传感器输出的多区域测距数据进行深入分析,通过选取特定检测区域数据构建几何模型。在此基础上,我们运用余弦定理与三角函数关系,快速解算出平面参数,确保了测量的高精度与实时性。

RP2040 Game Kit作为嵌入式系统学习平台,其USB Type-C供电、支持MicroPython与C/C++编程的特性,为项目开发提供了极大的便利。而TMF8821 dToF模块则凭借其宽广的检测范围、动态可调的视野以及片上数据处理能力,确保了测量数据的准确与可靠。通过学习快速了解dToF传感器的使用,以及RP2040 Game Kit开发板的便捷使用。

二、硬件

1、框图


0

根据本次任务的要求,我们需要将RP2040 Game Kit与TMF8821传感器模块连接在一起,背部引脚是相配,并通过安装的方式使传感器与平面平行,传感器会获取多达3*3的数据矩阵,都是传感器到达平面的距离,由于固定FOV,这些数据的大小是不同的。

2、硬件介绍

首先介绍一下本次用到的RP2040 Game Kit作为主控,RP2040 Game Kit是基于树莓派RP2040的嵌入式系统学习平台,USB Type-C供电,采用RP2040作为主控,支持MicroPython、C/C++编程,性能强大。板上基本功能如下:

  • 240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789
  • 四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制
  • 板上外扩2MB Flash,预刷MicroPython的UF2固件
  • 一个红外接收管 + 一个红外发射管
  • 一个三轴姿态传感器MMA7660
  • 一个蜂鸣器
  • 双排16Pin连接器,有SPI、I2C以及2路模拟信号输入

游戏机可玩性极高,可移植多款复古游戏,还可作为电赛的控制、显示接口平台,搭配传感器、模拟电路外还可以完成更多创意项目。本次作为TMF8821传感器模块的采集工具,用到的就是适配的双排16Pin连接器,最后可以通过240*240分辨率的彩色IPS LCD进行显示。

接下来就是本次的主角——TMF8821传感器模块,该传感器集成于单个模块化封装中,配备VCSEL(垂直腔面发射激光器)。基于SPAD、TDC和直方图技术,该模块可实现5000mm的检测范围。其镜头位于SPAD上方,支持3x3、4x4和3x6多区域输出数据,并具备宽广且动态可调的视野。VCSEL上方的多透镜阵列(MLA)进一步扩展了照明场(FoI)。所有原始数据处理均在片上完成,TMF8821通过I2C接口提供距离信息和置信度值。该dToF传感器模块与RP2040游戏机管脚兼容,即插即用,并在侧面预留扩展接口,便于焊接、调试和数据抓取。主要特点如下:

  • 具有高灵敏度SPAD检测的Direct ToF技术
  • 4x4 可配置的多区域配置,具有多目标检测功能
  • 可调视野(最大63°对角线)
  • 快速时间数字转换器(TDC)架构
  • 亚纳秒级光脉冲
  • 10 – 5000mm 距离感应 @30Hz
  • 片上直方图处理
  • 940nm VCSEL 1类人眼安全
  • 高性能片上阳光阻隔滤波器和算法
  • 小型模块化OLGA 2.0mm x 4.6mm x 1.4mm封装

下图为模块的原理图,如果我们需要其他控制平台进行驱动,注意连接:


0

三、软件

1、设计思路

本次主要实现角度的测量以及最小距离的显示,如果传感器平行于平面进行放置,实际上3*3矩阵的中心位置就是最小距离,毕竟周围的8个点都是有角度的,平行距离垂直距离最短。我们通过转动传感器的时候是通过平行于传感器的一个方向,这个时候实际上空间问题就转变了平面问题,这个时候我们就可以将3*3矩阵的数据选取最可靠的中间数据进行计算了,基于余弦定理进行。

2、主算法介绍

我们计算角度和最小距离就是通过余弦定理进行,这里我们进行一下简单的计算介绍,基本位置如下图:


0

假设一些位置:

x为传感器位置;

b为模拟出来的夹角焦点位置;

a为中间数据对应的平面焦点(及3*3数据的第五个中点位置,垂直于传感器);

h为传感器与平面的垂直位置;

A为传感器中第2个数据对应的路径;

B为传感器中第5个数据对应的路径;

C为传感器中第8个数据对应的路径;

已知A、B的长度,实际上C可以不用,我们主要用ABX组成的三角形,以及点abx组成的三角形就可以了,我们求的b点处的夹角。已知条件还有线AC的夹角,线BA的夹角为线AC的夹角的一般。余弦定理如下:

X*X=A*A+B*B−2*A*B*cos(x)

我们知道AB的长度,也知道夹角的大小,就可以求出X的长度,同理使用余弦定理,我们知道ABX的长度,就可以计算出a点的夹角,其中a点的夹角与b点的夹角互余。

进一步通过直接三角形定理,求出H的长度。

3、软件流程


0

软件主要通过加载对应的驱动库实现,本次主要用到了屏幕驱动和传感器驱动,初始化完成后进行数据的循环采集和计算显示。

4、主要代码介绍

屏幕初始化代码:

import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2

st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
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)
# 清屏并显示固定文本
display.fill(st7789.BLACK)
display.text(font2, "Angle", 10, 10,color=st7789.MAGENTA)
display.text(font2, "By TMF8821", 10, 50,color=st7789.MAGENTA)
display.text(font2, "H:", 10, 90,color=st7789.MAGENTA)
display.text(font2, "A:", 10, 150,color=st7789.MAGENTA)

传感器驱动代码:

from tmf8821_utility import Tmf8821Utility
from IIC.i2c_User import I2C_user, I2C_config
from tmf8821_device import Tmf8821Device
from tmf8821_app import Tmf8821App

IIC = I2C_user()

tof = Tmf8821Utility(IIC)

if Tmf8821App.Status.OK != tof.open():
tof.error("Error open device")
raise RuntimeError("Error open device")
else:
tof.log("Opened connection")

tof.init_bootloader_check()

注意传感器是通过IIC进行通信的,我们需要创建IIC接口,然后启动传感器,不仅仅要供电还要控制使能引脚,如果bootloader没有通过,我们还要加载固件。

算法代码介绍:

def Angle(A,B):
Length_A = A
Length_B = B
angle_x = 16

rad_x = math.radians(angle_x)
COS_x = math.cos(rad_x)

Length_XX = Length_A*Length_A+Length_B*Length_B-2*Length_B*Length_A*COS_x
Length_X = math.sqrt(Length_XX)
COS_a = (Length_B*Length_B+Length_XX-Length_A*Length_A)/2/Length_B/Length_X
COS_a = max(-1,min(1,COS_a))
print(COS_a)
rad_b = math.asin(COS_a)
angle_b = math.degrees(rad_b)

COS_b = math.cos(rad_b)
Length_H = Length_B*COS_b

return angle_b,Length_H

我们结合算法图片中的介绍进行了对应边与脚的命名,结合math库中的三角函数进行计算。

四、效果展示


0

五、活动建议和体会

本次活动跨越了24和25,可以说是对24年最好的总结,也是对25美好的开端,我们通过本次活动有了解并学习了两个新的器件,一个主控平台和一款传感器,非常感谢本次活动的成功举办。对于全新实物还是充满挑战的,希望举办方以后可以多多带来这样的全新的前言的设备,让我们更多的扩展自己的眼界,体验前沿技术。

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