Дальномер VL6180 не корректные показания

coustou
Offline
Зарегистрирован: 01.10.2018

Всем доброго времени суток!

Пришел сюда со следующей проблемой: имеется ардуино нано и 2 дальномера VL6180. Сделан делитель напряжения на 2,8 В для запитки датчика. Проверял на всех библиотеках, которые доступны в библиотеках (polulo, SparkFun и др.) из ардуино ИДЕ на тестовых программах. Результат измерения получился одинаково неожидаемым: очень большой шум (до 20 мм) и не линейная зависимость от препятствий. При реальных 25 мм показывает "шумный" ноль при приближении на более близкие расстояния показания увеличиваются, при отдалении от этой точки также увеличиваются. Более/менее измеряет расстояние от 90 до 140 мм. Такое поведение наблюдается на обоих подопытных. При разных условиях освещения и с разными предметами большими и маленькими, черными и белыми

Вот такие применялись модули.

https://ru.aliexpress.com/item/New-Arrival-VL6180-High-Accuracy-Range-Finder-Optical-Ranging-Sensor-for-Arduino/32770189152.html?spm=a2g0v.search0604.3.22.49bd2b10jZIzfM&ws_ab_test=searchweb0_0,searchweb201602_5_10065_10068_318_5727317_10059_10884_10887_10696_100031_10084_10083_10103_452_10618_10307_532_10301_5723517_5727217,searchweb201603_60,ppcSwitch_0&algo_expid=b2dd21ce-cbc6-4420-b4ba-4f8b9811cccb-3&algo_pvid=b2dd21ce-cbc6-4420-b4ba-4f8b9811cccb&priceBeautifyAB=0

модули были куплены в России.

Может кто сталкивался с подобной проблемой и имеет решение?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Схема включения и скетч есть?

coustou
Offline
Зарегистрирован: 01.10.2018

 

/* This minimal example shows how to get single-shot range
measurements from the VL6180X.

The range readings are in units of mm. */

#include <Wire.h>
#include <VL6180X.h>

VL6180X sensor;

void setup() 
{
  Serial.begin(9600);
  Wire.begin();
  
  sensor.init();
  sensor.configureDefault();
  sensor.setTimeout(500);
}

void loop() 
{ 
  Serial.print(sensor.readRangeSingleMillimeters());
  Serial.print("\t");
  Serial.println(sensor.readReg16Bit(VL6180X::RESULT__RANGE_REFERENCE_RATE));
  Serial.print("\t");
  Serial.println(sensor.readReg16Bit(VL6180X::RESULT__RANGE_RETURN_RATE));
  Serial.print("\t");
  Serial.println(sensor.readReg(VL6180X::RESULT__RANGE_RAW));
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  
  Serial.println();
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нужна Ваша схема, а не из документации. Например, я не вижу на приведённой схеме, где 

coustou пишет:

Сделан делитель напряжения на 2,8 В для запитки датчика. 

а подозреваю, что проблема именно в нём.

coustou
Offline
Зарегистрирован: 01.10.2018

это схема моя, вернее нашего конструктора. справа 5В преобразуются в 2,7 на транзисторах.

напряжение стабильное без провалов и прочего. По i2c данные считываются с любых регистров без проблем.

Напряжение питания датчика по даташиту от 2,6 до 3В

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

coustou пишет:

справа 5В преобразуются в 2,7 на транзисторах.

Да, нет, на транзисторах там преобразователь уровней. А источник напряжения 2.7В у Вас внешний (горизонтальная палочка в самом верхнем правом углу схемы). Вот и непонятно что у Вас там и как.

coustou
Offline
Зарегистрирован: 01.10.2018

 

да, вы правы! Честно говоря я в схемах не силен, больше по программированию. Вот та часть схемы которая отвечает за питание.

Гриша
Offline
Зарегистрирован: 27.04.2014

точно помню, что этот датчик обсуждался год назад на этом форуме. Но найти топик не смог - давно было. Смутно помню, что обсуждение свелось к оптическому фильтру, линзе и термостабилизации. Но подробности напроч забыл. Может кто вспомнит чего подробнее.

SLKH
Offline
Зарегистрирован: 17.08.2015

coustou пишет:

 

да, вы правы! Честно говоря я в схемах не силен, больше по программированию. Вот та часть схемы которая отвечает за питание.

При этих номиналах R32 и R35 напряжение на выходе будет около 5 вольт без нагрузки; под нагрузкой будет падать без стабилизации.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
coustou
Offline
Зарегистрирован: 01.10.2018

я пытлася на этом форуме найти темы связанные с этим датчиком, но нашел только ту в которой хотели завязать на одну шину несколько

coustou
Offline
Зарегистрирован: 01.10.2018

По поводу напряжения, я написал еще в самом начале, что на вход датчика подается номинальные 2.8 В. проверялось мультиметром и осцилографом на предмет шумов. Схема приведена с этапа начала прототипирования, в дальнейшем резисторы были изменены на подходящие, которые обеспечивают 2.8 В, а схему перерисовать времени не было.

Еще раз повторю, на всякий случай: напряжение на датчик приходит 2,8 вольт

Общение по шине I2C есть. Сомневаюсь, что датчик который должен работать от 2,6 до 3 В смог бы долго отдавать по шине I2C данные, при напряжении 5 В

 

Информация по поводу оптического фильтра - интересна, если кто помнит подробности напишите, пожалуйста.

 

coustou
Offline
Зарегистрирован: 01.10.2018

Тему закрываю.

Купил у другого поставщика по цене почти в 4 раз дешевле (350 р) рабочий модуль. Те два вернули (цена 1500р каждого).

Всем, кто принимал участие, спасибо!

JonHappy1
Offline
Зарегистрирован: 11.06.2018

А какая точность измерения?

coustou
Offline
Зарегистрирован: 01.10.2018

Полагаю, что можно добиться даташитовской точности, но, вероятно, нужны оптические фильтры о которых упоминали выше.

В моей задаче точность особой роли не играет, нужна линейность.

Могу сказать только, что датчик чувствителен к границам сред и к цвету поверхности до которого измеряет расстояние (к примеру, у меня датчик измеряет уровень в трубке из оргстекла с водой до пластикового белового поплавка).

К слову, пробовал использовать калибровку как указано в даташите, чтобы получить приемлемые коэффициенты, но полученные коэффициенты особой точности не дали.

В итоге сделал свою калибровку и полученные данные от датчика значения преобразую, используя map.

Процесс каллибровки следующий:

для минимума:  устанавливаю для поплавка с водой минимум и в ручную запускаю калибровку, полученное значение записываю в EEPROM

для максимума: устанавливаю для поплавка с водой максимум и в ручную запускаю калибровку, полученное значение записываю в EEPROM

При старте значения считываются из EEPROM и в дальнейшем пересчитываются с помощью функции map.

Как-то так...