Лазерный датчик 12v

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Доброго времени суток друзья. Имеется проект, "проверка наличия этикетки на прозрачной пробирке" имеется ряд датчиков, все они работают в диапазоне 10-30v и имеют 3 контакта -

Информация о датчике - di-soric ogu 031 G3-T3
AgOzfkuAucM.jpg
Так вот с какими проблемами я столкнулся :
1) Питание датчика - из манула по датчику, мне требуется подавать питание в диапазоне 10-30v, Я выбрал 12V - так как по факту это единственный доступный вариант. Но так как датчик PNP из этого следует, что сигнал будет приходить с таким же вольтажем, следовательно, мне нужно его понизить до 5v или ниже?
2) К сожалению, датчик не успевает срабатывать точно, из-за скорости линии и воспринимает грани пробирки как сигнал. Идея такая, рассчитать время прохождения пробирок непосредственно напротив датчика (происходит захват 12 пробирок и их движение через датчик) и включать его только в тот момент, когда центр пробирки оказывается напротив луча, но опять же, как это реализовать, учитывая скорость пробирок на конвейере ? h_T9tTvJO5M.jpg
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Делитель напряжения поможет снизить выходной сигнал.
Реализовать можно примерно так. без жесткой привязки ко времени. Калибровка по размеру пузырька: Получили сигнал от грани (на каждой грани срабатывает стабильно) - начало пузырька, получили сигнал от второй - конец пузырька. Вот это время надо вычислить, А в работе получить сигнал от грани, задержка до середины, чтение, ожидание конца пузырька.
Еще надо учесть, что сам замер длится какое то время. Удачи
 
  • Лойс +1
Реакции: JimmyTodeskey

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Делитель напряжения поможет снизить выходной сигнал.
Реализовать можно примерно так. без жесткой привязки ко времени. Калибровка по размеру пузырька: Получили сигнал от грани (на каждой грани срабатывает стабильно) - начало пузырька, получили сигнал от второй - конец пузырька. Вот это время надо вычислить, А в работе получить сигнал от грани, задержка до середины, чтение, ожидание конца пузырька.
Еще надо учесть, что сам замер длится какое то время. Удачи
333.jpg
Правильно я понял подключение датчика ?) и у меня нет мыслей, как организовать програмно считывание "пузыря" так как датчик размыкается и по факту является выключателем..
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
1601554089273.png

А организовать непрерывным считыванием сигнала А с аналогового входа, для начала подключить пустой пузырек и посмотреть, что получается на А входе при прохождении его через датчик. Должны быть какие изменения, вот эти изменения надо ловить
 
  • Лойс +1
Реакции: JimmyTodeskey

kostyamat

★★★★★★✩
29 Окт 2019
1,098
632
@JimmyTodeskey, можно.
На сколько я понял, он программируемый. И может считывать до 5000 показаний в секунду, так что это не просто выключать. :)

Имхо, для данной задачи железка выбрана не верно. Я ведь так понимаю, что пузырьки могут быть повернуты этикетками в любую сторону? Тогда вы будете получать отражение луча очень рандомно, и как это потом все фильтровать - еще та задачка. Пока не знаю что вам вместо нее посоветовать, но эта штука рассчитана работать как барьер, с непрозрачными объектами.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Вроде бы да, лучше схему по всем правилам рисовать, там где точки есть соединения , там где нет - нет, а тут по логике понимаю , что кое где есть.

Задача бы упростилась, если бы этикетка занимала более 260 градусов. Тогда бы хоть один край ее зацепился бы. Ну или если бы они строго ориентированы были.
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
@JimmyTodeskey, можно.
На сколько я понял, он программируемый. И может считывать до 5000 показаний в секунду, так что это не просто выключать. :)

Имхо, для данной задачи железка выбрана не верно. Я ведь так понимаю, что пузырьки могут быть повернуты этикетками в любую сторону? Тогда вы будете получать отражение луча очень рандомно, и как это потом все фильтровать - еще та задачка. Пока не знаю что вам вместо нее посоветовать, но эта штука рассчитана работать как барьер, с непрозрачными объектами.
вообще ориентация всегда одна и датчик располагается именно так, что бы не было места без этикетки...
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Вроде бы да, лучше схему по всем правилам рисовать, там где точки есть соединения , там где нет - нет, а тут по логике понимаю , что кое где есть.

