датчик расстояния 0-100мм: vl6180x

Использование прочих датчиков и энкодеров и пользовательских блоков к ним
Ответить
holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

датчик расстояния 0-100мм: vl6180x

#1

Сообщение holodaleksey » 31.10.2022{, 11:00}

доброго времени!
прошу совета, какой датчик применить.

есть (не жизненно важная, но все-же) необходимость, знать закрыт замок в двери, или нет. установить датчики внутрь самого замка не вариант, дверь стальная, само полотно наглухо проварено по периметру, да и питание постоянное нет особого желания гибким шлейфом делать.
поэтому вариант только понимать положение засовов внутри дверного косяка, ну и напрашивается дополнительно желание знать в каком положении засов (всего 4 шага) .
индуктивный использовать не получится - он в данном случае очень длинными получается.
микроволновый - не знаю, как это будет и будет ли вообще работать (да и те что смотрел, все работают ОТ 3-х см).
оптический? пробовал два варианта.
первый простой.
оптопара CNY70 в через ацп ADS1115 на esp8266. результат нулевой - очень малая разница в показаниях крайних положении, а про средние положения говорить вообще нет смысла.
второй.
самопальная оптопара. в кубике непрозрачного к ИК-диапазону пластика просверлены два параллельных отверстия малого диаметра, в одном ИК-фототранзистор, в другом ИК-светодиод. результат лучше, но все-равно по факту нулевой. разница между крайними положениями есть, но она очень мала, еще меньше в промежуточных.
и плюс, в обоих вариантах, присутствует дрейф показаний от питания, установка на питание электролитов большого номинала и и запитывание всей сборки от аккумулятора (что бы исключить погрешности от импульсного бп) результата не дало. дрейф мелкий, но есть. использование блоков программной фильтрации мало влияет на оперативные и точные результаты.
(результаты все смотрел через симп лайт скаду, графиками).

вопрос: какой датчик можно и стоит применить в данном случае?
(на корявом эскизе разрез коробки, для примерного понимания места установки, в месте установки датчика пена выковыряна).

заранее спасибо!
Вложения
Безымянный.jpg
Последний раз редактировалось holodaleksey 07.12.2022{, 23:18}, всего редактировалось 1 раз.
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

датчик расстояния 0-50мм: какой?

#2

Сообщение Ingwar » 31.10.2022{, 14:41}

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

Аватара пользователя
mehanikru
Рядовой
Сообщения: 62
Зарегистрирован: 16.01.2021{, 22:26}
Репутация: 3
Откуда: Кореновск
Имя: Сергей

датчик расстояния 0-50мм: какой?

#3

Сообщение mehanikru » 31.10.2022{, 16:32}

Емкостной датчик влажности измеряет ёмкость между электродами. Жаль, я сейчас не дома, посмотрел бы: что на выходе этого датчика при условиях, аналогичных вашим. :smile225:
Руководить - это значит не мешать хорошим людям работать. С.П. Капица

Аватара пользователя
olddolin
Сержант
Сообщения: 245
Зарегистрирован: 08.09.2017{, 19:47}
Репутация: 14
Откуда: Тверь
Имя: Вадим

датчик расстояния 0-50мм: какой?

#4

Сообщение olddolin » 31.10.2022{, 17:45}

holodaleksey, есть такие, датчики приближения. Используются и в промышленном оборудовании. Выход разный, аналоговый. До али покупали евпопейские, но когда вышли на китайцев, оказались датчики раз в 10-20 дешевле. К сожалению ссылку дать не могу, давно это было, но датчик приближения-он и у чинариков таковым является. Я у себя в дренажном колодце канализации какие только датчики уровня не пробовал, а сымые стойкие окпзались китайские.
Электронщик как врач, ему нужно постоянно учиться чтобы соответствовать времени.

texbez
Лейтенант
Сообщения: 355
Зарегистрирован: 20.11.2016{, 19:57}
Репутация: 9
Откуда: Ростов на дону

