2024艾迈斯欧司朗竞赛 - 基于TMF8821的dToF传感器完成平面角度计算
通过 ​ TMF8821 dToF传感器 与 ​树莓派RP2040游戏机​ 的板卡组合,实现 测算板卡与目标平面之间的 ​实时夹角。
标签
2024艾迈斯欧司朗竞赛;
TMF8821 dToF传感器
树莓派RP2040游戏机
小屁孩06
更新2025-03-07
35

2024艾迈斯欧司朗竞赛 - 基于TMF8821的dToF传感器完成平面角度计算

1. 项目简介

项目背景

随着智能感知技术的快速发展,直接飞行时间(dToF)传感器凭借其高精度、抗干扰和低功耗等特性,在工业自动化、增强现实、智能家居等领域展现出巨大潜力。为探索dToF技术的创新应用场景,艾迈斯欧司朗联合硬禾科技发起本次竞赛,旨在通过开放硬件平台激发参赛的创造力,推动dToF技术的实际落地。
本次竞赛主要采用TMF8821 dToF传感器模块, 该模块是基于TMF8821传感器设计的一款直接飞行时间(dToF)传感器。

通过 ​TMF8821 dToF传感器​ 与 ​树莓派RP2040游戏机​ 的板卡组合,实现以下目标:

  • 测算板卡与目标平面之间的 ​实时夹角​(角度值)
  • 计算板卡到平面的 ​垂直最小距离
  • 输出可视化结果(显示屏/串口)


2. 硬件设备介绍

FpOIcLOTHF0c3wosPhoOf3FB3Wkg

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路模拟信号输入

该平台可作为电赛的控制、显示接口平台,搭配传感器、模拟电路外还可以完成更多创意项目。


dToF模块

dToF模块是基于 TMF8821 设计的直接飞行时间 (dToF) 传感器模块,TMF8821采用单个模块化封装,带有相关的 VCSEL(垂直腔面发射激光器)。dToF 设备基于 SPAD、TDC 和直方图技术,可实现 5000 mm 的检测范围。由于它的镜头位于 SPAD 上,它支持 3x3、4x4 和 3x6 多区域输出数据以及宽广的、动态可调的视野。VCSEL 上方的封装内的多透镜阵列 (MLA) 拓宽了 FoI(照明场)。原始数据的所有处理都在片上进行,TMF8821在其 I2C 接口上提供距离信息和置信度值。

TMF8821特点

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

3 项目方案:

本项目主要采用基于树莓派RP2040的嵌入式系统学习平台MCU作为主控制,系统平台使用micropython平台,根据TMF882x数据手册和驱动文档实现TMF8821模型的固件加载与驱动,同时实现角度计算与距离计算函数,根据TMF8821采集到距离数据计算与平面夹角,并在LCD显示屏上驱动显示。

系统项目方案框图如下图所示:

4 模块功能实现:

4.1  环境配置

   (1)thonny。安装过程具体可参考 https://class.eetree.cn/live_pc/l_60fe7f4fe4b0a27d0e360f74

   (2)硬禾学堂2022寒假在家练:基于树莓派RP2040的嵌入式系统学习平台,相关内容可参考https://www.eetree.cn/project/detail/698


4.2  算法原理:


相关角度推导主要基于下图几何原理,先根据a, b和 a,b边夹角求得C,再二次使用余弦定理根据三条边求得b边所对应的角度phi, 再根据正弦定理求得最小距离D和 直度三角型求的theta .

数学模型:余弦定理

公式原型

=+- 2ab·cosθ
θ = arccos( (+-)/(2ab) )

代码实现逻辑

# 算法实现流程图
[传感器数据][选择有效边a,b][计算第三边c][计算夹角θ][最小距离换算]

代码实现

def get_third_edge(a, b, angle_degrees):
# 将角度转换为弧度制
angle_radians = math.radians(angle_degrees) # [[1, 2, 4, 7, 8, 9, 10, 14, 17, 18]]

# 应用余弦定理公式计算第三边
c = math.sqrt(a**2 + b**2 - 2*a*b*math.cos(angle_radians))
return c

def find_angle(a, b, c):
"""
根据余弦定理计算a和b两边之间的夹角
参数:
a, b - 已知两边长度
c - 已知第三边长度

返回值:
角度值(单位:度),保留两位小数
"""
# 验证输入有效性
if a <= 0 or b <= 0 or c <= 0:
raise ValueError("所有边长必须大于0")

# 验证三角形成立条件
sides = sorted([a, b, c])
if sides[-1] >= sides[0] + sides[1]:
raise ValueError("无法构成有效三角形")

