датчик расстояния 0-100мм: vl6180x
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
датчик расстояния 0-100мм: vl6180x
доброго времени!
прошу совета, какой датчик применить.
есть (не жизненно важная, но все-же) необходимость, знать закрыт замок в двери, или нет. установить датчики внутрь самого замка не вариант, дверь стальная, само полотно наглухо проварено по периметру, да и питание постоянное нет особого желания гибким шлейфом делать.
поэтому вариант только понимать положение засовов внутри дверного косяка, ну и напрашивается дополнительно желание знать в каком положении засов (всего 4 шага) .
индуктивный использовать не получится - он в данном случае очень длинными получается.
микроволновый - не знаю, как это будет и будет ли вообще работать (да и те что смотрел, все работают ОТ 3-х см).
оптический? пробовал два варианта.
первый простой.
оптопара CNY70 в через ацп ADS1115 на esp8266. результат нулевой - очень малая разница в показаниях крайних положении, а про средние положения говорить вообще нет смысла.
второй.
самопальная оптопара. в кубике непрозрачного к ИК-диапазону пластика просверлены два параллельных отверстия малого диаметра, в одном ИК-фототранзистор, в другом ИК-светодиод. результат лучше, но все-равно по факту нулевой. разница между крайними положениями есть, но она очень мала, еще меньше в промежуточных.
и плюс, в обоих вариантах, присутствует дрейф показаний от питания, установка на питание электролитов большого номинала и и запитывание всей сборки от аккумулятора (что бы исключить погрешности от импульсного бп) результата не дало. дрейф мелкий, но есть. использование блоков программной фильтрации мало влияет на оперативные и точные результаты.
(результаты все смотрел через симп лайт скаду, графиками).
вопрос: какой датчик можно и стоит применить в данном случае?
(на корявом эскизе разрез коробки, для примерного понимания места установки, в месте установки датчика пена выковыряна).
заранее спасибо!
прошу совета, какой датчик применить.
есть (не жизненно важная, но все-же) необходимость, знать закрыт замок в двери, или нет. установить датчики внутрь самого замка не вариант, дверь стальная, само полотно наглухо проварено по периметру, да и питание постоянное нет особого желания гибким шлейфом делать.
поэтому вариант только понимать положение засовов внутри дверного косяка, ну и напрашивается дополнительно желание знать в каком положении засов (всего 4 шага) .
индуктивный использовать не получится - он в данном случае очень длинными получается.
микроволновый - не знаю, как это будет и будет ли вообще работать (да и те что смотрел, все работают ОТ 3-х см).
оптический? пробовал два варианта.
первый простой.
оптопара CNY70 в через ацп ADS1115 на esp8266. результат нулевой - очень малая разница в показаниях крайних положении, а про средние положения говорить вообще нет смысла.
второй.
самопальная оптопара. в кубике непрозрачного к ИК-диапазону пластика просверлены два параллельных отверстия малого диаметра, в одном ИК-фототранзистор, в другом ИК-светодиод. результат лучше, но все-равно по факту нулевой. разница между крайними положениями есть, но она очень мала, еще меньше в промежуточных.
и плюс, в обоих вариантах, присутствует дрейф показаний от питания, установка на питание электролитов большого номинала и и запитывание всей сборки от аккумулятора (что бы исключить погрешности от импульсного бп) результата не дало. дрейф мелкий, но есть. использование блоков программной фильтрации мало влияет на оперативные и точные результаты.
(результаты все смотрел через симп лайт скаду, графиками).
вопрос: какой датчик можно и стоит применить в данном случае?
(на корявом эскизе разрез коробки, для примерного понимания места установки, в месте установки датчика пена выковыряна).
заранее спасибо!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось holodaleksey 07 дек 2022, 23:18, всего редактировалось 1 раз.
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
датчик расстояния 0-50мм: какой?
Если не забуду, посмотрю дистанцию обнаружения магнитного поля с неодима аналоговым датчика холла...)
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
датчик расстояния 0-50мм: какой?
Емкостной датчик влажности измеряет ёмкость между электродами. Жаль, я сейчас не дома, посмотрел бы: что на выходе этого датчика при условиях, аналогичных вашим. 

