GermanIvanov
Member
Купил два, на первый взгляд одинаковых, ToF-датчика в одном из Московских магазинов. (тут можно посмотреть их описание - https://www.compel.ru/lib/142189)
Обещали дальность работы до 2 метров. В реальности один работает примерно до 500 мм, второй до ~1300 мм. Потом происходит срыв на фиксированную константу (что характерно у обоих датчиков разную)
Препятствие на расстоянии 90 мм оба показывают как ~134 мм, препятствие на 415 мм как 410-440 мм. Тоесть чем дальше тем точнее.
Вычитал что их следует калибровать, скачал пример. В нем предлагалось закрепить в 100 мм от датчика препятствие и выполнить следующий код.
Код выполнился без ошибок, на расстояние измеряемое датчиком калибровка никак не повлияла.
Я что то не знаю или делаю не так?
Обещали дальность работы до 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);
}
Код выполнился без ошибок, на расстояние измеряемое датчиком калибровка никак не повлияла.
Я что то не знаю или делаю не так?