Задача бы упростилась, если бы этикетка занимала более 260 градусов. Тогда бы хоть один край ее зацепился бы. Ну или если бы они строго ориентированы были.
1601995096422.png
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Надеюсь 4 и 3 не соединены ? Если нет, то все верно. Номиналы можно брать из моей картинки, они рассчитаны на выход кажется чтото типа 4.8 вольт.
теперь в цикле loop сделать что то типа
Тестовый код:
void loop()
{
static int16_t old_a=0;
int16_t a=analogRead(A1);
if (a!=old_a)
{
Serial.println(a);
old_a=a;
}
}
В результате в монитор порта будет выведено изменение аналогового значения (можно не переводить в вольты) без лишних повторений.
Надо очистить монитор, провести пузырьком без этикетки, сохранить результаты в каком нибудь блокноте, а потом повторить тоже для пузырька с этикеткой.
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Надеюсь 4 и 3 не соединены ? Если нет, то все верно. Номиналы можно брать из моей картинки, они рассчитаны на выход кажется чтото типа 4.8 вольт.
теперь в цикле loop сделать что то типа
Тестовый код:
void loop()
{
static int16_t old_a=0;
int16_t a=analogRead(A1);
if (a!=old_a)
{
Serial.println(a);
old_a=a;
}
}
В результате в монитор порта будет выведено изменение аналогового значения (можно не переводить в вольты) без лишних повторений.
Надо очистить монитор, провести пузырьком без этикетки, сохранить результаты в каком нибудь блокноте, а потом повторить тоже для пузырька с этикеткой.
Arduino: 1.8.13 (Windows 10), Плата:"Arduino Uno"

Скетч использует 1650 байт (5%) памяти устройства. Всего доступно 32256 байт.

Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.

Скетч использует 1650 байт (5%) памяти устройства. Всего доступно 32256 байт.

Глобальные переменные используют 188 байт (9%) динамической памяти, оставляя 1860 байт для локальных переменных. Максимум: 2048 байт.

Ошибка открытия последовательного порта "COM3" (Port busy)
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x79
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x79



Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
всё было хорошо, но не долго, коротнули дороги порта vin и земли и теперь скетчи не грузятся ) чую нужна новая плата)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Не нужна. Где то ком порт уже открыт. Надо закрыть его. Бывает во второй копии IDE
Ну и в скетче надо Serial открыть конечно в setup
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Не нужна. Где то ком порт уже открыт. Надо закрыть его. Бывает во второй копии IDE
Ну и в скетче надо Serial открыть конечно в setup
Да не, во вторую всё шьётся, похоже все таки, что то пальнул. И индикация на ней горит странновато ) жалко, оригинальная была, осталась только китайская)
 

bort707

★★★★★★✩
21 Сен 2020
3,067
915
жалко, оригинальная была, осталась только китайская)
вместо одной оригинальной лучше купить 5-10 китайских, работают они одинаково. но вторые не так жалко жечь :)
Когда только начинаете эксперименты - советую иметь под рукой запас компонентов.
Китайцы не просто так все продают по 5-10 штук :)
 
  • Лойс +1
Реакции: JimmyTodeskey

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Надеюсь 4 и 3 не соединены ? Если нет, то все верно. Номиналы можно брать из моей картинки, они рассчитаны на выход кажется чтото типа 4.8 вольт.
теперь в цикле loop сделать что то типа
Тестовый код:
void loop()
{
static int16_t old_a=0;
int16_t a=analogRead(A1);
if (a!=old_a)
{
Serial.println(a);
old_a=a;
}
}
В результате в монитор порта будет выведено изменение аналогового значения (можно не переводить в вольты) без лишних повторений.
Надо очистить монитор, провести пузырьком без этикетки, сохранить результаты в каком нибудь блокноте, а потом повторить тоже для пузырька с этикеткой.
какие есть идеи, нету явных пиков и тд, график слишком шумный.. я понял в чем проблема, почему то отрубается постоянно компорт при подключении 12v в пины ардуины
1602513732084.png
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
А можно из обычного монитора порта и не график а числа. И два отдельных куска данных с подписью где наклейка, а где нет
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
А можно из обычного монитора порта и не график а числа. И два отдельных куска данных с подписью где наклейка, а где нет
пробирка без этикетки

10:12:34.753 -> 992
10:12:34.753 -> 990
10:12:34.753 -> 993
10:12:34.753 -> 991
10:12:34.753 -> 990
10:12:34.753 -> 0
10:12:34.787 -> 991
10:12:34.787 -> 993
10:12:34.787 -> 992
10:12:34.787 -> 0
10:12:34.787 -> 991
10:12:34.787 -> 991
10:12:34.787 -> 992

Пробирка с этикеткой

10:15:31.811 -> 990
10:15:31.811 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 0
10:15:31.845 -> 991

Две пробирки в руке

10:16:53.684 -> 990
10:16:53.684 -> 0
10:16:53.684 -> 991
10:16:53.684 -> 989
10:16:53.684 -> 992
10:16:53.684 -> 989
10:16:53.724 -> 991
10:16:53.724 -> 991
10:16:53.724 -> 0
10:16:53.724 -> 0
10:16:53.724 -> 0
10:16:53.724 -> 0
10:16:53.724 -> 0
10:16:53.724 -> 990
1602573930424.png я думаю понятно, где пробирка без этикетки
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Эти данные куда более информативны, чем предыдущие. У пред. картинок меня смущала частота в 51 гц. Тут точно не мой код. Мой должен выдавать данные по другому. И еще судя по всему скорость разная.
И что выходит ? 0 и 0 на первых данных это грани, разница 34 миллисекунды. Получаем 1-ый ноль, запоминаем время, пока идет 34 мс снимаем показания. Можно просто вычислять среднее. Для этикетки будет среднее ближе к 0, для пустой ближе к 600, порог надо отладить. Для этикетки время тоже - 34 мс.
Для 2-х этикеток в руке время другое 40 мс. Тут вариант такой, либо скорость провода должна быть постоянная либо пузырьки должны идти с каки либо интервалом, не вплотную.
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Эти данные куда более информативны, чем предыдущие. У пред. картинок меня смущала частота в 51 гц. Тут точно не мой код. Мой должен выдавать данные по другому. И еще судя по всему скорость разная.
И что выходит ? 0 и 0 на первых данных это грани, разница 34 миллисекунды. Получаем 1-ый ноль, запоминаем время, пока идет 34 мс снимаем показания. Можно просто вычислять среднее. Для этикетки будет среднее ближе к 0, для пустой ближе к 600, порог надо отладить. Для этикетки время тоже - 34 мс.
Для 2-х этикеток в руке время другое 40 мс. Тут вариант такой, либо скорость провода должна быть постоянная либо пузырьки должны идти с каки либо интервалом, не вплотную.
скорость постоянная, просто нету возможности сейчас установить на то место, интервал тоже есть (вот так выглядит двежение туда и обратно 8 пробирок, но я поменял датчик на нормально разомкнутый, так как сложно было начинать и заканчивать цикл. Вопрос такой, как правильно записать цикл от начала сигнала (как только он увидел пробирку) и конец(начало перерыва между пробирками) либо же построение самой логики записи в определенное время с начала считывания пробирки (какой то временной интервал или условие)


C++:
long  i;
long  i1;
long  i2;
long  i3;
long  i4;
long  j;

void setup()
{
  Serial.begin(9600);

   i = 0;

   i1 = 0;

   i2 = 0;

   i3 = 0;

   i4 = 0;

   j = 0;


}


void loop()
{
     i = analogRead(A0);
    if (i > 0) {
      do {
         i1 = analogRead(A0);
        delay(10);
         i2 = analogRead(A0);
        delay(10);
         i3 = analogRead(A0);
        delay(10);
         i4 = analogRead(A0);
         j = i1 + i2 + i3 + i4;
        Serial.println(j);
      } while ((i > 0));
    }

}
с этикеткой
14:39:23.969 -> 2967
14:39:23.969 -> 3953
14:39:24.007 -> 1978
14:39:24.046 -> 0
14:39:24.076 -> 0
без этикетки
14:39:24.117 -> 992
14:39:24.161 -> 1977
14:39:24.161 -> 989


может есть решение пологичнее или просто играть с параметрами задержки считывания
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Примерно так. Имеем ноль на входе. Знаем, что 1 пробирка идет мимо датчика примерно 0.1 секунды (вставить свое)
тогда цикл будет примерно такой
1) читаем датчик
2) Если не 0, то запоминаем время начала пробирки
сумма=показанию датчика
измерений=1;
пока текущее время меньше (время начала пробирки+0.1)
{
сумма=сумма+показание датчика
измерений=измерений+1;
}
Выход из цикла, считаем среднее значение показаний, для пробирки с биркой и без должно отличаться изрядно, и в зависимости от суммы делаем вывод
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
Примерно так. Имеем ноль на входе. Знаем, что 1 пробирка идет мимо датчика примерно 0.1 секунды (вставить свое)
тогда цикл будет примерно такой
1) читаем датчик
2) Если не 0, то запоминаем время начала пробирки
сумма=показанию датчика
измерений=1;
пока текущее время меньше (время начала пробирки+0.1)
{
сумма=сумма+показание датчика
измерений=измерений+1;
}
Выход из цикла, считаем среднее значение показаний, для пробирки с биркой и без должно отличаться изрядно, и в зависимости от суммы делаем вывод
А как реализовать кодом, не создание -6 переменных (как у меня i1,i2,i3... и тд) а именно считать допустим каждую милисекунду заданный интервал времени (время прохождения пробирки) и суммировать эти значения
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
не надо каждую. просто делать подряд замер за замером
kol_vo=0;
summa=0;
tstart=millis()
while ((t1-millis())<delta_t)
{
summa=summa+analogRead(..);
kol_vo++;
}
if (summ/kol_vo> 200) {}
 

JimmyTodeskey

✩✩✩✩✩✩✩
29 Сен 2020
20
0
В общем, в связи с тем, что оказалось - что существуют пробирки разной длины, этот датчик не подходит. Как думаете, какие еще датчики можно подключить к ардуине (не обязательно промышленные) в принципе, нужен датчик, способный не замечать прозрачные объекты ( а так как этикетка не прозрачная) он будет ее видеть ) но при этом, желательно наличие дальномера или типа того :D