2024艾迈斯欧司朗竞赛 - 基于rp2040和dToF光传感器实现角度测算
该项目使用了thonny软件、MicroPython语言、rp2040开发板,实现了用RP2040控制dtof传感器对平面进行角度测量的设计,它的主要功能为:实现了dToF传感器tmf8821的驱动,对该传感器进行校准,并将dtof传感器测量的数据读出,并对传感器数据进行解析和计算,在屏幕上显示传感器与面前平面的夹角和垂直距离。。
标签
嵌入式系统
MicroPython
RP2040
参加活动/培训
万年青
更新2025-03-06
北京邮电大学
67

一、项目介绍

2024艾迈斯欧司朗dToF传感器光电设计竞赛是由艾迈斯欧司朗赞助硬禾科技举办。本项目是依托于rp2040 Gamk Kit板卡控制艾迈斯欧司朗dToF传感器tmf8821实现多点测距,然后测量并显示面前平面和传感器平面的夹角以及垂直距离,并说明倾斜方向。数据大概以100ms一次的频率实时更新。项目的主要工作是完成该传感器的驱动库,并调用驱动库的功能实现距离的测量和进一步的应用。

二、使用到的硬件介绍

硬件

说明

RP2040 Game Kit

基于树莓派RP2040的嵌入式系统学习平台,USB Type-C供电,采用RP2040作为主控,支持MicroPythonC/C++编程,性能强大

image.png 

dToF模块

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

TMF8821 dToF传感器模块与RP2040游戏机管脚匹配,插上直接可以使用,并在侧面预留了扩展接口,可以自由焊接/调试/抓取数据。image.png


typec电源线

rp2040 gamekit供电

 

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

 image.pngimage.png

项目设计思路介绍:先打通micropython的基础使用,然后了解与设备进行i2c交互的基础理论,接着通过学习数据手册、通信手册和官方的arduino库代码,实现micropython环境下的基础功能库,接着实现完整的交互式的测量应用,并进一步完成选定的学习任务。

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

软件流程图:

image.png

关键代码介绍:(这里仅介绍几个最关键的代码)

1.image固件数据

