STEVAL-PDETECT1传感器 1.介绍

STEVAL-PDETECT1 是意法半导体(STMicroelectronics)推出的一款专为人体存在检测评估套件,通过红外、TOF激光测距与环境光三个传感器,实现无摄像头下对场景内人体活动进行检测,可以极大的保护使用对象的隐私。
套件集成三大高性能传感器,覆盖红外、距离与环境光检测:

STHS34PF80 红外传感器:通过检测视野内物体的红外辐射,以实现基础的运动、静态存在及过热物体识别。板卡上的红外传感器由一片半透明的菲涅尔透镜覆盖,以增强红外探测距离。

VL53L8CX 飞行时间(ToF)测距传感器:通过发送激光并反射回来的时间,计算激光飞行的距离,以实现检测距离的传感器。可以检测多区域扫描(4×4 或 8×8 分区),最远测距 4 米,视角 65°。

VD6283TX 颜色与环境光传感器:通过对6独立通道(红(R)、绿(G)、蓝(B)、红外(IR)、透明(Clear)、可见光(Visible)波段)进行同步检测以实现完整光谱范围覆盖的传感器,得益于其超小的尺寸(1.83mm × 1.0mm × 0.55mm),VD6283TX可以做到手机屏下或超小的板卡上

该板卡的板对板连接器为松下AXF6G3412A(AXF5G3412A),该连接器仅在部分ST官方板卡上有,官方历程使用STEVAL-STWUBX1,笔者这里使用STEVAL-PROTEUS1套件进行传感器驱动:

三大传感器的组合确实能覆盖更多场景:STHS34PF80 的红外检测配合菲涅尔透镜,能有效识别静态人体和异常热源;VL53L8CX 的多区域 ToF 扫描(4×4 或 8×8 分区)可以构建空间深度信息,对人体位置和动作进行更精确判断;VD6283TX 的多光谱环境光检测则能补充场景光照特征,提升复杂环境下的检测准确率。

1 个赞

这个传感器的信号传输是怎么样发生变化的,有没有具体的传输曲线来描述这个变化过程!

ST官方的驱动用的PNPL架构,比较冗杂,如果需要研究的话请访问 https://github.com/STMicroelectronics/fp-sns-datalog2查看

补上后续:

