发表于: 2019-3-28 15:57:50 | 显示全部楼层

以前我在不同的项目中成功使用过飞行时间(ToF)传感器VL6180X 。 VL6180X非常棒,但最大只能测量20厘米的距离,并且在“扩展模式”下能达到60厘米的距离。在使用距离超过该极限的项目中,合理的选择是VL53L0X,其测量距离在30厘米到100厘米之间,最大可测量200厘米。本文中,我使用的是Adafruit的VL53L0X分线板,但有类似的产品可供选择,如Pololu

nxp-k20dx128-with-adafruit-vl53l0x-tof-sensor.png

恩智浦K20dx128连接Adafruit VL53L0x传感器


Adafruit的分线板模块(https://www.adafruit.com/product/3317)包含所有需要的电平转换器,并且易于与微控制器连接:

vl53l0x-breakout-module.png

vl53l0x分线板模块


在本文中,我使用的是tinyK20 NXP Kinetis K20DX128微控制器(运行频率为50 MHz的ARM Cortex-M4)。需要的引脚是GND、3.3V(VIN)以及I2C SCL和SDA信号。 GiHub上提供了一个Eclipse(GNU gcc)示例项目。


软件代码

与VL6180X不同,VL53L0X比较复杂,有些难以初始化和运行。 STM意法半导体提供了一个相当繁重的驱动程序库,我发现如果没有该驱动程序库中,则可能无法使用该设备。并且似乎运行传感器所需的初始化序列仅在该驱动程序库“文档化”。所以我花了一段时间才把它弄好,但最后它起作用了:-)。

example-project-files-in-eclipse.png

eclipse中的示例项目文件


我已经集成了STM库文件,并通过vl53l0x.c和vl53l0x.h添加了一个简单的接口。这使得使用传感器相当容易,我在应用程序中所要做的就是初始化传感器,之后我可以在无限循环中读取传感器的距离值:

  1. #include "Application.h"
  2. #include "LED1.h"
  3. #include "WAIT1.h"
  4. #include "CLS1.h"
  5. #include "PORT_PDD.h"
  6. #include "Shell.h"
  7. #include "vl53l0x.h"

  8. void APP_Start(void) {
  9.   int16_t mm;
  10.   uint8_t res;
  11.   int cntr;

  12.   /* need pull-up on UART Rx pin (PTC3) on tinyK20 */
  13.   PORT_PDD_SetPinPullSelect(PORTC_BASE_PTR, 3, PORT_PDD_PULL_UP);
  14.   PORT_PDD_SetPinPullEnable(PORTC_BASE_PTR, 3, PORT_PDD_PULL_ENABLE);

  15.   CLS1_SendStr("\r\n*****************************\r\nVL53L0X with tinyK20\r\n*****************************\r\n", CLS1_GetStdio()->stdOut);
  16.   /* initialization */
  17.   do {
  18.     res = VL53L0X_Init();
  19.     if (res!=ERR_OK) {
  20.       CLS1_SendStr("ERROR: failed VL53L0X_Init()!\r\n", CLS1_GetStdio()->stdOut);
  21.       WAIT1_Waitms(1000);
  22.     }
  23.   } while(res!=ERR_OK);

  24.   cntr = 0;
  25.   for(;;) { /* main loop */
  26.     cntr++;
  27.     if (cntr>60) { /* slow down measurements */
  28.       cntr = 0;
  29.       do {
  30.         res = VL53L0X_MeasureSingle(&mm);
  31.         if (res!=ERR_OK) {
  32.           CLS1_SendStr("ERROR: failed VL53L0X_MeasureSingle()!\r\n", CLS1_GetStdio()->stdOut);
  33.           WAIT1_Waitms(1000);
  34.         }
  35.       } while(res!=ERR_OK);
  36.       CLS1_printf("\r\nRange: %dmm\r\n", mm);
  37.     }
  38.     LED1_Neg();
  39.     WAIT1_Waitms(50);
  40.     SHELL_Parse();
  41.   }
  42. }
复制代码

这将定期进行测量并在控制台上打印。 此外,该示例还包括命令行(shell)集成,可用于检查传感器状态和数据:

console-output.png

控制台输出


总结

我只使用传感器的基本功能在默认模式下进行“一次性”测量,因为这就是我所需要的。 到目前为止它的效果非常好,我可以精确测量距离达100厘米甚至更远的距离。 您可以在GitHub上找到源代码和项目文件。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 12 | 回复: 14



手机版|

GMT+8, 2024-4-19 09:21 , Processed in 0.236356 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表