#存储固件,也就是image
image_data=bytearray([0x00, 0x80, 0x20, 0x00, 0x9D, 0x00, 0x20, 0x00, 0xD5, 0x20, 0x10, 0x00,
0xD7, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x12, 0x56, 0x34, 0x4C, 0x0A, 0x00, 0x00, 0xD9, 0x20, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x20, 0x10, 0x00,
0xDD, 0x20, 0x10, 0x00, 0xDF, 0x20, 0x10, 0x00, 0xE9, 0x00, 0x20, 0x00,
0x61, 0x23, 0x10, 0x00, 0xDF, 0x20, 0x10, 0x00, 0x85, 0x22, 0x10, 0x00,
0x99, 0x22, 0x10, 0x00, 0xDF, 0x20, 0x10, 0x00, 0xDF, 0x20, 0x10, 0x00,
0xDF, 0x20, 0x10, 0x00, 0x51, 0x23, 0x10, 0x00, 0xE1, 0x20, 0x10, 0x00,
0xE1, 0x20, 0x10, 0x00, 0x05, 0x24, 0x10, 0x00, 0x2D, 0x24, 0x10, 0x00,
0x4D, 0x24, 0x10, 0x00, 0xDF, 0x20, 0x10, 0x00, 0xDF, 0x20, 0x10, 0x00,
0x53, 0x29, 0xCD, 0x68, 0x03, 0x48, 0x85, 0x46, 0x00, 0xF0, 0x16, 0xF8,
0x00, 0x48, 0x00, 0x47, 0xE1, 0x00, 0x20, 0x00, 0x00, 0x80, 0x20, 0x00,
0x05, 0x48, 0x80, 0x47, 0x05, 0x48, 0x00, 0x47, 0xFE, 0xE7, 0xFE, 0xE7,
0xFE, 0xE7, 0xFE, 0xE7, 0x70, 0x47, 0xFE, 0xE7, 0x70, 0x47, 0x00, 0x00,
0xED, 0x6D, 0x10, 0x00, 0x89, 0x00, 0x20, 0x00, 0x06, 0x4C, 0x01, 0x25,
0x06, 0x4E, 0x05, 0xE0, 0xE3, 0x68, 0x07, 0xCC, 0x2B, 0x43, 0x0C, 0x3C,
0x98, 0x47, 0x10, 0x34, 0xB4, 0x42, 0xF7, 0xD3, 0xFF, 0xF7, 0xDC, 0xFF,
0x4C, 0x0A, 0x20, 0x00, 0x4C, 0x0A, 0x20, 0x00, 0x00, 0xF0, 0xAA, 0xF8,
0x00, 0xF0, 0xF8, 0xF8, 0x70, 0xB5, 0x0D, 0x4D, 0x2C, 0x6B, 0xA0, 0x07,
0x06, 0xD5, 0x01, 0xF7, 0x0F, 0xF9, 0x20, 0x30, 0x06, 0xF7, 0xB9, 0xFA,
0xFF, 0x28, 0x02, 0xD0, 0x02, 0xF7, 0xD4, 0xF8, 0x70, 0xBD, 0x07, 0x49,
0x08, 0x70, 0x07, 0x48, 0x80, 0x68, 0x80, 0x47, 0x06, 0x48, 0x81, 0x79,
0x06, 0x22, 0x11, 0x43, 0x81, 0x71, 0x2C, 0x63, 0x40, 0xBF, 0x70, 0xBD,
0x00, 0x10, 0x01, 0x40, 0x39, 0x45, 0x20, 0x00, 0x38, 0x3C, 0x20, 0x00,
0xBC, 0x3C, 0x20, 0x00, 0xFF, 0xB5, 0x83, 0xB0, 0x00, 0x20, 0x00, 0x90,
0x03, 0x98, 0x1C, 0x46, 0x00, 0x68, 0x40, 0x1A, 0x01, 0x12, 0x00, 0x29,
0x00, 0xDC, 0x00, 0x21, 0xD0, 0xB2, 0x00, 0xF0, 0xC3, 0xFA, 0x05, 0x46,
0x1F, 0x4F, 0xA0, 0x00, 0xC0, 0x19, 0xFF, 0x30, 0x01, 0x30, 0x40, 0x6A,
0x01, 0x90, 0x00, 0xF0, 0xD3, 0xFA, 0x6E, 0x28, 0x0D, 0xD0, 0x96, 0x26,
0xB5, 0x42, 0x28, 0xDA, 0x3C, 0x21, 0x28, 0x46, 0x01, 0xF7, 0xBC, 0xFF,
0x3C, 0x21, 0x41, 0x43, 0x6C, 0x1A, 0x00, 0x2C, 0x03, 0xDC, 0x01, 0x24,
0x04, 0xE0, 0x4B, 0x26, 0xF0, 0xE7, 0x3C, 0x2C, 0x00, 0xDD, 0x3C, 0x24,
0x80, 0x00, 0xC0, 0x19, 0xFF, 0x30, 0x01, 0x30, 0xC7, 0x6A, 0x00, 0x6B,
0x3C, 0x21, 0x38, 0x1A, 0x01, 0xF7, 0xA6, 0xFF, 0x60, 0x43, 0x39, 0x1A,
0x01, 0x98, 0x02, 0xF7, 0x61, 0xF9, 0x49, 0x04, 0xC0, 0x0B, 0x08, 0x43,
0x03, 0x99, 0x49, 0x68, 0x81, 0x42, 0x02, 0xDA, 0x01, 0x20, 0x00, 0x90,
0x01, 0xE0, 0xB5, 0x42, 0x02, 0xDB, 0x0C, 0x98, 0x00, 0x21, 0x01, 0x60,
0x00, 0x98, 0x07, 0xB0, 0xF0, 0xBD, 0x00, 0x00, 0x80, 0x3A, 0x20, 0x00,
0x0A, 0x49, 0x00, 0xB5, 0x88, 0x42, 0x01, 0xDD, 0xFF, 0x20, 0x00, 0xBD,
0x29, 0x28, 0xFC, 0xDB, 0x00, 0xF0, 0x12, 0xF8, 0x06, 0x49, 0x40, 0x18,
0x06, 0x49, 0x48, 0x43, 0x05, 0x21, 0x00, 0x12, 0xC9, 0x02, 0x40, 0x18,
0x80, 0x30, 0x00, 0x12, 0x00, 0xBD, 0x00, 0x00, 0x24, 0x84, 0x2E, 0x00,
0xAE, 0xFA, 0xFF, 0xFF, 0x42, 0x0D, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20,
0x80, 0x22, 0x93, 0x00, 0x03, 0xE0, 0x49, 0x1C, 0x49, 0x10, 0xFF, 0x30,
0x01, 0x30, 0x99, 0x42, 0xF9, 0xDC, 0x49, 0x43, 0x09, 0x12, 0x99, 0x42,
0x02, 0xDB, 0x49, 0x1C, 0x49, 0x10, 0x80, 0x18, 0x52, 0x10, 0xF6, 0xD1,
0x70, 0x47, 0x00, 0x00, 0x70, 0xB5, 0x1E, 0x48, 0x02, 0xF7, 0x26, 0xFD,
0x04, 0x46, 0x01, 0x28, 0x13, 0xD0, 0x04, 0xF7, 0xD7, 0xF9, 0x80, 0x7E,
0x06, 0xF7, 0x15, 0xFA, 0x20, 0x46, 0x02, 0xF7, 0x69, 0xFD, 0x20, 0x46,
0x02, 0xF7, 0xF0, 0xFC, 0x02, 0x21, 0x14, 0x20, 0x04, 0xF7, 0x4C, 0xFE,
0x03, 0x21, 0x13, 0x20, 0x04, 0xF7, 0x48, 0xFE, 0x70, 0xBD, 0x02, 0xF7,
0xBB, 0xFC, 0x11, 0x48, 0x01, 0x21, 0xC2, 0x6A, 0x89, 0x03, 0x8A, 0x43,
0xC2, 0x62, 0x80, 0x30, 0x02, 0x6E, 0x14, 0x4B, 0x8A, 0x43, 0x02, 0x66,
0x0D, 0x49, 0x0C, 0x48, 0xC8, 0x60, 0x0E, 0x48, 0x0C, 0x49, 0x81, 0x63,
0x0D, 0x49, 0x41, 0x60, 0x0D, 0x4A, 0x00, 0x21, 0x48, 0x00, 0x15, 0x5A,
0xC0, 0x18, 0x40, 0x30, 0x49, 0x1C, 0xC5, 0x86, 0x21, 0x29, 0xF7, 0xDB,
0x00, 0xF0, 0x46, 0xFA, 0xD1, 0xE7, 0x00, 0x00, 0xA8, 0x80, 0x10, 0x00,
0x40, 0x3E, 0x20, 0x00, 0x29, 0x09, 0x20, 0x00, 0x38, 0x3F, 0x20, 0x00,
0x79, 0x03, 0x20, 0x00, 0x38, 0x3C, 0x20, 0x00, 0x2D, 0x08, 0x20, 0x00,
0x08, 0x0A, 0x20, 0x00, 0x80, 0x3A, 0x20, 0x00, 0x26, 0x4C, 0x01, 0xF7,
0x81, 0xF8, 0x28, 0x30, 0x06, 0xF7, 0xC5, 0xF9, 0x40, 0x1C, 0xC0, 0xB2,
0x0A, 0x21, 0x04, 0xF7, 0x07, 0xFE, 0x05, 0xF7, 0xF1, 0xFE, 0x07, 0xF7,
0xE3, 0xF8, 0x00, 0x28, 0x01, 0xD0, 0x00, 0xF0, 0xDB, 0xFA, 0x04, 0xF7,
0xED, 0xFB, 0x00, 0x28, 0x01, 0xD0, 0x04, 0xF7, 0xE5, 0xFC, 0x07, 0xF7,
0xAB, 0xFD, 0x00, 0x28, 0x01, 0xD0, 0x04, 0xF7, 0xAF, 0xFD, 0xA0, 0x6B,
0x80, 0x47, 0x00, 0x28, 0x1F, 0xD0, 0x04, 0xF7, 0xE7, 0xFB, 0x00, 0x28,
0x05, 0xD0, 0x04, 0xF7, 0x6D, 0xFD, 0x03, 0x21, 0xFF, 0x20, 0x07, 0xF7,
0xEB, 0xF8, 0x04, 0xF7, 0xBF, 0xFB, 0x00, 0x28, 0x01, 0xD0, 0x04, 0xF7,
0xF3, 0xF8, 0x04, 0xF7, 0x85, 0xF9, 0x04, 0xF7, 0xF5, 0xF9, 0x00, 0xF0,
0xDB, 0xFA, 0x00, 0x28, 0xC5, 0xD0, 0x00, 0xF0, 0x29, 0xFB, 0x00, 0x28,
0x08, 0xD0, 0x61, 0x68, 0x18, 0x20, 0x88, 0x47, 0xBD, 0xE7, 0x04, 0xF7,
0x63, 0xFB, 0x20, 0x6C, 0x80, 0x47, 0xE4, 0xE7, 0x1A, 0x21, 0x80, 0x20,
0x04, 0xF7, 0xC6, 0xFD, 0xB3, 0xE7, 0x00, 0x00, 0x38, 0x3F, 0x20, 0x00,
0xF7, 0xB5, 0x9E, 0xB0, 0x14, 0x46, 0x04, 0xF7, 0x3B, 0xF9, 0x14, 0x90,
0xC9, 0x48, 0x0F, 0x90, 0x00, 0x2C, 0x03, 0xD1, 0x00, 0x8A, 0x0F, 0x99,
0x40, 0x1C, 0x08, 0x82, 0x04, 0xF7, 0x30, 0xF9, 0x30, 0x30, 0x11, 0x90,
0x24, 0x22, 0x00, 0x21, 0x04, 0xA8, 0x07, 0xF7, 0xAD, 0xFC, 0xC2, 0x4D,
0x00, 0x20, 0x69, 0x68, 0x10, 0x91, 0x1E, 0x9E, 0x13, 0xA9, 0x01, 0x90,
0x02, 0x90, 0x03, 0x90, 0x00, 0x91, 0xBE, 0x48, 0x01, 0x23, 0x47, 0x6B,
0x04, 0xAA, 0x80, 0x21, 0x30, 0x46, 0xB8, 0x47, 0x10, 0x99, 0x69, 0x60,
0x00, 0x28, 0x0C, 0xD0, 0xB9, 0x48, 0xB8, 0x4F, 0x15, 0x90, 0xBB, 0x6E,
0x22, 0x46, 0x80, 0x21, 0x98, 0x47, 0xB3, 0x48, 0x80, 0x38, 0x10, 0x90,
0x00, 0x2C, 0x03, 0xD0, 0x08, 0xE0, 0x24, 0x20, 0x21, 0xB0, 0xF0, 0xBD,
0x00, 0x20, 0x68, 0x60, 0xA8, 0x60, 0x10, 0x98, 0xB0, 0x49, 0xC1, 0x61,
0x04, 0x98, 0xC0, 0x13, 0x81, 0x00, 0x88, 0x19, 0x02, 0x46, 0x80, 0x3A,
0xD2, 0x6F, 0x71, 0x58, 0x40, 0x68, 0x51, 0x18, 0x09, 0x18, 0xA7, 0x48,
0x58, 0x22, 0xC1, 0x60, 0xA4, 0x48, 0xE0, 0x38, 0x01, 0x7F, 0x20, 0x38,
0x17, 0x90, 0x20, 0x46, 0x50, 0x43, 0x12, 0x90, 0x00, 0x29, 0x11, 0xD0,
0x04, 0xF7, 0xE4, 0xF8, 0xA3, 0x49, 0x30, 0x30, 0x4A, 0x68, 0x00, 0x2A,
0x1F, 0xD0, 0x80, 0x30, 0x41, 0x8F, 0x00, 0x29, 0x1B, 0xD0, 0xD0, 0x03,
0xFF, 0xF6, 0x76, 0xFE, 0x17, 0x99, 0x88, 0x63, 0x01, 0x25, 0x10, 0xE1,
0x11, 0x99, 0x04, 0x9A, 0x41, 0x18, 0x9B, 0x48, 0x0A, 0x61, 0x88, 0x63,
0x01, 0x20, 0x17, 0x9A, 0xC0, 0x03, 0x90, 0x63, 0x01, 0x20, 0x03, 0x23,
0x82, 0x00, 0x8A, 0x18, 0x0D, 0x69, 0x40, 0x1C, 0x15, 0x61, 0x93, 0x63,
0x0A, 0x28, 0xF7, 0xDB, 0xE8, 0xE7, 0x01, 0x21, 0x17, 0x98, 0xC9, 0x03,
0x81, 0x63, 0xE3, 0xE7, 0x8B, 0x4E, 0xF0, 0x6A, 0x00, 0x28, 0x00, 0xD0,
0x80, 0x47, 0x24, 0x22, 0x00, 0x21, 0x04, 0xA8, 0x07, 0xF7, 0x34, 0xFC,
0x1E, 0x98, 0x69, 0x02, 0x08, 0x18, 0x0D, 0x90, 0x11, 0x99, 0x12, 0x98,
0x86, 0x4F, 0x41, 0x18, 0xA8, 0x00, 0x19, 0x90, 0x08, 0x18, 0x1A, 0x90,
0x02, 0x69, 0xA0, 0x00, 0xC0, 0x19, 0x80, 0x6A, 0x7E, 0x4E, 0x80, 0x30,
0x01, 0x6B, 0x33, 0x6F, 0x0D, 0x98, 0x98, 0x47, 0x00, 0x22, 0x13, 0xA9,
0x01, 0x95, 0x02, 0x92, 0x00, 0x91, 0x03, 0x90, 0x76, 0x6B, 0x03, 0x23,
0x04, 0xAA, 0x80, 0x21, 0x0D, 0x98, 0xB0, 0x47, 0x18, 0x90, 0x00, 0x28,
0x7E, 0xD0, 0x1A, 0x98, 0x01, 0x21, 0x03, 0x69, 0x0F, 0x98, 0xC9, 0x03,
0x82, 0x69, 0x17, 0x98, 0x80, 0x6B, 0x40, 0x1A, 0x42, 0x43, 0x10, 0x13,
0x18, 0x1A, 0x01, 0x90, 0x00, 0x20, 0x1A, 0x90, 0x06, 0x46, 0x01, 0x20,
0x16, 0x90, 0x16, 0xA8, 0x00, 0x90, 0x23, 0x46, 0x2A, 0x46, 0x04, 0xA8,
0x01, 0x99, 0xFF, 0xF7, 0x0D, 0xFE, 0x00, 0x28, 0x02, 0xD0, 0x01, 0x26,
0x04, 0x99, 0x00, 0xE0, 0x01, 0x99, 0x0F, 0x98, 0x02, 0x8A, 0x40, 0x8A,
0x82, 0x42, 0x01, 0xD9, 0x0F, 0x9A, 0x10, 0x82, 0x28, 0x20, 0x63, 0x4A,
0x60, 0x43, 0x82, 0x18, 0x19, 0x98, 0x17, 0x18, 0x0F, 0x98, 0xFF, 0x37,
0x02, 0x8A, 0x41, 0x37, 0x38, 0x68, 0x03, 0xF7, 0x40, 0xF9, 0x38, 0x60,
0x02, 0x90, 0x16, 0x98, 0x01, 0x28, 0x04, 0xD1, 0x14, 0x98, 0x01, 0x6A,
0x01, 0x98, 0x40, 0x1A, 0x02, 0x90, 0x00, 0x20, 0x1B, 0x90, 0x7F, 0xE0,
0x00, 0x2E, 0x0E, 0xD0, 0x16, 0x98, 0x00, 0x28, 0x0B, 0xD0, 0x16, 0xA8,
0x00, 0x90, 0x0C, 0x20, 0x31, 0x46, 0x41, 0x43, 0x04, 0xA8, 0x08, 0x18,
0x23, 0x46, 0x2A, 0x46, 0x01, 0x99, 0xFF, 0xF7, 0xD5, 0xFD, 0x30, 0x46,
0x0C, 0x21, 0x48, 0x43, 0x04, 0xA9, 0x1C, 0x90, 0x08, 0x58, 0x05, 0x22,
0x01, 0x99, 0xD2, 0x03, 0x89, 0x18, 0x88, 0x42, 0x01, 0xDA, 0x01, 0x21,
0x1A, 0x91, 0x16, 0x99, 0x00, 0x29, 0x01, 0xD0, 0x02, 0x99, 0x03, 0xE0,
0x1A, 0x99, 0x00, 0x29, 0xFA, 0xD0, 0x01, 0x99, 0x40, 0x1A, 0x01, 0x12,
0x00, 0xD5, 0x00, 0x21, 0xE8, 0xB2, 0x00, 0xF0, 0x89, 0xF8, 0x07, 0x1E,
0x00, 0xDC, 0x01, 0x27, 0x16, 0x98, 0x01, 0x28, 0x06, 0xD1, 0x39, 0x48,
0x0D, 0x9A, 0x43, 0x6F, 0x38, 0x46, 0x01, 0x99, 0x98, 0x47, 0x07, 0x46,
0x1B, 0x98, 0x00, 0xE0, 0x44, 0xE0, 0x02, 0x28, 0x3A, 0xDA, 0x38, 0x48,
0x87, 0x42, 0x37, 0xDA, 0x1C, 0x99, 0x04, 0xA8, 0x08, 0x18, 0x13, 0x99,
0x1C, 0x90, 0x40, 0x68, 0x49, 0x1C, 0x01, 0xF7, 0x77, 0xFD, 0x30, 0x49,
0x09, 0x68, 0x09, 0x79, 0x09, 0x06, 0x01, 0xD5, 0xFF, 0xF7, 0xE4, 0xFD,
0xFF, 0x28, 0x00, 0xD9, 0xFF, 0x20, 0x27, 0x49, 0x12, 0x23, 0x8A, 0x78,
0x52, 0x1C, 0x8A, 0x70, 0x1B, 0x9A, 0x5A, 0x43, 0xE3, 0x00, 0xE3, 0x18,
0xD2, 0x18, 0x52, 0x19, 0x52, 0x1E, 0x92, 0x00, 0x51, 0x18, 0x88, 0x75,
0x8F, 0x82, 0xCD, 0x75, 0x10, 0x98, 0xC0, 0x69, 0xB8, 0x42, 0x01, 0xD9,
0x10, 0x98, 0xC7, 0x61, 0x10, 0x98, 0xC8, 0x22, 0x01, 0x6A, 0x38, 0x46,
0x03, 0xF7, 0x88, 0xF8, 0x00, 0x28, 0x05, 0xD0, 0x17, 0x48, 0x1C, 0x99,
0x82, 0x68, 0x89, 0x68, 0x51, 0x18, 0x81, 0x60, 0x1B, 0x98, 0x40, 0x1C,
0x76, 0x1C, 0x1B, 0x90, 0x18, 0x98, 0x86, 0x42, 0x00, 0xDA, 0x7B, 0xE7,
0x6D, 0x1C, 0x0A, 0x2D, 0x04, 0xDA, 0x16, 0x48, 0x00, 0x78, 0x00, 0x28,
0x00, 0xD1, 0x03, 0xE7, 0x0D, 0x4D, 0x23, 0x46, 0x6E, 0x6E, 0x0B, 0x4A,
0x80, 0x21, 0x15, 0x98, 0xB0, 0x47, 0x11, 0x48, 0x00, 0x6B, 0x80, 0x47,
0x61, 0x1C, 0x88, 0x42, 0x02, 0xD1, 0x10, 0x98, 0xC1, 0x69, 0x01, 0x62,
0x2B, 0x6C, 0x22, 0x46, 0x1F, 0x99, 0x1E, 0x98, 0x98, 0x47, 0x40, 0xB2,
0xA0, 0xE6, 0x00, 0x00, 0x00, 0x3C, 0x20, 0x00, 0x88, 0x44, 0x20, 0x00,
0x38, 0x3C, 0x20, 0x00, 0x08, 0x42, 0x20, 0x00, 0x3F, 0x42, 0x0F, 0x00,
0x80, 0x3A, 0x20, 0x00, 0x30, 0x75, 0x00, 0x00, 0xB4, 0x14, 0x00, 0x00,
0x00, 0x40, 0x20, 0x00, 0x38, 0x3F, 0x20, 0x00, 0x40, 0x08, 0x0A, 0x4A,
0x80, 0x00, 0x80, 0x18, 0x40, 0x68, 0x0F, 0x23, 0x80, 0x08, 0x48, 0x43,
0x07, 0x49, 0x40, 0x0B, 0x48, 0x43, 0x91, 0x6A, 0x80, 0x31, 0x09, 0x6A,
0x8A, 0x02, 0x92, 0x0F, 0x09, 0x02, 0x9A, 0x1A, 0xC9, 0x0F, 0x51, 0x1A,
0x08, 0x41, 0x70, 0x47, 0x80, 0x3A, 0x20, 0x00, 0x51, 0x07, 0x00, 0x00,
0x01, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, 0xC8, 0x59, 0x20, 0x00,
0x92, 0x00, 0x52, 0x18, 0x01, 0xE0, 0x08, 0xC9, 0x08, 0xC0, 0x8A, 0x42,
0xFB, 0xD1, 0x70, 0x47, 0x10, 0xB5, 0x92, 0x00, 0x12, 0x18, 0x03, 0xE0,
0x0C, 0x68, 0x03, 0x68, 0x10, 0xC0, 0x08, 0xC1, 0x82, 0x42, 0xF9, 0xD1,
0x10, 0xBD, 0x00, 0x00, 0xF8, 0xB5, 0x18, 0x4F, 0x18, 0x4D, 0x00, 0x24,
0xB4, 0x20, 0x60, 0x43, 0xC1, 0x19, 0x14, 0x20, 0x60, 0x43, 0x46, 0x19,
0x36, 0x1D, 0x05, 0x22, 0x30, 0x46, 0xA8, 0x31, 0xFF, 0xF7, 0xDC, 0xFF,
0x30, 0x46, 0x00, 0xF0, 0x07, 0xF9, 0x64, 0x1C, 0xE4, 0xB2, 0x02, 0x2C,
0xEC, 0xD3, 0x0E, 0x48, 0x2C, 0x30, 0x00, 0xF0, 0xF3, 0xF8, 0x00, 0x20,
0x01, 0x46, 0x82, 0x00, 0x52, 0x19, 0x40, 0x1C, 0xD1, 0x63, 0x2F, 0x28,
0xF9, 0xD3, 0x08, 0x48, 0x31, 0x24, 0xE0, 0x30, 0x04, 0x75, 0x03, 0xF7,
0x35, 0xFF, 0xE0, 0x30, 0x04, 0x72, 0x6F, 0x20, 0x28, 0x70, 0x19, 0x21,
0x04, 0xF7, 0xB0, 0xFB, 0xF8, 0xBD, 0x00, 0x00, 0xC0, 0x3D, 0x20, 0x00,
0xC8, 0x59, 0x20, 0x00, 0xF8, 0xB5, 0x1B, 0x4D, 0x06, 0x46, 0x28, 0x78,
0xB0, 0x42, 0x30, 0xD0, 0x19, 0x4F, 0x00, 0x24, 0xB4, 0x20, 0x60, 0x43,
0xC1, 0x19, 0x14, 0x20, 0x60, 0x43, 0x40, 0x19, 0x05, 0x22, 0x00, 0x1D,
0xA8, 0x31, 0xFF, 0xF7, 0xAB, 0xFF, 0x64, 0x1C, 0xE4, 0xB2, 0x02, 0x2C,
0xF0, 0xD3, 0x10, 0x48, 0x04, 0x22, 0x11, 0x49, 0x2C, 0x30, 0xFF, 0xF7,
0xA1, 0xFF, 0x03, 0xF7, 0x09, 0xFF, 0x01, 0x46, 0x0B, 0x48, 0x2F, 0x22,
0x30, 0x31, 0x3C, 0x30, 0xFF, 0xF7, 0x98, 0xFF, 0x03, 0xF7, 0x00, 0xFF,
0xE0, 0x30, 0x0A, 0x49, 0x00, 0x7A, 0x48, 0x70, 0x07, 0x21, 0x04, 0xF7,
0x7B, 0xFB, 0x08, 0x48, 0x80, 0x6A, 0x80, 0x47, 0x2E, 0x70, 0x19, 0x21,
0x30, 0x46, 0x04, 0xF7, 0x73, 0xFB, 0xF8, 0xBD, 0xC8, 0x59, 0x20, 0x00,
0xC0, 0x3D, 0x20, 0x00, 0xE4, 0x3C, 0x20, 0x00, 0xA0, 0x3A, 0x20, 0x00,
0x38, 0x3C, 0x20, 0x00, 0x70, 0xB5, 0x14, 0x46, 0x0D, 0x46, 0x03, 0xF7,
0x9D, 0xF8, 0xFF, 0xF7, 0x67, 0xFF, 0x6E, 0x28, 0x15, 0xD1, 0x80, 0x35,
0x28, 0x6B, 0x0A, 0x4D, 0x29, 0x46, 0x01, 0xF7, 0x29, 0xFE, 0x49, 0x04,
0xC0, 0x0B, 0x08, 0x43, 0x07, 0x4E, 0x00, 0x2C, 0x70, 0x62, 0x08, 0xD0,
0x80, 0x34, 0x29, 0x46, 0x20, 0x6B, 0x01, 0xF7, 0x1D, 0xFE, 0x49, 0x04,
0xC0, 0x0B, 0x08, 0x43, 0xB0, 0x62, 0x70, 0xBD, 0xA7, 0x04, 0x00, 0x00,
0x80, 0x3B, 0x20, 0x00, 0x70, 0xB5, 0x06, 0x46, 0x0D, 0x48, 0x00, 0x24,
0x00, 0x68, 0xC5, 0xB2, 0x03, 0xF7, 0xBA, 0xFE, 0xC1, 0x7E, 0x08, 0x07,
0x80, 0x0F, 0x89, 0x07, 0x89, 0x0F, 0x05, 0x40, 0x01, 0x40, 0x8D, 0x42,
0x05, 0xD1, 0x03, 0xF7, 0xAF, 0xFE, 0x80, 0x7E, 0x05, 0xF7, 0xED, 0xFE,
0x00, 0xE0, 0x0D, 0x24, 0x21, 0x46, 0x30, 0x46, 0x06, 0xF7, 0x2E, 0xFE,
0x70, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x10, 0xB5, 0x72, 0xB6,
0x10, 0x48, 0x04, 0x78, 0x00, 0x21, 0x6E, 0x2C, 0x06, 0xD0, 0x6F, 0x2C,
0x04, 0xD0, 0x21, 0x2C, 0x0C, 0xD0, 0xFF, 0x2C, 0x11, 0xD0, 0x12, 0xE0,
0x01, 0x70, 0x62, 0xB6, 0x20, 0x46, 0xFF, 0xF7, 0x67, 0xFF, 0x00, 0x21,
0x20, 0x46, 0x06, 0xF7, 0x13, 0xFE, 0x04, 0xE0, 0x01, 0x70, 0x62, 0xB6,
0x20, 0x46, 0xFF, 0xF7, 0xC3, 0xFF, 0x40, 0xBF, 0x10, 0xBD, 0x04, 0xF7,
0x87, 0xFA, 0x06, 0xF7, 0x65, 0xFD, 0x10, 0xBD, 0x39, 0x45, 0x20, 0x00,
0x08, 0x48, 0x01, 0x69, 0xC9, 0x07, 0x0A, 0xD0, 0x81, 0x68, 0x40, 0x6A,
0x7D, 0x22, 0xD2, 0x00, 0x90, 0x42, 0x04, 0xD9, 0x89, 0x08, 0x81, 0x42,
0x01, 0xD2, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00,
0x00, 0x00, 0x02, 0x40, 0x70, 0xB5, 0xB4, 0x22, 0x09, 0x4B, 0x42, 0x43,
0xD4, 0x18, 0x8C, 0x34, 0xA2, 0x6A, 0x1F, 0x26, 0x13, 0x04, 0xF6, 0x02,
0xB2, 0x43, 0xDD, 0x0E, 0xA2, 0x62, 0x07, 0xF7, 0x0F, 0xF8, 0xA0, 0x6A,
0xE9, 0x02, 0xB0, 0x43, 0x08, 0x43, 0xA0, 0x62, 0x70, 0xBD, 0x00, 0x00,
0xC0, 0x3D, 0x20, 0x00, 0x00, 0x22, 0x04, 0x49, 0x42, 0x60, 0x01, 0x60,
0x02, 0x49, 0xC2, 0x60, 0xC5, 0x39, 0x81, 0x60, 0x70, 0x47, 0x00, 0x00,
0xCD, 0x6C, 0x00, 0x00, 0x3F, 0x22, 0xC1, 0x68, 0x52, 0x01, 0x91, 0x43,
0x07, 0x22, 0xD2, 0x01, 0x89, 0x18, 0x07, 0x4A, 0x91, 0x43, 0xC1, 0x60,
0x41, 0x68, 0x52, 0x04, 0x91, 0x43, 0x41, 0x60, 0x04, 0x4A, 0x01, 0x68,
0x91, 0x43, 0x03, 0x22, 0xD2, 0x02, 0x89, 0x18, 0x01, 0x60, 0x70, 0x47,
0x18, 0x00, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0x70, 0xB5, 0x15, 0x4C,
0xE0, 0x6C, 0x80, 0x47, 0x03, 0xF7, 0x24, 0xFE, 0x13, 0x49, 0x40, 0x7E,
0x4A, 0x6B, 0xC0, 0x06, 0x13, 0x04, 0xC0, 0x0E, 0xDB, 0x0E, 0x00, 0x28,
0x1A, 0xD0, 0x98, 0x42, 0x18, 0xD1, 0x40, 0x1E, 0x1F, 0x23, 0xC0, 0x06,
0xDB, 0x02, 0x05, 0x0C, 0x9A, 0x43, 0x2A, 0x43, 0x08, 0x46, 0x80, 0x30,
0x4A, 0x63, 0x81, 0x6E, 0x99, 0x43, 0x29, 0x43, 0x81, 0x66, 0x20, 0x6B,
0x80, 0x47, 0x61, 0x6B, 0x88, 0x47, 0x06, 0x48, 0x06, 0xF7, 0x21, 0xFA,
0x20, 0x6C, 0x80, 0x47, 0x00, 0x20, 0x70, 0xBD, 0x03, 0x20, 0x70, 0xBD,
0x38, 0x3F, 0x20, 0x00, 0x40, 0x3E, 0x20, 0x00, 0x98, 0x80, 0x10, 0x00,
0x00, 0x00, 0x88, 0x05, 0x37, 0x0B, 0x27, 0x11, 0x65, 0x17, 0x02, 0x1E,
0x1E, 0x25, 0xBF, 0x2C, 0xF5, 0x34, 0xC7, 0x3D, 0x27, 0x47, 0xF6, 0x50,
0x09, 0x5B, 0x38, 0x65, 0x61, 0x6F, 0x72, 0x79, 0x62, 0x83, 0x30, 0x8D,
0xDC, 0x96, 0x62, 0xA0, 0xBA, 0xA9, 0xD9, 0xB2, 0xAE, 0xBB, 0x2B, 0xC4,
0x3F, 0xCC, 0xE9, 0xD3, 0x2E, 0xDB, 0x06, 0xE2, 0x8B, 0xE8, 0xB8, 0xEE,
0xA9, 0xF4, 0x68, 0xFA, 0xFF, 0xFF, 0x00, 0x00])