Руководить - это значит не мешать хорошим людям работать. С.П. Капица
датчик расстояния 0-50мм: какой?
[ref]holodaleksey[/ref], есть такие, датчики приближения. Используются и в промышленном оборудовании. Выход разный, аналоговый. До али покупали евпопейские, но когда вышли на китайцев, оказались датчики раз в 10-20 дешевле. К сожалению ссылку дать не могу, давно это было, но датчик приближения-он и у чинариков таковым является. Я у себя в дренажном колодце канализации какие только датчики уровня не пробовал, а сымые стойкие окпзались китайские.
Электронщик как врач, ему нужно постоянно учиться чтобы соответствовать времени.
-
- Лейтенант
- Сообщения: 395
- Зарегистрирован: 20 ноя 2016, 19:57
- Откуда: Ростов на дону
- Имя: Сергей
- Благодарил (а): 1 раз
датчик расстояния 0-50мм: какой?
Как вариант индуктивный датчик уровня стола для 3 д принтера - срабатывает примерно 5мм ( они разные по чувствительности) , правда размеры у него длиной сантиметров 6-7...
- Brama
- Рядовой
- Сообщения: 95
- Зарегистрирован: 02 июл 2020, 14:27
- Откуда: Уфа
- Имя: Сергей
- Благодарил (а): 44 раза
- Поблагодарили: 2 раза
датчик расстояния 0-50мм: какой?
Длина катушки 30 мм разве проблема? Непосредственно к индуктивности подключить микросхему LC генератора с делителем. Если в катушку входит металлический засов, частота уменьшится. В контроллере задействовать скоростной счетчик.holodaleksey писал(а): 31 окт 2022, 11:00 индуктивный использовать не получится - он в данном случае очень длинными получается.
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
датчик расстояния 0-50мм: какой?
Спасибо, было бы интересно!Ingwar писал(а): 31 окт 2022, 14:41 Если не забуду, посмотрю дистанцию обнаружения магнитного поля с неодима аналоговым датчика холла...)
Отправлено спустя 1 минуту 29 секунд:
пока не понимаю как это можно применить.mehanikru писал(а): 31 окт 2022, 16:32 Емкостной датчик влажности измеряет ёмкость между электродами. Жаль, я сейчас не дома, посмотрел бы: что на выходе этого датчика при условиях, аналогичных вашим.![]()
Отправлено спустя 3 минуты 18 секунд:
спасибо!!! Заказал, жду. Будем посмотреть! По манулине вроде то что надо)!olddolin писал(а): 31 окт 2022, 17:45 [ref]holodaleksey[/ref], есть такие, датчики приближения. Используются и в промышленном оборудовании. Выход разный, аналоговый. До али покупали евпопейские, но когда вышли на китайцев, оказались датчики раз в 10-20 дешевле. К сожалению ссылку дать не могу, давно это было, но датчик приближения-он и у чинариков таковым является. Я у себя в дренажном колодце канализации какие только датчики уровня не пробовал, а сымые стойкие окпзались китайские.
Отправлено спустя 1 минуту 54 секунды:
мимо. Эскиз наверху. Для этого за коробкой бетон надо разбить, а дверь уже стоит.texbez писал(а): 31 окт 2022, 20:40 Как вариант индуктивный датчик уровня стола для 3 д принтера - срабатывает примерно 5мм ( они разные по чувствительности) , правда размеры у него длиной сантиметров 6-7...
Отправлено спустя 4 минуты 2 секунды:
мимо. Катушка должна быть с внутренним диаметром больше, чем наружный диаметр засова, правильно? Тогда аккуратная незаметная установка ее невозможна, коробку пилить никак нет возможности.Brama писал(а): 31 окт 2022, 23:09Длина катушки 30 мм разве проблема? Непосредственно к индуктивности подключить микросхему LC генератора с делителем. Если в катушку входит металлический засов, частота уменьшится. В контроллере задействовать скоростной счетчик.holodaleksey писал(а): 31 окт 2022, 11:00 индуктивный использовать не получится - он в данном случае очень длинными получается.
датчик расстояния 0-50мм: какой?
[ref]holodaleksey[/ref], рад, что помог! Хотелось бы, ссылку на то, что заказали, многим пртгодится. Одно из примкнений этого датчика, измерение уровня жидкости в чем либо. Через блок на троссу висит поплавок с другого конца противовес выверенного веса. Так де на оси с блоком эллипс регулируемый. Эллипс воздействует на датчик, а дальше уж сами. Единственная сложность это если большой уровень нужен, но это уже детали.
Электронщик как врач, ему нужно постоянно учиться чтобы соответствовать времени.
датчик расстояния 0-50мм: какой?
Попробовал ёмкостной датчик уровня для металлических пластинок, охватывающих емкостную часть, где нанесены дорожки датчика. При перемещении пластинок вдоль платы, с конца на середину (вдвигании чувствительной части платы между пластинками) дельта U составило 40 мВ. Схема датчика простая, только 555 таймер. Бывают такие же, но с ОУ. Там дельта U должно быть больше.
Руководить - это значит не мешать хорошим людям работать. С.П. Капица
датчик расстояния 0-50мм: какой?
Есть решение с избыточной точностью,но зато дешевое. Китайский цифровой штангенциркуль за 300р из фикспрайса. На борту есть интерфейс. Отпилить всё лишнее и засунуть в дверь. Статей о подключении и чтении с него полно.
датчик расстояния 0-50мм: какой?
Можно попробовать VL6180/VL53L0X/VL53L1X лазерный датчик дальности.https://aliexpress.ru/item/100500309194 ... 4cceLq6ZIC. Они есть на разные расстояния.
[/b]
[/b]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
датчик расстояния 0-50мм: какой?
6180 и заказал, только в другом исполнении, приедут через месяц, буду проверять.
Отправлено спустя 2 минуты 37 секунд:
Отправлено спустя 2 минуты 37 секунд:
"в дверь" - не вариант, см.пост 1.garry писал(а): 04 ноя 2022, 07:06 Есть решение с избыточной точностью,но зато дешевое. Китайский цифровой штангенциркуль за 300р из фикспрайса. На борту есть интерфейс. Отпилить всё лишнее и засунуть в дверь. Статей о подключении и чтении с него полно.
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
датчик расстояния 0-50мм: какой?
приехали... VL6180X. впечатления неоднозначные.
1. да, компактный вот вообще отлично.
2. библиотеки. есть немало, но завелись только VL6180X.h и Adafruit_VL6180X.h. по остальным ответ "ошибка инициализации" и тишина. ну да ладно.
3. ! блин, вот в какой раз уже... внимательно надо читать даташиты. вот вообще внимательно! перед заказом. а не после. короче, они все прошиты под один адрес. 0х29. сменить нельзя. точнее можно, но после отключения-включения адрес будет сброшен на 0х29. итого - либо по отдельному контроллеру на каждый датчик, либо огород с костылями с использованием пина En(SHDN на плате) либо огород с оптопарами. ну черт с ним. решаемо.
4. точность от 0 до 10 мм - никакая! нет ее. вообще.
и 5. не знаю пока, что будет на выходе с фильтрами, ну а без фильтров - опять пила \\\\
проверял на вемос мини и ардуино уно.
сейчас буду вспоминать как код в блок засунуть, делал очень давно и всего пару раз (
Добавлено: короче, что то у меня с блоком из скетча получается ровно ничего. Если кто то сможет помочь с блоком - буду признателен!
[spoiler title=скрин графика данных без фильтров] [/spoiler]
[scroll]#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();
}[/scroll]
1. да, компактный вот вообще отлично.
2. библиотеки. есть немало, но завелись только VL6180X.h и Adafruit_VL6180X.h. по остальным ответ "ошибка инициализации" и тишина. ну да ладно.
3. ! блин, вот в какой раз уже... внимательно надо читать даташиты. вот вообще внимательно! перед заказом. а не после. короче, они все прошиты под один адрес. 0х29. сменить нельзя. точнее можно, но после отключения-включения адрес будет сброшен на 0х29. итого - либо по отдельному контроллеру на каждый датчик, либо огород с костылями с использованием пина En(SHDN на плате) либо огород с оптопарами. ну черт с ним. решаемо.
4. точность от 0 до 10 мм - никакая! нет ее. вообще.
и 5. не знаю пока, что будет на выходе с фильтрами, ну а без фильтров - опять пила \\\\
проверял на вемос мини и ардуино уно.
сейчас буду вспоминать как код в блок засунуть, делал очень давно и всего пару раз (
Добавлено: короче, что то у меня с блоком из скетча получается ровно ничего. Если кто то сможет помочь с блоком - буду признателен!
[spoiler title=скрин графика данных без фильтров] [/spoiler]
[scroll]#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();
}[/scroll]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
датчик расстояния 0-100мм: vl6180x
Апаю. Второе дыхание на эту приблуду появилось. Ни чёрта пока не получается, но как будто:
Делаем мини-программу в фл прог. Или заливаем скетч из примеров в ардуино аде.
Смысл - опрашиваем датчик (один) и отправляем раз в секунду в компорт.
Наблюдение: если использовать вемос мини - часто (непрогнозируемо) в мониторе порта нет данных пока Не: закроешь монитор порта, отключишь питание есп (именно отключить питание секунд на 5, а не ресет), включишь питание, откроешь монитор, оппа. Данные начинают идти как ни в чем не бывало.
Более ничего в есп не заливается, проверил 4 экземпляра уже.
Откопал древнюю (лет ей больше 10 точно) уно. На 328 камне. А на ней таких выкрутасов нет! Залил - данные пошли. Всегда. Выдернул датчик из линии связи -компорт замер, воткнул датчик, ткнул ресет - снова пошли.
Это какая то очередная пока мне неизвестная фича?
Делаем мини-программу в фл прог. Или заливаем скетч из примеров в ардуино аде.
Смысл - опрашиваем датчик (один) и отправляем раз в секунду в компорт.
Наблюдение: если использовать вемос мини - часто (непрогнозируемо) в мониторе порта нет данных пока Не: закроешь монитор порта, отключишь питание есп (именно отключить питание секунд на 5, а не ресет), включишь питание, откроешь монитор, оппа. Данные начинают идти как ни в чем не бывало.
Более ничего в есп не заливается, проверил 4 экземпляра уже.
Откопал древнюю (лет ей больше 10 точно) уно. На 328 камне. А на ней таких выкрутасов нет! Залил - данные пошли. Всегда. Выдернул датчик из линии связи -компорт замер, воткнул датчик, ткнул ресет - снова пошли.
Это какая то очередная пока мне неизвестная фича?
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
датчик расстояния 0-100мм: vl6180x
дополняю.
два VL6180x -> ардуино уно. скетч от robojax на 2 датчика.
все работает. ну дрейфует, но работает. а на вемосе у меня это работать отказываается.
[spoiler] /*
* 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: https://youtu.be/_H9D0czQpSI
Please watch video instruciton of this code : https://youtu.be/_H9D0czQpSI
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
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);
}[/spoiler]
два VL6180x -> ардуино уно. скетч от robojax на 2 датчика.
все работает. ну дрейфует, но работает. а на вемосе у меня это работать отказываается.
[spoiler] /*
* 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: https://youtu.be/_H9D0czQpSI
Please watch video instruciton of this code : https://youtu.be/_H9D0czQpSI
This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
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);
}[/spoiler]
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя