多个VL53L1x+stm32+2D扫描


参考的是https://blog.csdn.net/tiramisu_l/article/details/90729964这篇博客的基本的测距代码,后面加上了多个测距模块的串联以及2D扫描,本着取之社区,用之社区的想法,同大家一起交流(面向CSDN编程 ).
这个小项目是毕设前的练手,主要灵感来自于意法半导体官网的2D扫描的视频.通常对于VL53L1x测距芯片主要用到他的测距模块,而这块芯片还可以编程控制ROI进行2D小角度的扫描,再加上几个测距模块的串联,就可以实现较大的角度的2D扫描.
采用的stm32f103RC+多个GY-53-L1X模块.

序中的博客已经详细的阐述了芯片工作原理和测距流程,配合着官方的用户手册应该不难理解其原理和流程,这里不再赘述.
值得一提的是我看上篇博客的作者也是尝试了两个模块的IIC串联,注释的代码中还有部分痕迹.
还有一点就是根据需要改变两次测量之间的间隔时间,原文中因为只需要单次测距间距有些偏大,而要进行2D扫描就需要更快的测距,更小的测距间距.
在vl53l1x.c文件中VL53L1_SetInterMeasurementPeriodMilliSeconds这个函数根据需要修改.
配置好文件就可以实现单次测距,本次采用的是GY-53-L1X模块,需要将ps接地来实现直接控制芯片,PA2对应DATA,PA3对应SCL.
本文着重讲述多个模块的IIC串联及改变ROI实现2D扫描.

通过编程改变ROI实现2D扫描

这部分较简单,官方的api用户手册有例子教你如何设置ROI,主要用到的函数是VL53L1_SetUserROI(),需要注意的是最小的ROI size是4*4,在每次测距前改变ROI即可实现扫描.参考程序:

VL53L1_UserRoi_t roiConfig;
roiConfig.TopLeftX = 9;
roiConfig.TopLeftY = 13;
roiConfig.BotRightX = 14;
roiConfig.BotRightY = 10;
status = VL53L1_SetUserROI(&VL53L1Dev, &roiConfig);


上图取自于官方手册,成像是倒立成像,接收器前应该有个透镜.
判断哪个是发射端哪个是接收端可以通过芯片上很小的一个方形和一个圆形的刻蚀来判断,应该是一个防呆口设计.

多个IIC串联实现多个测距模块实时测距

这部分我浪费了很长时间,主要的难点在于单个芯片地址的设置.
VL53L1x官方手册中没有提到对芯片地址的操作,而要实现多个测距模块的测距就需要对各个芯片赋予不同的地址.
在对芯片进行初始化中来改变芯片的地址,主要用到VL53L1_init(*pDev,I2cAddr)初始化函数中VL53L1_SetDeviceAddress(dev,newaddr)这个函数来改变芯片的地址.
对地址的设置还需要有前后顺序,至少我是这样的,如下代码,对不同的芯片赋予不同的地址并初始化,0x52是芯片的默认地址.(这段为什么要这样的顺序仍有抱有问题,这里浪费了很长时间,具体原因可能需要后来的朋友来解决.)

	Status = VL53L1_init(&VL53L1_dev[0],0x50); 
	Status = VL53L1_set_mode(&VL53L1_dev[0],mode);
	
	Status = VL53L1_init1(&VL53L1_dev[1],0x54);	
	Status = VL53L1_set_mode(&VL53L1_dev[1],mode);
	
	Status = VL53L1_init2(&VL53L1_dev[2],0x52);	
	Status = VL53L1_set_mode(&VL53L1_dev[2],mode);	

通过如下代码实现对不同芯片的控制,比如第一个芯片XShut接在PA4,第二个Xshut在PA1,第三个在PA0;

#define XShut3_Pin GPIO_Pin_0
#define XShut3_GPIO_Port GPIOA
#define XShut2_Pin GPIO_Pin_1
#define XShut2_GPIO_Port GPIOA
#define XShut_Pin GPIO_Pin_4
#define XShut_GPIO_Port GPIOA

通过Xshut开关实现对不同芯片的控制(就是官方文档中的开机初始化的时序图)

	XShut_Off;
	delay_ms(2);
	XShut_On;
	delay_ms(2);

通过多个测距芯片的IIC串联再结合编程改变ROI,即实现了多个芯片的2d扫描,通过调试实现每个芯片7个角度的扫描,每秒约有2帧的刷新率.
stm32上接个LCD屏,让所得的深度数据呈现在LCD屏上.
在这里插入图片描述

没有容器导致比较混乱,后续计划3D打印个外壳把模块装进去.

参考代码多个vl53l1x+stm32

2020.11.30 于杭州

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值