tmf882x_image_termination = 0x00200089;
tmf882x_image_start = 0x00200000;
tmf882x_image_finish = 0x00200A4C;
tmf882x_image_length = 0x00000A4C;

介绍:这个固件数据可以直接拿去移植。

 

2.下载固件的函数:

def download_image(i2c,device_addr,image_data,image_start):

    """

    下载image固件到传感器设备

    image_data:包含固件数据的列表,如[0x01, 0x22, 0x1E, 0x1F, ...]

    """

    print("\n开始下载image固件数据……")

    print(f"image起始地址:{image_start}")

    

    #测试代码(可删)

    data = i2cRx(tmf882x_addr, REG_CMD_STAT, 3)

    print(f"发指令之前,CMD_STAT寄存器的数据为{list(data)}")

    

    # 发DOWNLOAD_INIT指令,初始化设备

    i2cTx(tmf882x_addr, REG_CMD_STAT, [0x14, 0x01, 0x29, 0xC1])

    

    # 检查CMD_STAT寄存器是否为READY

    tmf8828CheckCmdStatIsReady()

    

    # 发SET_ADDR指令,写入读取的image数据的首地址

    tmf8828BootloaderSetRamAddr(tmf882x_image_start)

    

    # 检查CMD_STAT寄存器是否为READY

    tmf8828CheckCmdStatIsReady()

    

    # 发W_RAM指令开始真正下载image固件数据

    tmf8828BootloaderWriteRam()

    

    # 检查CMD_STAT寄存器是否为READY

    tmf8828CheckCmdStatIsReady()

    

    # 下载完成后,发RAMREMAP_RESET指令,并在指定时间内轮询Appid的值是否返回应用程序的值

    tmf8828BootloaderRamRemap()

    

    print("固件image下载全部完成。")

介绍:这个函数统合了各个小功能,从而实现了固件下载,函数结构可以参考这种实现方式,之后我的不少功能都是依赖这种功能划分和功能统合实现的。

 

3.检查寄存器的值是否是某个指定值的代码

def tmf8828CheckRegister(REG, value, length, Timeout):

    """

    注意:目前仅可对单个数据进行这样的操作。

    在指定时间(ms)内进行检测,如果该时间内能够检测到寄存器变为指定的值,

    就返回True,超时返回False。

    """

    sum_time = 0

    while sum_time < Timeout:

        rx_data = i2cRx(tmf882x_addr, REG, length)

        if length == 1:

            rx_data = rx_data[0]

        else:

            rx_data = list(rx_data)

        if rx_data == value:

            return True

        sleep_ms(1)

        sum_time += 1

    return False

介绍:这个函数是用的比较多的,用于检查某个寄存器是否在指定时间内被置成了某一个值,常用于检查。

 

4. 测量数据处理打印输出函数

def print_data(data):

    """

    专门用来处理测量结果的3*16个数据,按44列格式输出16个距离和置信度值

    data: 原始数据列表

    """

    # 将数据分组,每三个一组

    groups = [data[i:i+3] for i in range(0, len(data), 3)]

    

    # 移除第9组和第18组数据

    groups.pop(8)  # 先移除第9

    groups.pop(-1)  # 再移除最后一组(第18组)

    

    # 处理每组数据

    formatted_groups = []

    for group in groups:

        confidence = group[0] / 255.0  # 将置信度从0-255映射回0-1

        distance = group[1] + (group[2] << 8)  # 合并距离的低8位和高8

        formatted_groups.append(f"{distance},{confidence:.3f}")

    

    # 每行输出四组数据

    for i in range(0, len(formatted_groups), 4):

        line = "    ".join(formatted_groups[i:i+4])

        print(line)

介绍:这个函数将读取寄存器返回的字节数据进行处理,排除2个未用数据,剩下16个数据,将其处理出距离和置信度,并按照4*4的格式进行输出。

 

下面是计算夹角和距离的类的函数:

5.通过手册计算tmf8821的4*4模式7的各个待测方向视场角,作为计算坐标的参数。

def __init__(self):
# 预设4*4的视场角度
self.h_angles = [-15.27, -4.83, 4.83, 15.27] # 水平角度
self.v_angles = [-18.75, -5.54, 5.54, 18.75] # 垂直角度


6.通过给定的各点的视场角和传感器测出的距离,计算各个测量点的坐标,为拟合平面做准备。

def _convert_to_xyz(self, distance, h_angle, v_angle):
"""将距离和角度转换为3D坐标"""
h_rad = math.radians(h_angle)
v_rad = math.radians(v_angle)

x = distance * math.cos(v_rad) * math.sin(h_rad)
y = distance * math.sin(v_rad)
z = distance * math.cos(v_rad) * math.cos(h_rad)

return x, y,


7.使用加权最小二乘法拟合平面

points: [(x, y, z), ...] 格式的点列表

weights: 对应的权重列表(基于置信度)

def _fit_weighted_plane(self, points, weights):
"""
使用加权最小二乘法拟合平面
points: [(x, y, z), ...] 格式的点列表
weights: 对应的权重列表(基于置信度)
"""
# 计算加权质心
total_weight = sum(weights)
sum_x = sum(p[0] * w for p, w in zip(points, weights))
sum_y = sum(p[1] * w for p, w in zip(points, weights))
sum_z = sum(p[2] * w for p, w in zip(points, weights))
centroid = (sum_x/total_weight, sum_y/total_weight, sum_z/total_weight)