# 计算余弦值并处理浮点误差
cos_theta = (a**2 + b**2 - c**2) / (2 * a * b)
cos_theta = max(min(cos_theta, 1.0), -1.0) # 限制在[-1,1]范围内

# 计算角度并转换单位
angle_rad = math.acos(cos_theta)
return round(math.degrees(angle_rad), 2)

def caculate_angel(center_edge, y, angle_degrees=32/2.):

plane_edge = get_third_edge(center_edge, y, angle_degrees)

# 计算角度

phi = find_angle(center_edge, plane_edge, y)

mini_dis = math.sin(math.radians(phi)) * center_edge

theta = 90 - phi

return theta, mini_dis


4.3  TMF8821驱动

TMF8821传感器驱动库主要基于https://github.com/stocyr/SourdoughMonitor的circuitPython驱动库进行了移植, 由于circuitPython相关函数与micropython函数并不相同,因此,基于micropython相关接口对 原circuitPython项目驱动库函数进行了改写,主要改写了如下函数:_read_byte, _read_bytes(self, address: int, length: int)_write_byte(self, address: int, data: int) ,_write_bytes(self, address: int, data)等,详细如下代码所示:

def _read_byte(self, address: int) -> int:
# Read and return a byte from the specified register address.
# with self._device as i2c:
# result = bytearray(1)
# i2c.write_then_readinto(bytes([address]), result)
data = self._device.readfrom_mem(TOF8821_SLAVE_I2C_ADDR, address, 1)
return data[0]
def _read_bytes(self, address: int, length: int) -> bytes:

# Read and return multiple bytes from the specified register address.

# result = bytearray(1)

# i2c.write_then_readinto(bytes([address]), result)

data = self._device.readfrom_mem(TOF8821_SLAVE_I2C_ADDR, address, length)

return data



def _write_byte(self, address: int, data: int) -> None:

# Write 1 byte of data from the specified 8-bit register address.

self._device.writeto_mem(TOF8821_SLAVE_I2C_ADDR, address, bytes((data,)))





def _write_bytes(self, address: int, data) -> None:

# Write multiple bytes of data from the specified 8-bit register address.

if type(data) is list:

self._device.writeto_mem(TOF8821_SLAVE_I2C_ADDR, address, bytes(data))

elif type(data) is bytes:

self._device.writeto_mem(TOF8821_SLAVE_I2C_ADDR, address, data)

4.4  主程序计算与显示 相关代码

 主程序主要实现 传感器实例化加载,加载相关配置与固件,可视化显示结果等相关功能,详细代码如下:

from micropython import const
from machine import Pin, I2C, UART
from utime import ticks_ms, ticks_add, ticks_diff, sleep_ms
from TOF8821.tmf8821 import TMF8821
from TOF8821.config import sc
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import framebuf
from machine import Pin, SPI, ADC,PWM
import time, math,array
import uos
import test.st7789 as st7789
from utils import get_third_edge, find_angle, caculate_angel

sc.iterations = 3.5e6

sc.period_ms = 1 # as small as possible for repeated measurements

sc.spad_map = '3x3_normal_mode'

tof = TMF8821(sc)

print("tmf8821 is ready...")

tof.write_configuration()

print('Starting measurements...')

tof.start_measurements()





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, "EETREE", 10, 10)

display.text(font2, "www.eetree.cn", 10, 40)





while True:

measurement = tof.wait_for_measurement(timeout_ms=500)



distances = [m for m in measurement.distances]

theta, min_distance = caculate_angel(distances[4], distances[7])

display.text(font2, "Angle:"+"%.2f" %(theta) , 10, 70, color=st7789.MAGENTA)

display.text(font2, "MinDis:"+"%.2f" %(min_distance) , 10, 110, color=st7789.MAGENTA)

sleep_ms(60)


5 功能演示:

由于是动态效果,这里只能放一个截图:

6 项目小结:

本次参与艾迈斯欧司朗与硬禾科技联合主办的2024 dToF传感器光电设计竞赛,通过理论实践相结合的方式,系统性地深化了对TMF8821 dToF传感器技术优势的认知。该传感器展现出稳定的光脉冲特性,印证了其在工业检测、智能交互等领域的广阔应用前景,其开创性的应用潜力为创新开发提供了广阔空间。

在开发过程中,笔者曾尝试实现基于角度感知的空间鼠标原型,通过融合dToF测距数据与姿态传感器信息构建三维交互模型。由于运动预测算法的精度限制,暂未达到预期效果。期待未来通过改进卡尔曼滤波算法进一步提升系统稳定性,也衷心期盼业界能持续举办此类促进技术落地的优质赛事。

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