代码需要移植官方的FP-SNS-DATALOG2,
部分驱动代码如下


 if (ext_pdetect == true)
  {
    sI2C3BusObj = I2CBusTaskAlloc(&MX_I2C3InitParams);
    if (ext_pdetect2 == false && ext_pdetect3 == false && ext_sensirion == false)
    {
      HAL_GPIO_WritePin(GPIO3_EX_GPIO_Port, GPIO3_EX_Pin, GPIO_PIN_SET);
      spVL53L8CXObj = VL53L8CXTaskAlloc(&MX_GPIO_INT_TOFInitParams, NULL, NULL);
      spSTHS34PF80Obj = STHS34PF80TaskAlloc(&MX_GPIO_INT_TMOSInitParams, NULL, NULL);
      spVD6283TXObj = VD6283TXTaskAlloc(NULL, NULL, NULL);
    }
    else
    {
      spVL53L8CXObj = VL53L8CXTaskAlloc(NULL, NULL, &MX_GPIO3_EXInitParams);
      spSTHS34PF80Obj = STHS34PF80TaskAlloc(NULL, NULL, &MX_GPIO3_EXInitParams);
      spVD6283TXObj = VD6283TXTaskAlloc(NULL, NULL, &MX_GPIO3_EXInitParams);
      if (ext_pdetect2 == true)
      {
        spVL53L8CX_2Obj = VL53L8CXTaskAllocSetName(NULL, NULL, &MX_GPIO2_EXInitParams, "vl53l8cx_2");
        spSTHS34PF80_2Obj = STHS34PF80TaskAllocSetName(NULL, NULL, &MX_GPIO2_EXInitParams, "sths34pf80_2");
        spVD6283TX_2Obj = VD6283TXTaskAllocSetName(NULL, NULL, &MX_GPIO2_EXInitParams, "vd6283tx_2");
      }
      if (ext_pdetect3 == true)
      {
        spVL53L8CX_3Obj = VL53L8CXTaskAllocSetName(NULL, NULL, &MX_GPIO1_EXInitParams, "vl53l8cx_3");
        spSTHS34PF80_3Obj = STHS34PF80TaskAllocSetName(NULL, NULL, &MX_GPIO1_EXInitParams, "sths34pf80_3");
        spVD6283TX_3Obj = VD6283TXTaskAllocSetName(NULL, NULL, &MX_GPIO1_EXInitParams, "vd6283tx_3");
      }
      if (ext_sensirion == true)
      {
        spSHT40Obj = SHT40TaskAlloc(NULL, NULL);
        spSGP40Obj = SGP40TaskAlloc(NULL, NULL);
        spLPS22DFObj = LPS22DFTaskAlloc(NULL, NULL);
      }
    }
  }


  / Add the task object to the context /
  res = ACAddTask(pAppContext, (AManagedTask *) sUtilObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sDatalogAppObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sI2C2BusObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sSPI2BusObj);
  if (spSTHS34PF80Obj)
  {
    res = ACAddTask(pAppContext, (AManagedTask *) sI2C3BusObj);
    res = ACAddTask(pAppContext, (AManagedTask *)spVL53L8CXObj);
    res = ACAddTask(pAppContext, (AManagedTask *)spSTHS34PF80Obj);
    res = ACAddTask(pAppContext, (AManagedTask *)spVD6283TXObj);
  }
  if (spSTHS34PF80_2Obj)
  {
    res = ACAddTask(pAppContext, (AManagedTask *)spVL53L8CX_2Obj);
    res = ACAddTask(pAppContext, (AManagedTask *)spSTHS34PF80_2Obj);
    res = ACAddTask(pAppContext, (AManagedTask *)spVD6283TX_2Obj);
  }
  if (spSTHS34PF80_3Obj)
  {
    res = ACAddTask(pAppContext, (AManagedTask *)spVL53L8CX_3Obj);
    res = ACAddTask(pAppContext, (AManagedTask *)spSTHS34PF80_3Obj);
    res = ACAddTask(pAppContext, (AManagedTask *)spVD6283TX_3Obj);
  }
  if (spLPS22DFObj)
  {
    res = ACAddTask(pAppContext, (AManagedTask *) spSHT40Obj);
    res = ACAddTask(pAppContext, (AManagedTask *) spSGP40Obj);
    res = ACAddTask(pAppContext, (AManagedTask *) spLPS22DFObj);
  }
  res = ACAddTask(pAppContext, (AManagedTask *) sIIS2ICLXObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sIIS2MDCObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sILPS22QSObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sIMP34DT05Obj);
  res = ACAddTask(pAppContext, (AManagedTask *) sSTTS22HObj);
  res = ACAddTask(pAppContext, (AManagedTask *) sISM330DHCXObj);

  pIIS2ICLX_ACC_PnPLObj = Iis2iclx_Acc_PnPLAlloc();
  pIIS2MDC_MAG_PnPLObj = Iis2mdc_Mag_PnPLAlloc();
  pILPS22QS_PRESS_PnPLObj = Ilps22qs_Press_PnPLAlloc();
  pIMP34DT05_MIC_PnPLObj = Imp34dt05_Mic_PnPLAlloc();
  pSTTS22H_TEMP_PnPLObj = Stts22h_Temp_PnPLAlloc();
  pISM330DHCX_ACC_PnPLObj = Ism330dhcx_Acc_PnPLAlloc();
  pISM330DHCX_GYRO_PnPLObj = Ism330dhcx_Gyro_PnPLAlloc();
  if (spSTHS34PF80Obj)
  {
    pVl53l8cx_Tof_PnPLObj = Vl53l8cx_Tof_PnPLAlloc();
    pSths34pf80_Tmos_PnPLObj = Sths34pf80_Tmos_PnPLAlloc();
    pVd6283tx_Als_PnPLObj = Vd6283tx_Als_PnPLAlloc();
  }
  if (spSTHS34PF80_2Obj)
  {
    pVl53l8cx_2_Tof_PnPLObj = Vl53l8cx_2_Tof_PnPLAlloc();
    pSths34pf80_2_Tmos_PnPLObj = Sths34pf80_2_Tmos_PnPLAlloc();
    pVd6283tx_2_Als_PnPLObj = Vd6283tx_2_Als_PnPLAlloc();
  }
  if (spSTHS34PF80_3Obj)
  {
    pVl53l8cx_3_Tof_PnPLObj = Vl53l8cx_3_Tof_PnPLAlloc();
    pSths34pf80_3_Tmos_PnPLObj = Sths34pf80_3_Tmos_PnPLAlloc();
    pVd6283tx_3_Als_PnPLObj = Vd6283tx_3_Als_PnPLAlloc();
  }
  if (spLPS22DFObj)
  {
    pSgp40_Voc_PnPLObj = Sgp40_Voc_PnPLAlloc();
    pSht40_Hum_PnPLObj = Sht40_Hum_PnPLAlloc();
    pSht40_Temp_PnPLObj = Sht40_Temp_PnPLAlloc();
    pLps22df_Press_PnPLObj = Lps22df_Press_PnPLAlloc();
  }

  pDeviceInfoPnPLObj = Deviceinformation_PnPLAlloc();
  pAcquisitionInfoPnPLObj = Acquisition_Info_PnPLAlloc();
  pTagsInfoPnPLObj = Tags_Info_PnPLAlloc();
  pFirmwareInfoPnPLObj = Firmware_Info_PnPLAlloc();
  pLogControllerPnPLObj = Log_Controller_PnPLAlloc();
  pAutomodePnPLObj = Automode_PnPLAlloc();

这颗TOF是封装好了的,用户端只能看到最基础的SPI信号