# 构建加权协方差矩阵
xx = xy = xz = yy = yz = zz = 0
for p, w in zip(points, weights):
x = (p[0] - centroid[0]) * math.sqrt(w)
y = (p[1] - centroid[1]) * math.sqrt(w)
z = (p[2] - centroid[2]) * math.sqrt(w)
xx += x * x
xy += x * y
xz += x * z
yy += y * y
yz += y * z
zz += z * z

det_x = yy*zz - yz*yz
det_y = xx*zz - xz*xz
det_z = xx*yy - xy*xy

if det_x >= det_y and det_x >= det_z:
a = det_x
b = xz*yz - xy*zz
c = xy*yz - xz*yy
elif det_y >= det_x and det_y >= det_z:
a = xz*yz - xy*zz
b = det_y
c = xy*xz - yz*xx
else:
a = xy*yz - xz*yy
b = xy*xz - yz*xx
c = det_z

magnitude = math.sqrt(a*a + b*b + c*c)
return (a/magnitude, b/magnitude, c/magnitude)


8.计算方位角、倾斜角和垂直距离

def calculate_angle(self, distances, confidences):
"""
计算方位角、倾斜角和垂直距离
distances: 16个距离值的列表,无效值用None表示
confidences: 16个置信度值的列表(0-1之间)
返回:(倾斜角度, 方位角)
倾斜角度:正值表示向上倾斜,负值表示向下倾斜
方位角:0-360度,表示倾斜的方向(0度为正北/前方)
"""
points = []
weights = []