датчик расстояния 0-50мм: какой?

#5

Сообщение texbez » 31.10.2022{, 20:40}

Как вариант индуктивный датчик уровня стола для 3 д принтера - срабатывает примерно 5мм ( они разные по чувствительности) , правда размеры у него длиной сантиметров 6-7...

Аватара пользователя
Brama
Рядовой
Сообщения: 64
Зарегистрирован: 02.07.2020{, 14:27}
Репутация: 5
Откуда: Уфа
Имя: Сергей

датчик расстояния 0-50мм: какой?

#6

Сообщение Brama » 31.10.2022{, 23:09}

holodaleksey писал(а):
31.10.2022{, 11:00}
индуктивный использовать не получится - он в данном случае очень длинными получается.
Длина катушки 30 мм разве проблема? Непосредственно к индуктивности подключить микросхему LC генератора с делителем. Если в катушку входит металлический засов, частота уменьшится. В контроллере задействовать скоростной счетчик.

holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

датчик расстояния 0-50мм: какой?

#7

Сообщение holodaleksey » 01.11.2022{, 19:20}

Ingwar писал(а):
31.10.2022{, 14:41}
Если не забуду, посмотрю дистанцию обнаружения магнитного поля с неодима аналоговым датчика холла...)
Спасибо, было бы интересно!

Отправлено спустя 1 минуту 29 секунд:
mehanikru писал(а):
31.10.2022{, 16:32}
Емкостной датчик влажности измеряет ёмкость между электродами. Жаль, я сейчас не дома, посмотрел бы: что на выходе этого датчика при условиях, аналогичных вашим. :smile225:
пока не понимаю как это можно применить.

Отправлено спустя 3 минуты 18 секунд:
olddolin писал(а):
31.10.2022{, 17:45}
holodaleksey, есть такие, датчики приближения. Используются и в промышленном оборудовании. Выход разный, аналоговый. До али покупали евпопейские, но когда вышли на китайцев, оказались датчики раз в 10-20 дешевле. К сожалению ссылку дать не могу, давно это было, но датчик приближения-он и у чинариков таковым является. Я у себя в дренажном колодце канализации какие только датчики уровня не пробовал, а сымые стойкие окпзались китайские.
спасибо!!! Заказал, жду. Будем посмотреть! По манулине вроде то что надо)!

Отправлено спустя 1 минуту 54 секунды:
texbez писал(а):
31.10.2022{, 20:40}
Как вариант индуктивный датчик уровня стола для 3 д принтера - срабатывает примерно 5мм ( они разные по чувствительности) , правда размеры у него длиной сантиметров 6-7...
мимо. Эскиз наверху. Для этого за коробкой бетон надо разбить, а дверь уже стоит.

Отправлено спустя 4 минуты 2 секунды:
Brama писал(а):
31.10.2022{, 23:09}
holodaleksey писал(а):
31.10.2022{, 11:00}
индуктивный использовать не получится - он в данном случае очень длинными получается.
Длина катушки 30 мм разве проблема? Непосредственно к индуктивности подключить микросхему LC генератора с делителем. Если в катушку входит металлический засов, частота уменьшится. В контроллере задействовать скоростной счетчик.
мимо. Катушка должна быть с внутренним диаметром больше, чем наружный диаметр засова, правильно? Тогда аккуратная незаметная установка ее невозможна, коробку пилить никак нет возможности.
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

Аватара пользователя
olddolin
Сержант
Сообщения: 245
Зарегистрирован: 08.09.2017{, 19:47}
Репутация: 14
Откуда: Тверь
Имя: Вадим

датчик расстояния 0-50мм: какой?

#8

Сообщение olddolin » 02.11.2022{, 10:03}

