I am using an adafruit 6180x TOF sensor with the basic Adafruit sketch. The sensor is mounted on a firm aluminum base and pointed at a stationary object about 10mm away -
I ran the sensor for about 30 minutes, and plotted 1000 point averages (i.e. each output is an average of 1000 consecutive readings), and it appears that the sensor drifts slowly from a reading of 10.03 to 12.15mm over 100 readings - i.e. 100,000 samples.
I'm trying to control for distance between 0-10mm and this produces over 30% error (readings move around 3-4mm) for a stationary object. Is there a way to improve stability and/or precision. The exact number doesn't matter, but it is important that the readings are repeatable. I don't believe that the distance is changing due to environmental conditions e.g. heat.
STMicro's datasheet appears to suggest a way to adjust the SNR for more accuracy; Can you give me some pointers on how to enable that in the Adafruit 6180x library?
Thank you
Entire code for the sketch attached below.
Code: Select all
#include <Wire.h>
#include "Adafruit_VL6180X.h"
Adafruit_VL6180X vl = Adafruit_VL6180X();
void setup() {
Serial.begin(115200);
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop() {
// float lux = vl.readLux(VL6180X_ALS_GAIN_5);
// Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
float myrange=0.0;
for (int i=0;i<1000;i++){
if (status == VL6180X_ERROR_NONE) {
range = vl.readRange();
myrange +=range;
}
}
//Serial.print("Range avg: "); Serial.println (myrange);
Serial.println (myrange/1000.0);
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(50);
}