for i in range(4):
for j in range(4):
idx = i * 4 + j
distance = distances[idx]
confidence = confidences[idx]

if idx != 8 and distance > 0 and confidence > 0:
x, y, z = self._convert_to_xyz(distance,
self.h_angles[j],
self.v_angles[i])
points.append((x, y, z))
weights.append(confidence) # 使用置信度作为权重

if len(points) < 3:
return None, None

# 获取加权拟合的法向量
normal = self._fit_weighted_plane(points, weights)

# 计算倾斜角度(与z轴的夹角)
tilt_angle = math.degrees(math.acos(normal[2]))

# 计算方位角(在x-y平面上的投影方向)
azimuth = math.degrees(math.atan2(normal[1], normal[0]))
if azimuth < 0:
azimuth += 360

# 计算加权平均点
total_weight = sum(weights)
x0 = sum(p[0] * w for p, w in zip(points, weights)) / total_weight
y0 = sum(p[1] * w for p, w in zip(points, weights)) / total_weight
z0 = sum(p[2] * w for p, w in zip(points, weights)) / total_weight
a = normal[0]
b = normal[1]
c = normal[2]

# 计算该点到拟合平面的距离
d = -(a*x0 + b*y0 + c*z0)
vertical_juli = abs(d) / math.sqrt(a*a + b*b + c*c)

return tilt_angle, azimuth, vertical_juli


9.根据计算出的方位角,倾斜角和垂直距离,返回关于方向的文字描述,便于之后输出到屏幕上。

def explain_orientation_english(self, tilt_angle, azimuth):
"""
Provide explanation of plane tilt direction in English
For vertically mounted sensor (Z-axis horizontal forward)
"""
if not tilt_angle:
return "Invalid angle"

if abs(tilt_angle) < 5:
return "Level"

# Direction based on azimuth
if azimuth < 22.5 or azimuth >= 337.5:
direction = "Up"
elif azimuth < 67.5:
direction = "Up-Left"
elif azimuth < 112.5:
direction = "Left"
elif azimuth < 157.5:
direction = "Down-Left"
elif azimuth < 202.5:
direction = "Down"
elif azimuth < 247.5:
direction = "Down-Right"
elif azimuth < 292.5:
direction = "Right"
else:
direction = "Up-Right"


五、功能展示图及说明

实现的功能列表如下:(包含对功能的说明和分类)

image.png 

还有实际演示的图片:(从演示视频里面部分重要的图片放进去)

1.平行:


2.右倾斜:


3.左倾斜:

演示图片3(左).png


4.下倾斜:

演示图片4(下).png


5.上倾斜:

演示图片5(上).png


6.上-左倾斜:(其实其他倾斜方向结合的也有,这里就不截太多了)

演示图片6(上-左).png


7.垂直距离拉远:(其实可以测的距离范围很大可以达至少1m,也就是1000mm。)

演示图片7(较远的垂直距离).png



六、项目中遇到的难题及解决办法

我在项目中遇到的问题可就多了。

1. 出现无法读出设备地址的问题。
解决办法:我找到老师询问,他给了我示波器让我进行实验,看是什么原因导致没有结果,经过多番实验,发现是因为没有在micropython代码中设置i2c通信的两个引脚并传入i2c对象,导致没有输出,无法找到地址。


