[2024艾迈斯欧司朗竞赛] 基于TMF8821的dToF传感器模块 - 搭配RP2040实现手势识别
本项目基于TMF8821 dToF传感器模块和RP2040微控制器的项目,TMF8821传感器能够精确测量距离并识别手部动作,挥动、接近和远离等功能,RP2040微控制器处理传感器数据,通过算法识别手势屏幕菜单显示和测量。
标签
DTOF设计赛
meiyao
更新2025-03-10
26

一、【项目介绍

基于TMF8821的dToF传感器模块和RP2040微控制器,可以通过手势识别来控制屏幕上的菜单功能,向哪一边挥动显示方向提示;角度测评是通过程序测算出板卡距离与前面的夹角和垂直最小距离。


RP2040 游戏机与 TMF8821 的简要介绍

1. RP2040 游戏机简介

RP2040 Game Kit 是一款基于树莓派 RP2040 微控制器的嵌入式学习平台,具有强大的性能和丰富的功能,通过 USB Type-C 供电,主控为双核 ARM Cortex-M0+,具有 264KB 内存,支持 MicroPython 和 C/C++ 编程。板载功能丰富,包括四向摇杆、2 个轻触按键、三轴姿态传感器 MMA7660 作为输入控制,240×240 分辨率的彩色 LCD 显示屏,片内温度传感器,以及支持外部 4 路模拟信号输入内部 ADC 采样率高达 500Ksps。可以控制和显示接口平台,搭配传感器和模拟电路,完成更多创意项目,适合嵌入式学习和开发。


主要特点:

主控芯片:RP2040,双核 ARM Cortex-M0+,运行频率高达 133 MHz。

供电方式:USB Type-C 供电,方便易用。

编程支持:支持 MicroPython 和 C/C++,适合不同层次的开发者。

游戏可玩性:可移植多款复古游戏,兼具娱乐性和学习性。


板上功能:

显示:240×240 分辨率的彩色 IPS LCD,SPI 接口,控制器为 ST7789。


输入控制:

四向摇杆 + 2 个轻触按键。三轴姿态传感器 MMA7660,用于动作控制。


存储:

外扩 2MB Flash,预刷 MicroPython 的 UF2 固件。


红外功能:

1 个红外接收管 + 1 个红外发射管,支持红外通信。


音频:

1 个蜂鸣器,支持简单音效播放。


扩展接口:

双排 16Pin 连接器,提供 SPI、I2C 以及 2 路模拟信号输入,方便外接传感器和其他模块。


2.TMF8821 简介

TMF8821 是一款高性能的飞行时间ToF传感器,由德州仪器生产,主要用于距离测量和物体检测。TMF8821 dToF 模块是基于 TMF8821 设计的直接飞行时间dToF传感器模块,采用单个模块化封装,集成了 VCSEL垂直腔面发射激光器。该模块基于 SPAD、TDC 和直方图技术,支持最大 5000 mm 的检测范围。TMF8821 的镜头位于 SPAD 上,支持 3x3、4x4 和 3x6 多区域输出数据,并具有宽广且动态可调的视野。VCSEL 上方的多透镜阵列拓宽了照明场。所有原始数据的处理均在片上进行,TMF8821 通过 I2C 接口提供距离信息和置信度值,适用于高精度距离测量和物体检测应用。


主要特点:

测量原理:基于飞行时间(ToF)技术,通过测量光脉冲的往返时间计算距离。


测量范围:支持短距离(几厘米)到中距离(数米)的精确测量。


高精度:提供毫米级精度的距离测量。


低功耗:适合电池供电的应用场景。


接口支持:支持 I2C 接口,方便与微控制器通信。


二、硬件介绍

下面正式开始项目实现的具体步骤:


1. 认识传感器数据采集

TMF8821传感器模块可以测量到目标物体的距离和反射光强度,通过采集这些数据,可以识别手势动作。

挥动:检测到手部在传感器前的快速移动。

接近/远离:检测到手部向传感器靠近或远离。

框架:

每个区域的距离信息,以在1毫米的步骤中最接近和第二接近的物体,算法性能取决于所选区域如下图。

image.png

实物照片:


image.png

箭头是传感器,方框是通信引脚。

安装在RO2040游戏机板上图:

image.png


三、【项目设计思路介绍

手势识别算法

在RP2040上实现手势识别算法,处理TMF8821传感器采集的数据。

数据预处理:对传感器数据进行滤波,去除噪声。

手势挥动检测:通过检测距离的快速变化来判断手部挥动。


控制屏幕菜单

根据识别到的手势动作,控制屏幕上的菜单功能。

挥动手势:切换菜单选项。

屏幕显示信息:

Gesture recognition

2024 OSRAM DTOF

TMF8821 RP2040

手识动作指示:

LEFT <

UP ^

DOWN v

RIGHT >


四、方案框图和项目设计思路介绍

连接功能示意图

image.png


五、软件流程图和关键代码介绍

软件工作流程图

image.png

程序实现

在RP2040上编写程序,实现上述功能。

获取信息的函数:


def getDistance():
global calc, status, distancegroup # 声明全局变量,用于在函数内修改它们的值
frames = tof.measure_frame(1) # 从TOF(Time of Flight,飞行时间)传感器获取一帧数据
distance = [] # 临时存储当前帧的距离数据
framelist = [] # 存储前9个测量结果的列表