holodaleksey, рад, что помог! Хотелось бы, ссылку на то, что заказали, многим пртгодится. Одно из примкнений этого датчика, измерение уровня жидкости в чем либо. Через блок на троссу висит поплавок с другого конца противовес выверенного веса. Так де на оси с блоком эллипс регулируемый. Эллипс воздействует на датчик, а дальше уж сами. Единственная сложность это если большой уровень нужен, но это уже детали.
Электронщик как врач, ему нужно постоянно учиться чтобы соответствовать времени.

Аватара пользователя
mehanikru
Рядовой
Сообщения: 62
Зарегистрирован: 16.01.2021{, 22:26}
Репутация: 3
Откуда: Кореновск
Имя: Сергей

датчик расстояния 0-50мм: какой?

#9

Сообщение mehanikru » 02.11.2022{, 19:37}

Попробовал ёмкостной датчик уровня для металлических пластинок, охватывающих емкостную часть, где нанесены дорожки датчика. При перемещении пластинок вдоль платы, с конца на середину (вдвигании чувствительной части платы между пластинками) дельта U составило 40 мВ. Схема датчика простая, только 555 таймер. Бывают такие же, но с ОУ. Там дельта U должно быть больше.
Руководить - это значит не мешать хорошим людям работать. С.П. Капица

Аватара пользователя
garry
Рядовой
Сообщения: 99
Зарегистрирован: 22.01.2016{, 11:20}
Репутация: 7

датчик расстояния 0-50мм: какой?

#10

Сообщение garry » 04.11.2022{, 07:06}

Есть решение с избыточной точностью,но зато дешевое. Китайский цифровой штангенциркуль за 300р из фикспрайса. На борту есть интерфейс. Отпилить всё лишнее и засунуть в дверь. Статей о подключении и чтении с него полно.

vladimir_
Рядовой
Сообщения: 70
Зарегистрирован: 05.02.2017{, 07:34}
Репутация: 5

датчик расстояния 0-50мм: какой?

#11

Сообщение vladimir_ » 04.11.2022{, 08:16}

Можно попробовать VL6180/VL53L0X/VL53L1X лазерный датчик дальности.https://aliexpress.ru/item/100500309194 ... 4cceLq6ZIC. Они есть на разные расстояния.
1.PNG
2.PNG
[/b]

holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

датчик расстояния 0-50мм: какой?

#12

Сообщение holodaleksey » 06.11.2022{, 14:03}

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

Отправлено спустя 2 минуты 37 секунд:
garry писал(а):
04.11.2022{, 07:06}
Есть решение с избыточной точностью,но зато дешевое. Китайский цифровой штангенциркуль за 300р из фикспрайса. На борту есть интерфейс. Отпилить всё лишнее и засунуть в дверь. Статей о подключении и чтении с него полно.
"в дверь" - не вариант, см.пост 1.
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

датчик расстояния 0-50мм: какой?

#13

Сообщение holodaleksey » 06.12.2022{, 09:58}

приехали... VL6180X. впечатления неоднозначные.
1. да, компактный вот вообще отлично.
2. библиотеки. есть немало, но завелись только VL6180X.h и Adafruit_VL6180X.h. по остальным ответ "ошибка инициализации" и тишина. ну да ладно.
3. ! блин, вот в какой раз уже... внимательно надо читать даташиты. вот вообще внимательно! перед заказом. а не после. короче, они все прошиты под один адрес. 0х29. сменить нельзя. точнее можно, но после отключения-включения адрес будет сброшен на 0х29. итого - либо по отдельному контроллеру на каждый датчик, либо огород с костылями с использованием пина En(SHDN на плате) либо огород с оптопарами. ну черт с ним. решаемо.
4. точность от 0 до 10 мм - никакая! нет ее. вообще.

и 5. не знаю пока, что будет на выходе с фильтрами, ну а без фильтров - опять пила \\\\
проверял на вемос мини и ардуино уно.
сейчас буду вспоминать как код в блок засунуть, делал очень давно и всего пару раз (

Добавлено: короче, что то у меня с блоком из скетча получается ровно ничего. Если кто то сможет помочь с блоком - буду признателен!
скрин графика данных без фильтровПоказать
Безымянный.jpg
#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());
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
}
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

датчик расстояния 0-100мм: vl6180x

#14

Сообщение holodaleksey » 09.01.2024{, 23:25}

Апаю. Второе дыхание на эту приблуду появилось. Ни чёрта пока не получается, но как будто:
Делаем мини-программу в фл прог. Или заливаем скетч из примеров в ардуино аде.
Смысл - опрашиваем датчик (один) и отправляем раз в секунду в компорт.
Наблюдение: если использовать вемос мини - часто (непрогнозируемо) в мониторе порта нет данных пока Не: закроешь монитор порта, отключишь питание есп (именно отключить питание секунд на 5, а не ресет), включишь питание, откроешь монитор, оппа. Данные начинают идти как ни в чем не бывало.
Более ничего в есп не заливается, проверил 4 экземпляра уже.
Откопал древнюю (лет ей больше 10 точно) уно. На 328 камне. А на ней таких выкрутасов нет! Залил - данные пошли. Всегда. Выдернул датчик из линии связи -компорт замер, воткнул датчик, ткнул ресет - снова пошли.
Это какая то очередная пока мне неизвестная фича?
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

датчик расстояния 0-100мм: vl6180x

#15

Сообщение holodaleksey » 13.01.2024{, 23:05}

дополняю.
два VL6180x -> ардуино уно. скетч от robojax на 2 датчика.
все работает. ну дрейфует, но работает. а на вемосе у меня это работать отказываается.
СпойлерПоказать
/*
* Arduino code
* Lesson 76-2: Using two or more VL6180 Laser Distance Sensor with Arduino
* Adafruit code modified for this tutorial
Using two or more VL6180X 20cm Time-of-Flight proximity sensor with Arduino

View code for using single VL6180X sensors: https://robojax.com/course1/lecture76

* Original code and library by https://github.com/adafruit/Adafruit_VL6180X
*
* Written/updated by Ahmad Shamshiri for Robojax Robojax.com
* on Mar 12, 2021 in Ajax, Ontario, Canada
Watch the video instruction for this sketch:

Please watch video instruciton of this code :

This video is part of Arduino Step by Step Course which starts here:

If you found this tutorial helpful, please support me so I can continue creating
content like this. You can support me on Patreon http://robojax.com/L/?id=63

or make donation using PayPal http://robojax.com/L/?id=64

* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

*/

#include <Adafruit_VL6180X.h>

// address we will assign if dual sensor is present
#define LOX1_ADDRESS 0x30
#define LOX2_ADDRESS 0x31

// set the pins to shutdown
#define SHT_LOX1 7
#define SHT_LOX2 6

// Optional define GPIO pins to check to see if complete
#define GPIO_LOX1 4
#define GPIO_LOX2 3

#define TIMING_PIN 13

// objects for the VL6180X
Adafruit_VL6180X lox1 = Adafruit_VL6180X();
Adafruit_VL6180X lox2 = Adafruit_VL6180X();

// Setup mode for doing reads
typedef enum {RUN_MODE_DEFAULT, RUN_MODE_TIMED, RUN_MODE_ASYNC, RUN_MODE_GPIO, RUN_MODE_CONT} runmode_t;

runmode_t run_mode = RUN_MODE_DEFAULT;
uint8_t show_command_list = 1;