2. 不知道download image是在干嘛,以为是下载图片的功能。
解决办法:其实download image在询问了AI,然后又去本次禁赛的官方群内询问了群友后才知道image指的是固件firmware,它包含本次使用的艾迈斯欧司朗dToF传感器的核心算法。这里其实是在写入固件数据。然后我就按照手册一步一步完成。


3. 不理解i2c通信是怎么使设备实现那么复杂的功能的。
解决办法:查看通信手册,发现它都是通过发送指令值来指导设备实现某个功能的,然后结合前面image的理解,可以认为发送指令给设备后,它就会执行对应的算法来实现其设备功能。


4. 不知道rp2040 gamekitboot按键是哪一个。
解决办法:问官方群内的群友,说是那个按键B,实在没想到,因为尝试了reset按键,start按键都不是,结果是这个控制用的B按键。


5. 从官网下载了tmf8821python库,却发现在rp2040上跑不起来。
解决办法:检查python库代码,发现它并不能跑在rp2040上,因为rp2040一般只能跑micropython代码和C/C++代码,许多python独有的库在micropython中是没有的。进一步检查代码,发现这个代码是专门写给官方特供的EVM开发板上才能直接跑的,并不能在rp2040上直接套用。


6. 不知道怎么获取固件数据。
解决办法:询问群友,发现image原来是固件数据,联想到固件的英文是firmware,想起来直播回放中提到说官网有提供firmware包,果然,上去就找到了这个包,但是它是hex类型的。需要再转写成程序中的代码,方便后续写入。此处还没有直接使用它。


7. 不知道怎么移植,缺乏参考代码,在bootloader下载固件的某一步看不懂手册的内容,卡住了。
解决办法:询问群友,有群友发来了一个arduino包,是直播回放中提到的完整实现了基础功能的代码。借助这个代码的函数和结构(它的结构真的写的非常清楚),后续我又参照手册,最终才能完成全部的代码移植。有一处意外之喜是,在代码中我发现了用C语言写的固件数据数组,于是我可以直接把它搬到micropython代码中,而不需要把官方的原始hex类型的固件文件进行转换。


8. 不理解为什么最后测出来的数据中间小四周大。
解决办法:仔细思考,发现传感器对中间区域测距的时候,由于视场角小,所以距离小;而四周视场角大,所以距离大。这是正常现象。


9. 出现测出来只有9个数据的情况,明明我的传感器是准备测4*4的,而且我在出厂校准后明明进行了设置。
解决办法:因为我的出厂校准只会在需要的时候校准后存储出输出,并不会在正常测量的时候再执行出厂校准的代码,因此采用了默认3*3设置。于是,需要在使能后,也即测量前进行设备的配置,配置好测量周期、迭代次数、spad_map_id(此处可以设置4*4模式,我赋值7)、触发结果中断的阈值范围、是否有一次测量结果就输出(一般赋值0)、中断掩码(这个值应该固定赋值0x3FFFF)、是否进行直方图转储(测量的时候这个值应该赋值0)。


10. 测量的时候出现即使平面几乎平行于传感器面,第三列的测距数据也明显小于第二列数据的奇怪情况。还出现当测量的距离在20~100这个范围内的时候,输出结果非常不稳定,经常出现测距值突然变成0的情况,尤其最下面那一排数据最容易出现这种情况,而上面的几行却比较少出现这种情况。
解决办法:这是一个困扰了我很久的问题,我想不通,为什么最下面那一行最容易出问题呢?然后我联想到我之前校准的时候是将dtof模块立在了桌子上,而这就是引发问题的关键。因为校准的环境是有要求的,要求传感器面前的视场的40cm内没有物体,而我将dtof模块仅仅是立在了桌面上,这导致斜向下40cm内是有物体的,也就是桌面。这不符合校准环境。于是我重新调准环境(确保视场的40cm内没有物体),重新进行校准,得到的校准数据重新放入测量,发现这次没有出现上述的奇怪现象了!果然,校准是需要非常严谨的进行的,不然会非常影响结果。


11. 不知道怎么实现题目一:测量并计算传感器平面和面前平面的夹角。

解决办法:我本来想自己解决,但是总感觉我自己的办法不够好,不够精确。然后抱着试一试的心思询问了AI,然后它写的用16个点拟合平面的方法我觉得很有戏,于是拿一些数据试了一下,发现可行,于是,我进一步提示它加入了置信度数据的加权、命令行指令的交互、对某些自己不想要的数据的剔除、增加对测量结果的文字解释输出、计算传感器和拟合平面的距离(即垂直距离)等功能。它完成的还不错,经过一些修改和精简,并和我的代码融合,debug了一下,就能用了,而且效果不错。如果没有AI的帮助,我很难想我能在短短一个星期时间内从0开始搓823行代码(甚至还不含程序存储的image固件数据和校准数据)。


七、对本次竞赛的心得体会(包括意见和建议)

这是一场对我的磨炼。我以往从未想过有一天我真的能对着官方的数据手册和通信手册手搓传感器的驱动代码;我从未想过有一天我需要去在不同语言间移植驱动,刚开始,我觉得其工程量将是我难以预估,其难度将是我难以把握的;我从未想过我仅仅在一个星期内就将这件事情完成了,尽管我一整天都投入在这上面。

这个过程中我遇到过许多难以解决的问题,甚至有的问题超出了手册所能解答的范畴。于是我探索,于是我发问,感谢竞赛官方群内的好心的群友们从百忙之中抽出时间为我解答各种各样的奇怪问题,没有他们,我绝对很难在这么短的时间内完成这个项目,特此感谢。

这次竞赛对我来说最大的收获是学会了手搓驱动,学会了看数据手册,学会了理解别人的代码并移植为其他语言的代码。不得不说,用C语言写的代码真的比用python写的代码库要清晰好多,看的非常舒服,而且结构也安排的非常合理。不同的文件各司其职。

建议是:希望能将官方相关文件汇总起来,放到竞赛群文件中,方便查找和下载,如果能有一个README文件说明这些文件分别都是什么功能,有什么用,哪些是比较重要的,那就再好不过了!

软硬件
元器件
RP2040
树莓派基金会推出的低成本、高性能、双核Arm Cortex M0+微控制器,主频可以到133MHz RAM容量:264KB GPIO端口数量:30
附件下载
项目代码-micropython.zip
注意:其中导入的校准数据对于不同的dtof设备需要重新测量并存储到校准数据文件。且校准数据的准确性会很大程度影响测量结果的准确性。
团队介绍
大三学生,寒假学习
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号