• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 см.
Полагаю Вы это и получили.
 
Сверху Снизу