//==========================================================================
// Define some globals used in the continuous range mode
// Note: going to start table drive this part, may back up and do the rest later
Adafruit_VL6180X *sensors[] = {&lox1, &lox2};
const uint8_t COUNT_SENSORS = sizeof(sensors) / sizeof(sensors[0]);
const int sensor_gpios[COUNT_SENSORS] = {GPIO_LOX1, GPIO_LOX2}; // if any are < 0 will poll instead
uint8_t tempRange;
uint8_t sensor_ranges[COUNT_SENSORS];
uint8_t sensor_status[COUNT_SENSORS];
// Could do with uint8_t for 8 sensors, but just in case...
const uint16_t ALL_SENSORS_PENDING = ((1 << COUNT_SENSORS) - 1);
uint16_t sensors_pending = ALL_SENSORS_PENDING;
uint32_t sensor_last_cycle_time;

/*
Reset all sensors by setting all of their XSHUT pins low for delay(10), then set all XSHUT high to bring out of reset
Keep sensor #1 awake by keeping XSHUT pin high
Put all other sensors into shutdown by pulling XSHUT pins low
Initialize sensor #1 with lox.begin(new_i2c_address) Pick any number but 0x29 and it must be under 0x7F. Going with 0x30 to 0x3F is probably OK.
Keep sensor #1 awake, and now bring sensor #2 out of reset by setting its XSHUT pin high.
Initialize sensor #2 with lox.begin(new_i2c_address) Pick any number but 0x29 and whatever you set the first sensor to
*/
void setID() {
// all reset
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);

delay(10);

// all unreset
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, HIGH);

delay(10);

// activating LOX1 and reseting LOX2
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, LOW);

// initing LOX1
if (!lox1.begin()) {
Serial.println(F("Failed to boot first VL6180X"));
while (1);
}
lox1.setAddress(LOX1_ADDRESS);
delay(10);

// activating LOX2
digitalWrite(SHT_LOX2, HIGH);
delay(10);

//initing LOX2
if (!lox2.begin()) {
Serial.println(F("Failed to boot second VL6180X"));
while (1);
}
lox2.setAddress(LOX2_ADDRESS);
delay(10);

}

void readSensor(Adafruit_VL6180X &vl) {

float lux = vl.readLux(VL6180X_ALS_GAIN_5);

uint8_t range = vl.readRange();

uint8_t status = vl.readRangeStatus();

if (status == VL6180X_ERROR_NONE) {
tempRange = range;//save it for the moment
}

// Some error occurred, print it out!

if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.print("(System error)");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.print("(ECE failure)");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.print("(No convergence)");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.print("(Ignoring range)");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.print("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.print("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.print("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.print("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.print("Range reading overflow");
}
}

void read_sensors() {
readSensor(lox1);
sensor_ranges[0]=tempRange;//save it now

readSensor(lox2);
sensor_ranges[1]=tempRange; //save it now

Serial.println();
}

//===============================================================
// Setup
//===============================================================
void setup() {
Serial.begin(115200);

// wait until serial port opens for native USB devices
while (! Serial) {
delay(1);
}

pinMode(SHT_LOX1, OUTPUT);
pinMode(SHT_LOX2, OUTPUT);

// Enable timing pin so easy to see when pass starts and ends
pinMode(TIMING_PIN, OUTPUT);

#ifdef GPIO_LOX1
// If we defined GPIO pins, enable them as PULL UP
pinMode(GPIO_LOX1, INPUT_PULLUP);
pinMode(GPIO_LOX2, INPUT_PULLUP);

#endif

Serial.println("Shutdown pins inited...");

digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);

digitalWrite(TIMING_PIN, LOW);
Serial.println("All in reset mode...(pins are low)");

Serial.println("Starting...");
setID();

}

//===============================================================
// Loop
//===============================================================
void loop() {
read_sensors();
for(int i=0; i<COUNT_SENSORS; i++)
{
Serial.print("Sensor ");
Serial.print(i);
Serial.print(" :");
Serial.print(sensor_ranges);
Serial.print("mm");
Serial.println();
}
// if(sensor_ranges[1] >=76)
// {
// //do something here
// }
delay(100);
}
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

Ответить

Вернуться в «Прочие датчики и энкодеры»