• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

VL53LOX не калибруются.

Купил два, на первый взгляд одинаковых, ToF-датчика в одном из Московских магазинов. (тут можно посмотреть их описание - https://www.compel.ru/lib/142189)
Обещали дальность работы до 2 метров. В реальности один работает примерно до 500 мм, второй до ~1300 мм. Потом происходит срыв на фиксированную константу (что характерно у обоих датчиков разную)
Препятствие на расстоянии 90 мм оба показывают как ~134 мм, препятствие на 415 мм как 410-440 мм. Тоесть чем дальше тем точнее.
Вычитал что их следует калибровать, скачал пример. В нем предлагалось закрепить в 100 мм от датчика препятствие и выполнить следующий код.
C:
#include <Wire.h>

#include "Adafruit_VL53L0X.h"
Adafruit_VL53L0X sensor = Adafruit_VL53L0X();

#define pinGPIO1 D5
#define pinXSHUT D6


#define CALIBRATE_DISTANCE_OFFSET                   (0x61)
#define CALIBRATE_SPAD                              (0x75)
#define TEMPERATURE_CALIBRATION                     (0x55)

#define ADDRESS (0x29)

void mm_to_bytes(uint8_t *bytes, uint16_t mm)
{
    bytes[0] = (mm >> 8 & 0xFF);
    bytes[1] = (mm & 0xFF);
}

void find_devices()
{
  int address,error;
  
  Serial.println("Scanning...");
  for (address = 1; address < 127; address++ )  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)    {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
    }
    else if (error == 4)    {
      Serial.print("Unknow error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
}

void offset_calibration_routine(uint8_t calib_dist) // def =100
{
  // ?? set_led_mode_off();
   Serial.println("Calibration begin: ");
  int status =0;

  delay(500);
 
  /* Calibrate SPADs */
  Wire.beginTransmission(ADDRESS);
  Wire.write(CALIBRATE_SPAD);
  status = Wire.endTransmission();
  Serial.print(status);
  delay(1000);

  /* Calibrate Temperature */

  Wire.beginTransmission(ADDRESS);
  Wire.write(TEMPERATURE_CALIBRATION);
  status = Wire.endTransmission();

  Serial.print(status);
  delay(1000);

  /* Calibrate Offset */

 
  uint8_t dist_bytes[2];
  mm_to_bytes(dist_bytes, calib_dist);
  Wire.beginTransmission(ADDRESS);
  Wire.write(CALIBRATE_DISTANCE_OFFSET);
  Wire.write(dist_bytes[0]);
  Wire.write(dist_bytes[1]);
  status = Wire.endTransmission();

  Serial.print(status);
  delay(10000);
  Serial.println();
  Serial.println("Calibration Complete");
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  pinMode(pinXSHUT, OUTPUT);
  digitalWrite(pinXSHUT, HIGH);
  pinMode(pinGPIO1, INPUT);

  delay(100);
  sensor.begin(); 
  VL53L0X_RangingMeasurementData_t measure;
  sensor.rangingTest(&measure, true);
  printMeasure(measure);
  offset_calibration_routine(100);
  printMeasure(measure);
  sensor.rangingTest(&measure, true);
  Serial.println(measure.RangeMilliMeter);
 
 
  // find_devices();
 
}

void loop() {
  // put your main code here, to run repeatedly:
 
}


void printMeasure( VL53L0X_RangingMeasurementData_t m){
    Serial.print("TimeStamp ");Serial.println(m.TimeStamp);
    Serial.print("MeasurementTimeUsec ");Serial.println(m.MeasurementTimeUsec);
    Serial.print("RangeMilliMeter ");Serial.println(m.RangeMilliMeter);
    Serial.print("RangeDMaxMilliMeter ");Serial.println(m.RangeDMaxMilliMeter);
    Serial.print("SignalRateRtnMegaCps ");Serial.println(m.SignalRateRtnMegaCps);
    Serial.print("AmbientRateRtnMegaCps ");Serial.println(m.AmbientRateRtnMegaCps);
    Serial.print("EffectiveSpadRtnCount ");Serial.println(m.EffectiveSpadRtnCount);
    Serial.print("ZoneId ");Serial.println(m.ZoneId);
    Serial.print("RangeFractionalPart ");Serial.println(m.RangeFractionalPart);
    Serial.print("RangeStatus ");Serial.println(m.RangeStatus);
    
}

Код выполнился без ошибок, на расстояние измеряемое датчиком калибровка никак не повлияла.
Я что то не знаю или делаю не так?
 

pvvx

Активный участник сообщества

nikolz

Well-known member
Купил два, на первый взгляд одинаковых, ToF-датчика в одном из Московских магазинов. (тут можно посмотреть их описание - https://www.compel.ru/lib/142189)
Обещали дальность работы до 2 метров. В реальности один работает примерно до 500 мм, второй до ~1300 мм. Потом происходит срыв на фиксированную константу (что характерно у обоих датчиков разную)
Препятствие на расстоянии 90 мм оба показывают как ~134 мм, препятствие на 415 мм как 410-440 мм. Тоесть чем дальше тем точнее.
Вычитал что их следует калибровать, скачал пример. В нем предлагалось закрепить в 100 мм от датчика препятствие и выполнить следующий код.
C:
#include <Wire.h>

#include "Adafruit_VL53L0X.h"
Adafruit_VL53L0X sensor = Adafruit_VL53L0X();

#define pinGPIO1 D5
#define pinXSHUT D6


#define CALIBRATE_DISTANCE_OFFSET                   (0x61)
#define CALIBRATE_SPAD                              (0x75)
#define TEMPERATURE_CALIBRATION                     (0x55)

#define ADDRESS (0x29)

void mm_to_bytes(uint8_t *bytes, uint16_t mm)
{
    bytes[0] = (mm >> 8 & 0xFF);
    bytes[1] = (mm & 0xFF);
}

void find_devices()
{
  int address,error;
 
  Serial.println("Scanning...");
  for (address = 1; address < 127; address++ )  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)    {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
    }
    else if (error == 4)    {
      Serial.print("Unknow error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
}

void offset_calibration_routine(uint8_t calib_dist) // def =100
{
  // ?? set_led_mode_off();
   Serial.println("Calibration begin: ");
  int status =0;

  delay(500);

  /* Calibrate SPADs */
  Wire.beginTransmission(ADDRESS);
  Wire.write(CALIBRATE_SPAD);
  status = Wire.endTransmission();
  Serial.print(status);
  delay(1000);

  /* Calibrate Temperature */

  Wire.beginTransmission(ADDRESS);
  Wire.write(TEMPERATURE_CALIBRATION);
  status = Wire.endTransmission();

  Serial.print(status);
  delay(1000);

  /* Calibrate Offset */


  uint8_t dist_bytes[2];
  mm_to_bytes(dist_bytes, calib_dist);
  Wire.beginTransmission(ADDRESS);
  Wire.write(CALIBRATE_DISTANCE_OFFSET);
  Wire.write(dist_bytes[0]);
  Wire.write(dist_bytes[1]);
  status = Wire.endTransmission();

  Serial.print(status);
  delay(10000);
  Serial.println();
  Serial.println("Calibration Complete");
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  pinMode(pinXSHUT, OUTPUT);
  digitalWrite(pinXSHUT, HIGH);
  pinMode(pinGPIO1, INPUT);

  delay(100);
  sensor.begin();
  VL53L0X_RangingMeasurementData_t measure;
  sensor.rangingTest(&measure, true);
  printMeasure(measure);
  offset_calibration_routine(100);
  printMeasure(measure);
  sensor.rangingTest(&measure, true);
  Serial.println(measure.RangeMilliMeter);


  // find_devices();

}

void loop() {
  // put your main code here, to run repeatedly:

}


void printMeasure( VL53L0X_RangingMeasurementData_t m){
    Serial.print("TimeStamp ");Serial.println(m.TimeStamp);
    Serial.print("MeasurementTimeUsec ");Serial.println(m.MeasurementTimeUsec);
    Serial.print("RangeMilliMeter ");Serial.println(m.RangeMilliMeter);
    Serial.print("RangeDMaxMilliMeter ");Serial.println(m.RangeDMaxMilliMeter);
    Serial.print("SignalRateRtnMegaCps ");Serial.println(m.SignalRateRtnMegaCps);
    Serial.print("AmbientRateRtnMegaCps ");Serial.println(m.AmbientRateRtnMegaCps);
    Serial.print("EffectiveSpadRtnCount ");Serial.println(m.EffectiveSpadRtnCount);
    Serial.print("ZoneId ");Serial.println(m.ZoneId);
    Serial.print("RangeFractionalPart ");Serial.println(m.RangeFractionalPart);
    Serial.print("RangeStatus ");Serial.println(m.RangeStatus);
   
}

Код выполнился без ошибок, на расстояние измеряемое датчиком калибровка никак не повлияла.
Я что то не знаю или делаю не так?
В приведенной Вами ссылке есть характеристика этого датчика:
Устойчивость ко внешнему освещению (5000 Lux), смДо 80
1615035772022.png
Т е при освещенности объекта 5000 Lux дальность всего 80 см.
Полагаю Вы это и получили.
 
Сверху Снизу