if frames: # 如果成功获取到帧数据
for idx, frame in enumerate(frames): # 遍历帧数据
for result_idx, result in enumerate(frame.results): # 遍历帧内的测量结果
if result_idx < 9: # 只取前9个测量结果
framelist.append(
result.distanceInMm # 将距离数据(毫米单位)添加到列表中
)

# 调整顺序,使数据顺序符合实际情况(可能是根据传感器布局或实际需求调整)
if len(framelist) == 9: # 确保获取到了9个测量结果
# 按照特定顺序重新排列距离数据
distance.extend(
[
framelist[6], # 第7个数据
framelist[7], # 第8个数据
framelist[8], # 第9个数据
framelist[3], # 第4个数据
framelist[4], # 第5个数据
framelist[5], # 第6个数据
framelist[0], # 第1个数据
framelist[1], # 第2个数据
framelist[2], # 第3个数据
]
)
print('---------') # 打印分隔线
print(distance) # 打印当前帧的距离数据

if not calc: # 如果 calc 为 False(未完成计算)
if check_fluctuation(distance): # 检查距离数据的波动性
print('no move') # 如果波动小,打印“no move”
if status == 1: # 如果状态为1(表示之前检测到移动)
calc = True # 设置 calc 为 True,准备进行方向计算
else:
status = 0 # 否则,设置状态为0(未检测到移动)
else: # 如果波动大
print('move') # 打印“move”
distancegroup.append(distance) # 将当前帧的距离数据添加到 distancegroup 列表中
status = 1 # 设置状态为1(检测到移动)

代码

frames:从传感器获取的一帧数据。

framelist:存储前9个测量结果的列表。

distance:重新排序后的距离数据列表。

calc:布尔值,表示是否需要进行方向计算。

status:表示当前状态(0:未检测到移动,1:检测到移动)。

distancegroup:存储多组距离数据的列表,用于后续方向计算。


显示信息:

# 显示信息的函数
def dispinfo(direction):
# 在显示屏上显示固定的标题信息
display.text(font2, "2024 OSRAM dToF", 1, 85, color=st7789.WHITE) # 显示 "2024 OSRAM dToF",位置 (1, 85),颜色为白色
display.text(font2, "TMF8821 RP2040 ", 3, 125, color=st7789.WHITE) # 显示 "TMF8821 RP2040",位置 (3, 125),颜色为白色

# 根据传入的方向参数显示相应的方向信息
if direction == "left": # 如果方向是 "left"
display.text(font2, "LEFT", 50, 170, color=st7789.WHITE) # 显示 "LEFT",位置 (50, 170),颜色为白色
elif direction == "right": # 如果方向是 "right"
display.text(font2, "RIGHT", 50, 170, color=st7789.WHITE) # 显示 "RIGHT",位置 (50, 170),颜色为白色
elif direction == "up": # 如果方向是 "up"
display.text(font2, " UP ", 50, 170, color=st7789.WHITE) # 显示 " UP ",位置 (50, 170),颜色为白色
elif direction == "down": # 如果方向是 "down"
display.text(font2, "DOWN", 50, 170, color=st7789.WHITE) # 显示 "DOWN",位置 (50, 170),颜色为白色

显示方向信息:

根据传入的 direction 参数,显示相应的方向信息:

direction 是 "left",显示 "LEFT"。

direction 是 "right",显示 "RIGHT"。

direction 是 "up",显示 " UP "。

direction 是 "down",显示 "DOWN"。

方向信息显示在坐标 (50, 170),使用字体 font2 和颜色 st7789.WHITE。


六、【功能展示图及说明】

屏幕显示信息:

Gesture recognition

2024 OSRAM DTOF

TMF8821 RP2040

image.png

手识动作指示:

LEFT <

image.png

UP ^

1741263460634.jpg

DOWN v

image.png

RIGHT >

image.png




总结:

在这个项目中,使用RP2040芯片实现角度测量功能遇到了一些困难,尽管在过年期间和开工后投入了大量时间进行开发和调试,但最终未能成功实现预期的角度测量功能。由于时间紧迫,不得不放弃该功能,改为手势识别。整个开发过程仍然带来了许多宝贵的经验和收获。深入了解了RP2040芯片的性能和局限性,尤其是在处理复杂传感器数据时的表现,反复调试和优化代码,提升了编程能力和问题解决能力。面对技术难题时,学会了灵活调整方案,及时转向其他可行的解决方案,确保项目能够按时完成。虽然角度测量功能未能完全实现,实现的功能不是那种很灵敏和完美,但通过这次开发,积累了丰富的实践经验,对项目开发又打下了坚实的基础。


心得:

本次竞赛对我来说意义非凡,通过这次程序的开发,让我深入学习了机器学习和 TOF 传感器的相关知识,拓宽了我的技术视野,也让我对未来的技术应用充满期待,更加的加深了印象。

我系统地学习了机器学习的基本原理和应用方法,掌握了如何利用算法解决实际问题。我也深入了解了 TOF 传感器的工作原理,包括其基于 SPAD 和直方图技术的高精度测距能力,以及如何通过 I2C 接口获取距离和置信度数据。这些知识让我对传感器技术有了更深刻的理解。





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