Как подобрать оборудование для быстрого "счетчика продукции"?

Room13
Offline
Зарегистрирован: 02.03.2022

Здравствуйте.

Задача следующая:

Есть конвертовальная машина, которая делает из А4 листов конверты. Листы А4 движутся по тракту один за другим. Расстояние между страницами 1см. Скорость движения плавающая: 150-180 метров в минуту. Соответственно это где-то от 2,5 до 3 метров в секунду (чем дольше работает машина, тем быстрее движется бумага). Необходимо вести подсчет каждой страницы, пройденной по тракту.

Что я пробовал:

Лазерный дальномер VL53L0X. Если код подсчета делать в цикле loop(), то считает не верно. Например: прошло 10 страниц, а на счетчике 4. Если делать подсчет дальности, для попытки поймать препятствие - также не успевает.  Бумага стандартная 297 мм, но для округления, что от одного "разрыва" между страницами до другого грубо 300мм. Соответственно за 1 секунду у нас проходит 10 страниц. А это 10мс на страницу.  Скорость дальномера минимум 20мс. Отсюда и пропуски... 

Модуль фоторезистора для Arduino (цифровой датчик освещенности на LM393) - он очень тормозной (используется фоторезистор GL5528), и в цикле loop(), также не успевает срабатывать чтобы понять, что луча лазера не было. По сути, то же, что и с дальномером, но по даташиту для срабатывания ему нужно 20-30мс чтобы понять что свет пришел, и 30мс чтобы понять, что свет ушел. Итого 50-60 мс. Это ооочень долго. Есть возможность прицепить программное прерывание на пин в режиме HIGH. Но тогда счетчик сходит с ума. За 10 секунд счетчик может увеличиться практически на 1000. И кажется, что скорости то хватает, но это при очень слабом засвете лазера где-то в отдаленную точку, а не на сам фоторезистор. Или я не прав?

Всяческие проекты "тахометров" на подобных вещах делают лишь одно - показывать среднее значение, на текущий момент времени (либо с момента последнего замера). Мне при этом необходима ювелирная точность подсчета. 

Как еще можно проверить примерно то, что мне необходимо? Вентилятором)) Лопастя крутятся, а счетчики срабатывать не успевают - не гуд. Если "тахометр" показывает скорость вентилятора примерно 9000 в минуту, то на счетчике должна по сути быть 9000 * количество лопастей. Такого у меня не выходит.

Фактическая необходимость:

Если есть препятствие между светом и датчиком - увеличить счетчик на 1. При этом, не увеличивать, пока препятствие не будет убрано. Соответственно программное прерывание здесь не очень подходит(?) ведь пока препятствие есть, "модуль фоторезистора" все это время плюсует 1 к счетчику. Ровно как и наоборот - если препятствия нет (кончилась продукция) - ничего со счетчиком не делать.

Также смотрел следующее видео: https://www.youtube.com/watch?v=lnPdeZClbGo Там использовался оптический датчик, который реагировал на черное и белое. Судя по скорости работы (150 оборотов за 2 секунды) - скорость соответствует моим требованиям, НО - на бумаге, которая идет по тракту также есть текст - будет ли этот датчик считать, что это "новая страница" и вести себя опять не адекватно? Или я опять ошибаюсь?

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

 

Либо дополнительно можно что-то повесить, что будет считать длину страницы. Какие датчики обычно для этого используются?

Что можете посоветовать использовать? Не хочется покупать все существующие датчики, чтобы проверить работу каждого.

//int sensor;
//int kolvo;
int sensors = 0; //активность сенсора
int kolvo = 0; //счетчик количества
int startProgram = 11; //пин светодиода Старт программы
int relay = 10; //пин светодиода "счетчик +1"
int pinProgramInterrupt = 2; //пин программного прерывания
int oldCount = 0; //предыдущее значение
int distant = 0; //расстояние
int oldDistant = 0; //предыдущее расстояние
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <VL53L0X.h>


VL53L0X sensor;

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
 
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void interrupt_2(){
    sensors = 1;
  if (sensors == 1 & digitalRead(pinProgramInterrupt) == 1) {
            oldCount = kolvo;
            digitalWrite(relay, HIGH); //когда датчик обнаружил препятствие, включаем светодиод
            kolvo++;
            sensors = 0;
  }
//      if (distant < 80 & sensors == 0) { 
//        sensors = 1;
//        oldDistant = distant;
//      } else {
//          if (sensors = 1 & digitalRead(2) == 1 ) {
//            oldCount = kolvo;
//            digitalWrite(relay, HIGH);
//            kolvo = kolvo + 1;
//            sensors = 0;
//            //digitalWrite(relay, LOW);
//          }
//        }

}


void setup() {
  pinMode(sett, OUTPUT);
  digitalWrite(startProgram, HIGH); //включаем сведодиод, идет загрузка ПО/датчиков
  pinMode(relay, OUTPUT); 
  digitalWrite(relay, LOW);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.clearDisplay();
    display.setTextColor(WHITE);
          display.setTextSize(3);
          display.setCursor(1, 5);
          display.print("  OK ..");
          display.display();
          delay(1500);
          display.clearDisplay();
          
 delay(500);
//  if (!sensor.init())
//  {
//    while (1) {}
//  }
  //sensor.setMeasurementTimingBudget(20000);

  pinMode(pinProgramInterrupt, INPUT);
  attachInterrupt(digitalPinToInterrupt(pinProgramInterrupt),interrupt_2,HIGH); //программное прерывание
    digitalWrite(startProgram, LOW); //выключаем светодиод = программа готова к работе
}

void loop() {
  //distant = sensor.readRangeSingleMillimeters();
if (oldCount < kolvo){
    digitalWrite(relay, LOW); //если счетчик изменился, выключаем светодиод
  }
  display.clearDisplay();
  display.setTextSize(0);
  display.setCursor(0,0); // column row
  display.print(kolvo);
            display.setTextSize(2);
          display.setCursor(0, 17);
          display.println(distant);
  display.display();
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

А не пробовал использовать компетентного инженера? Ну вместо пляски с китайскими модулями как мартышка с очками из басни? Обычный фотодиод на просвет замечательно справится с задачей при правильной обвязке.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

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

Room13
Offline
Зарегистрирован: 02.03.2022

Сразу возникают вопросы: 1) А чем мне поможет "компетентный инженер"? Предоставит "готовое оборудование" под требуемую задачу? Так мне потом этот "счетчик" нужно будет передавать в другое МК по запросу, которое будет вести статистику скорости/простоев/и т.д. На то и использование МК, чтобы эти данные не просто видеть, а использовать их в дальнейшем, в автоматическом режиме.

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

2) Что подразумевается под "правильной обвязкой"? Сделать все вычисления скорости/расстояния/времени? Или подобрать компоненты и правильно их спроектировать? Ну написание кода от этого никуда не исчезает. 

 

Kakmyc пишет:
Нужно для начала понять как это должно работать, иначе ни программно ни аппаратно реализовать не получится.

Представьте себе, что вы положили на полу листочки формата А4 друг за другом, с разделением в 1см между ними. При этом они движутся с большой скоростью потоком. Сверху висит датчик, снизу в полу дырка. Как только датчик "видит" дырку, понимает что страницы нет. И делает +1 к количеству. За ней движется следующая бумажка, которая эту дырку закрывает - в этот момент ничего не происходит (датчик по сути ждет эту дырку). Как только датчик опять видит "дырку", то делает опять +1. Ну как как мог объяснил.

На текущий момент, там есть "из коробки" счетчик, который использует примерно такие датчики: 

https://aliexpress.ru/item/1005001498771840.html

https://aliexpress.ru/item/1005002094906516.html

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я думаю что только грамотное инженерное решение тут и поможет. И обслуживать вы его сможете и передавать данные дальше.

Вот я честно скажу - я дилетант в программировании и в электронике только любитель, мое скромное решение - использовать фотоприёмник с излучателем на ленте. Но тут не достаточно только микроконтроллера, так как незначительный перепад светочувствительности МК может и пропустить (опять таки по моему мнению), а вот компаратор (правильно настроенный) перед мк даст достоверный 1 или 0. А уж считать по прерыванию, например, поступающие импульсы от компаратора - плёвое дело. Но повторю, это мое сугубо невежественное мнение. Оно может оказаться как работающим, так и нет. Вот тут и инженер нужен (коим я не являюсь). Нужн* все спроектировать и наладить. Дальше сами. Кратковременная платная работа. 

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

Room13 пишет:

Здравствуйте.

Задача следующая:

Есть конвертовальная машина, которая делает из А4 листов конверты. Листы А4 движутся по тракту один за другим. Расстояние между страницами 1см. Скорость движения плавающая: 150-180 метров в минуту. Соответственно это где-то от 2,5 до 3 метров в секунду (чем дольше работает машина, тем быстрее движется бумага). Необходимо вести подсчет каждой страницы, пройденной по тракту.

Т.е. просвет примерно 3 миллисекунды - правильно?

Цитата:
Что я пробовал:

................

Модуль фоторезистора для Arduino (цифровой датчик освещенности на LM393) - он очень тормозной

Да.

Цитата:
Фактическая необходимость:

Если есть препятствие между светом и датчиком - увеличить счетчик на 1.

https://aliexpress.ru/item/1005002622887395.html

На светодиод и на VS1838 надеть трубки, чтобы ограничить углы засветки.

b707
Offline
Зарегистрирован: 26.05.2017

Room13 пишет:

Представьте себе, что вы положили на полу листочки формата А4 друг за другом, с разделением в 1см между ними. При этом они движутся с большой скоростью потоком. Сверху висит датчик, снизу в полу дырка. Как только датчик "видит" дырку, понимает что страницы нет. И делает +1 к количеству. За ней движется следующая бумажка, которая эту дырку закрывает - в этот момент ничего не происходит (датчик по сути ждет эту дырку). Как только датчик опять видит "дырку", то делает опять +1. Как как мог объяснил.

Во-первых, давайте определимся со скоростью. В одном месте вы пишете 10 конвертов в секунду, в другом - 10мс между конвертами. Каждый, кто знает математику, скажет что не сходится, ибо 10 раз в секунду - это 100мс, а не 10.

В третьем месте озвучено 3метра в секунду скорость ленты, конверты почти в вплотную - по мне так должно быть больше чем 10 конвертов на 3х-то метрах? Так какая скорость?

 

Тем не менее, что 100мс. что 10мс - для микроконтроллера это вечность. Он не только должен успевать считать - он еще и пива успеет выпить между конвертами :)

В луп такое не считают, для этого есть прерывание. Хотя 10мс можно и в луп ловить. Но Вам однозначно стоит нанять программиста, знания ваши почти на нуле...

rkit
Offline
Зарегистрирован: 23.11.2016

Кошмпетентный инженер решит все вопросы и задачи. За компетентную оплату, разумеется.

Room13
Offline
Зарегистрирован: 02.03.2022

b707 пишет:

В третьем месте озвучено 3метра в секунду скорость ленты, конверты почти в вплотную - по мне так должно быть больше чем 10 конвертов на 3х-то метрах? Так какая скорость?

Считаем: Скорость = 150-180 метров в минуту. Соответственно 150/60 = 2,5 метра до 180/60 = 3 метров в секунду. Мы считаем количество страниц вышедших из тракта. Длинна страница А4 = 297мм. (т.е. положение страницы А4 на ленте вы поняли). 297 мм страница + 10 мм просвет + 297 мм страница + 10мм просвет и т.д. Берем математику: 3000 мм (три метра) делим на (297+10) = 9,77 страницы в секунду. (я округлял до 10), поэтому тут все верно, в трех метрах 10 шт. (они там уже потом в тракте сложатся втрое, но нам это уже не надо).

Цитата:

Во-первых, давайте определимся со скоростью. В одном месте вы пишете 10 конвертов в секунду, в другом - 10мс между конвертами. Каждый, кто знает математику, скажет что не сходится, ибо 10 раз в секунду - это 100мс, а не 10.

хмм.. Возможно тут да, ошибся.

Цитата:

В луп такое не считают, для этого есть прерывание. Хотя 10мс можно и в луп ловить. Но Вам однозначно стоит нанять программиста, знания ваши почти на нуле...

Программиста С/С++, тут скорее соглашусь, ибо на Java я и сам что угодно напишу)) но на высокоуровневых языках нет прерываний, там и гигагерцы с памятью не считают)) особенно для мобильных приложений)

В лупе по идее считает, и даже логика так как надо - фоторезистор видит лазер +1, не видит лазер - ничего не делает. Но если прописать в прерывания - счетчик начинает показывать погоду((

SLKH пишет:

Т.е. просвет примерно 3 миллисекунды - правильно?

Ну в свете последних математических событий, видимо все-таки 30мс.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ппц листочки посчитать проблема...
Я как то делал ограничитель оборотов ДВС, вполне себе работает, без проблем и вопросов.
Считал пазы на шкиве коленвала.
Обороты ограничивались на 3000-6000 об/мин(настраивалось при запуске, нагазовав на нейтрали нужные обороты и записав их в память нажатием кнопки).
Что то мне кажется листочки посчитать проще на порядок, просто кто то не умеет в прерывания и антидребезг.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. 10 листов в секунду - это 100 мс.

2. Прерывания надо делать не по уровню, а по фронту (переднему или заднему).

3. Лично я в подобной задаче использовал фототранзисторы 3DU5C. Правда, там было 30 м/с.

Room13
Offline
Зарегистрирован: 02.03.2022

andriano пишет:

1. 10 листов в секунду - это 100 мс.

2. Прерывания надо делать не по уровню, а по фронту (переднему или заднему).

3. Лично я в подобной задаче использовал фототранзисторы 3DU5C. Правда, там было 30 м/с.

1) уже согласился чуть выше

2) RISING/FAILING? Не задумывался о разнице между ними и HIGH/LOW, почитаю, спасибо.

3) Что-то у меня со времен школьной программы не стыкуется такое. У транзисторов 3 ведь ноги? А тут 2. Отстал от такой электроники. Но можно будет попробовать, учту.

 

Еще бы найти где-нибудь, как можно спрограммировать ногу GPI01 у VL53L0X, но на просторах интернета такого нет. Что-то есть на забугорных форумах, но там все отсылают только в даташит и собственную реализацию работы с пином, а в готовых библиотеках реализации с ним нет...

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

Room13 пишет:

SLKH пишет:

Т.е. просвет примерно 3 миллисекунды - правильно?

Ну в свете последних математических событий, видимо все-таки 30мс.

Датчику VS1838 для уверенной работы нужны сигналы/паузы не намного короче 1 мс; и 3, и 30 его вполне устроят.

Так что: 1 VS1838, 1 инфр. светодиод, 1 конденсатор и 2 резистора. Ну и ардуина с простой программой.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Room13 пишет:

3) Что-то у меня со времен школьной программы не стыкуется такое. У транзисторов 3 ведь ноги? А тут 2. Отстал от такой электроники. Но можно будет попробовать, учту.

На коллектор и эмиттер подается электричество, а на базу - свет. Так что вместо третьей ноги - прозрачное окошко.

Цитата:

Еще бы найти где-нибудь, как можно спрограммировать ногу GPI01 у VL53L0X, но на просторах интернета такого нет. Что-то есть на забугорных форумах, но там все отсылают только в даташит и собственную реализацию работы с пином, а в готовых библиотеках реализации с ним нет...

Может, я чего забыл, но мне казалось, что VL53L0X - это дальномер. Или я с чем-то перепутал?

b707
Offline
Зарегистрирован: 26.05.2017

Room13 пишет:

2) RISING/FAILING? Не задумывался о разнице между ними и HIGH/LOW, почитаю, спасибо.

для вашей задачи разница колоссальная

ВН
Offline
Зарегистрирован: 25.02.2016

Все дело конечно в нормально работающем датчике, на просвет, на отражение представляются вполне рабочими вариантами. вопрос у ТС, как понимаю, довести схему "до ума".

зы. еще в 90-м году работал с пикосекундным затвором.

 

rkit
Offline
Зарегистрирован: 23.11.2016

ВН пишет:

вопрос у ТС, как понимаю, довести схему "до ума".

Для этого, для начала, нужно хоть какую-то схему составить. А не оперировать на уровне дюпонтов и китайских модулей с одним богу известными характеристиками. .

Room13
Offline
Зарегистрирован: 02.03.2022

ВН пишет:

вопрос у ТС, как понимаю, довести схему "до ума".

Именно так.

andriano пишет:

Может, я чего забыл, но мне казалось, что VL53L0X - это дальномер. Или я с чем-то перепутал?

VL53L0X - это дальномер, все правильно. но помимо I2C у него есть еще 2 пина -

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

GPIO1 - программируемый пин прерывания, по умолчанию всегда открыт. Датчик программируется на условие, если "длина <больше/меньше/равно> нужное значение" то срабатывает прерывание. Только это срабатывание происходит после того, как датчик сначала сделает замер, сверит со значением пользователя и вычислит разницу. А в датчике есть собственный МК, вычисления производит он сам внутри себя. Хорошая штука, только работает через API ST. Как именно ей воспользоваться описания 1-2 статьи на весь интернет (если удастся найти) и то в 1-2 словах. Но функционал такой есть, полезный, как раз бы подошел, заодно и проверить скорость обработки. Не очень хотелось тянуть ради одной функции всю библиотеку, которая по отзывам тяжеловата.

rkit пишет:

Для этого, для начала, нужно хоть какую-то схему составить. А не оперировать на уровне дюпонтов и китайских модулей с одним богу известными характеристиками. .

Вот именно сначала на более простых вещах - а потом уже в перспективе перенести все на отдельную плату, где уже самостоятельно использовать только те компоненты, которые нужны. (т.к. в будущем необходимо использовать еще кучу датчиков, как анализаторы СО2, метео и т.д.) Поскольку от погодных явлений прямая зависимость работы аппарата - температура, влажность, качество воздуха. А точнее, от всего этого зависит количество бракованной продукции/замятия. И в идеале придти к среднему знаменателю условий где качество будет высокое, дабы потом оперировать хоть какими-то цифрами, для выбивания бюджета на промышленные  кондиционеры/увлажнители и т.д. А пока нет цифр - нет денег. Тратить деньги на профессиональный анализ тоже никто не хочет - "и так работает"... 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ты зачем себе жизнь усложняешь ?

rkit
Offline
Зарегистрирован: 23.11.2016

Room13 пишет:

Вот именно сначала на более простых вещах - а потом уже в перспективе перенести все на отдельную плату, где уже самостоятельно использовать только те компоненты, которые нужны. (т.к. в будущем необходимо использовать еще кучу датчиков, как анализаторы СО2, метео и т.д.) Поскольку от погодных явлений прямая зависимость работы аппарата - температура, влажность, качество воздуха. А точнее, от всего этого зависит количество бракованной продукции/замятия. И в идеале придти к среднему знаменателю условий где качество будет высокое, дабы потом оперировать хоть какими-то цифрами, для выбивания бюджета на промышленные  кондиционеры/увлажнители и т.д. А пока нет цифр - нет денег. Тратить деньги на профессиональный анализ тоже никто не хочет - "и так работает"... 

Какие, в болото, кондиционеры и бюджеты. Разговор идет об обычном датчике пересечения луча.  Нужно просто иметь техническую компетенцию. Уметь читать даташиты и знать сколько миллисекунд в секунде, вот и всё.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
Ты зачем себе жизнь усложняешь ?

заскучал видимо )))

Room13
Offline
Зарегистрирован: 02.03.2022

rkit пишет:

Какие, в болото, кондиционеры и бюджеты. Разговор идет об обычном датчике пересечения луча.  Нужно просто иметь техническую компетенцию. Уметь читать даташиты и знать сколько миллисекунд в секунде, вот и всё.

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

Чтобы было немного понятней. Аппарат вот такой:

https://www.youtube.com/watch?v=_gq2gMRPfSY - но тут показана работа на медленной скорости

https://www.youtube.com/watch?v=CZlmzu_RnFk - здесь немного другой аппарат, но скорость показана выше. При этом мы работаем на еще более высокой. Отсюда можно понять, как идут страницы, которые я хочу подсчитать. При этом, на нем тоже стоят какие-то лазерные датчики, но однонаправленные (т.е. только то, что мы видим, снизу ничего нет). Там есть отверстия, куда светит луч, и я так понимаю, что установлены аналогичного действия "дальномеры", что я и пытался изначально сделать.

Немного оффтопа: Когда воздух сухой (зимой отопление и влажность низкая), бумага берет на себя много статики, липнет друг к другу, проходят "двойные" листы, которые уже идут в отбраковку. Когда холодно - она "дубеет", заливается клеем и т.д. можно сказать "проблемы любой типографии". Но не суть. Для того и делается счетчик. Сначала он будет стоять только на "входе" и считать количество страниц, которые начали идти по тракту. Когда реализация данного счетчика будет закончена, такой же будет поставлен и на выход (поскольку производителем это не было предусмотрено). В итоге будет подсчет разницы (зашло 3000 страниц, а вышло 2998 - и такого должно быть как можно меньше). Там уже дальнейшая сложная программная обвязка, с графиками, которая уже написана на других языках и к текущему МК не имеет уже отношений... Но чтобы это все заработало, нужны начальные цифры - тот самый счетчик, который я пытаюсь сделать, чтобы он правильно и точно считал каждую страницу, практически без шанса на ошибку.

 

ВН
Offline
Зарегистрирован: 25.02.2016

Room13, вот такой простейший датчик пробовал? https://aliexpress.ru/item/1005001636498706.html

сами диоды закрываешь черной термоусадкой, чтобы только спереди отверстие было ( Бленда, слово такое слышал? Вот оно тебе тут надо.) Дальше ставишь плату || щели между листами, т.е. чтобы когда щель, то и фото и свето диод смотрят в щель, соответственно отражения от листа нет. т.е. на щели требуется большой перепад коэф. отражения.  Расстояние от листа до диодов должно быть небольшое  1- 5см.

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

Room13
Offline
Зарегистрирован: 02.03.2022

Я вчера попробовал вот такой датчик: https://aliexpress.ru/item/32862306728.html

Без необходимости натягивать термоусадки, поскольку внутри уже есть разделения.

И могу сказать, что он работает практически отлично, скорости хватает. Но за исключением того, что иногда цифры уходят "в плюс". А точнее всегда. Было сделано 1000 конвертов, на счетчике написано 1013 (плавающая цифра; при другой тысяче было 1009 на счетчике). Также заметил, что при постоянной скорости подачи листов, счетчик иногда за один лист прибавлял от 1 до 4 цифр сразу. Возможно это связано с тем, что датчик не находится в состоянии жесткого покоя, а есть вибрация от машины, в связи с чем он и на выходе страницы посчитал +2, и на следующем входе сделал +1/+2.

Осталось устранить только "эффект дребезга", но в прерывании delay() не работает, поэтому скорее всего это нужно будет сделать аппаратно, в связи с чем, хотелось бы спросить: из этой статьи https://arduinomaster.ru/datchiki-arduino/ustranenie-drebezg-kontaktov-knopki/ есть описание как "Подавление дребезга с помощью триггера шмидта"... Оно мне может помочь, или без толку?

sadman41
Offline
Зарегистрирован: 19.10.2016

Фотодатчик - это не кнопка. Нужно искать причину - плохой контакт в соединениях, наводки, засветки, переотражения и тд. Только после этого будет ясно, как бороться.

rkit
Offline
Зарегистрирован: 23.11.2016

Room13 пишет:

Я вчера попробовал вот такой датчик: https://aliexpress.ru/item/32862306728.html

Это концевик же. От него не требуется идеально чистых фронтов или еще чего.

 

Room13
Offline
Зарегистрирован: 02.03.2022

rkit пишет:

Это концевик же. От него не требуется идеально чистых фронтов или еще чего.

т.е. идеально-чистую бумагу? Ну по сути на ней есть текст черного цвета, но если бы было настолько критично, я думаю что при подсчете 5000 страниц, счетчик бы не врал на +150/250 страниц, а было бы практически в 2-3-4 раза больше. Наверное.

sadman41 пишет:
Фотодатчик - это не кнопка. Нужно искать причину - плохой контакт в соединениях, наводки, засветки, переотражения и тд. Только после этого будет ясно, как бороться.

Т.е. никакого "дребезга" тут быть не может, правильно понимаю? И ставить очередной триггер смысла нет.

Плохой контакт исключен, на плате использовалась пайка + сам датчик был подключен через болтовое соединение. По поводу засветки - датчик ставил внизу на выходе, там где света очень мало. А вот по поводу переотражения... На какой оптимальной длине должен быть объект от датчика? В текущем моменте, было примерно в районе 1см между листом и датчиком. После того как листа нет, датчик смотрел в пол - в районе метра. И еще: в этом датчике, как я вижу, два "измерителя" - инфракрасный излучатель и уловитель отражения. Есть разница, как их расположить, вдоль или поперек? 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы сначала на столе провёл испытания. Взял вентилятор, нацепил на него картонку с прорезями, как в реальности, нацелил девайс и начал на осциллографе смотреть - чего он там за импульсы выдаёт, где и при каких расстояниях/углах наклона троит.

rkit
Offline
Зарегистрирован: 23.11.2016

Фронтов. Сигналов. В сотый раз - что ты надеешься сделать, если ты не знаешь основ электроники?

Room13
Offline
Зарегистрирован: 02.03.2022

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

Сигнал 0 - бумага начинает заходить на датчик (сигнал нарастает), отдает 1, и резко отдает опять 0, из-за вибрации датчика. И получается так, что на некоторую долю миллисекунд, датчик оказывается впереди бумаги (вибрация заставляет датчик двигаться на +/- 1 мм в разные стороны). А бумага движется дальше и заходит на датчик уже некоторое долгое время отдавая 1 (пока луч пересекается). В таком случае ведь может быть на одну страницу в счетчике +2. Поэтому спросил дополнительно про триггер. Но судя по всему, длительность нарастания и спада сигнала, может скорректировать случайные вибрации/движения датчика: в тот момент сигнал начал нарастать и не успел стать на высокий уровень, а движение датчика произошло, сигнал опять затухает, и ничего не происходит.

С самой бумагой вариант отпадает, пробовал - черный текст никак не меняет сигнал (в момент когда двигаешь датчик и цвет меняется от белого до черного), и датчик не срабатывает, пока лист не уйдет полностью. Это хорошо. И при этом - если перед ним махать черным кабелем/фломастером/коробкой - то он тоже на него не реагирует совершенно. С какой-то стороны это тоже хорошо. (ну пока мы вдруг не захотим печатать белым тонером на черной бумаге... :)) )

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

Я программист PHP/Java/Android(Kotlin) - и чаще я работаю с ПО, а не с железом. И в своей практики никак не используются битовые сдвиги/анализы сигналов и т.д., поскольку это языки высокого уровня. С тут сейчас полез на низкий уровень. На доктора физики не претендую, и конечно могу каких-то "основ" не знать, но ведь я за этим сюда и пришел - спросить/уточнить/посоветоваться. Поскольку с какими-то компонентами мог никогда не работать. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

ВН
Offline
Зарегистрирован: 25.02.2016

т.е. внутри самого прерывания можно сделать несколько проверок уровня на датчике + можно дополнить  это бланкированием. Тут уже после обнаружения сигнала формируется большая задержка на 40-80мс, можно через delay(), внутри которой сигнал не ищется.   

nik182
Offline
Зарегистрирован: 04.05.2015

Room13 пишет:

...

Осталось устранить только "эффект дребезга", но в прерывании delay() не работает, поэтому скорее всего это нужно будет сделать аппаратно...

В прерывании работает delayMicroseconds. Но может сработать запрет прерываний на время прохода половины  конверта, с очисткой прерывания после запрета. Разрешать прерывания в основном цикле.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Я принимал на диод ФД-263 свет с частотой модуляции 10 МГц.

т.е. Да, считать бумажные листы оптическим датчиком реально.

Room13
Offline
Зарегистрирован: 02.03.2022

В общем результат каков... Я использовал RISING/FAILING в программном прерывании. И все-таки вернулся на прерывания по уровню. Сегодня изменил на HIGH, немного дописал, затестил и... все считает 1 в 1. Не знаю уж было это критично или нет, но стало так как и необходимо. Проверил на нескольких тысячах страниц. Поэтому в принципе, можно считать, что проект успешен. Спасибо всем и за комментарии и за "не понимаешь что делаешь")) В частности благодарность SLKH - за то, что подтолкнул на использование инфракрасного датчика. Результирующий скетч также выложу, вдруг сам потеряю, либо кому-нибудь пригодится при работе с аналогичной задачей.

int sensors = 0; //активность сенсора
volatile unsigned long int kolvo = 0; //счетчик количества
int startProgram = 11; //пин светодиода "Старт программы"
int relay = 10; //пин светодиода "счетчик +1"
int countNull = 9; //пин светодиода "сброс счетчика"
int pinProgramInterrupt = 2; //пин программного прерывания
volatile unsigned long int oldCount = 0; //общий счетчик
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//const unsigned char epd_bitmap_logo [] PROGMEM = {
//массив логотипа
//};

void interrupt_2(){
  sensors = 1;
    
  if (sensors == 1 & digitalRead(pinProgramInterrupt) == 1) {
            oldCount++;
            digitalWrite(relay, HIGH); //когда датчик обнаружил препятствие, включаем светодиод
            kolvo++;
            sensors = 0;
  }
}

void setup() {
  pinMode(startProgram, OUTPUT);
  digitalWrite(startProgram, HIGH); //включаем сведодиод, идет загрузка ПО/датчиков
  pinMode(relay, OUTPUT); //вывод на оптический датчик
  pinMode(countNull, OUTPUT); //светодиод "сброса на ноль"
  digitalWrite(relay, LOW);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

    display.clearDisplay();
    //display.drawBitmap(0, 0, epd_bitmap_logo, 119, 45, WHITE); // рисуем нашу картинку на экране
    display.display(); // выводим её на OLED
    delay(4000);
    display.clearDisplay(); // очистка дисплея
        
    display.clearDisplay();
    display.setTextColor(WHITE);
    display.setTextSize(3);
    display.setCursor(1, 5);
    display.print("  OK ..");
    display.display();
    delay(1000);
    display.clearDisplay();
          
    delay(100);

  	pinMode(12,INPUT_PULLUP);
  	pinMode(pinProgramInterrupt, INPUT);
  	attachInterrupt(digitalPinToInterrupt(pinProgramInterrupt),interrupt_2,HIGH); //включаем программное прерывание

    	digitalWrite(pinProgramInterrupt, HIGH);
    	digitalWrite(startProgram, LOW); //выключаем светодиод = программа готова к работе
}

void loop() {
  digitalWrite(relay, LOW); //выключаем светодиод

  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0,8);
  display.print(oldCount);
  display.setTextSize(2);
  display.setCursor(0,17);
  display.print(kolvo);
  
  display.display();
      if ((!digitalRead(12))) { //при отпускании кнопки "сброса", верхний счетчик считает дальше, нижний устанавливается в 0
          digitalWrite(countNull, HIGH);
          kolvo = 0;
          delay(200);
          digitalWrite(countNull, LOW);
      }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

так всё же - вдоль или поперёк?

Room13
Offline
Зарегистрирован: 02.03.2022

ua6em пишет:

так всё же - вдоль или поперёк?

В момент, когда тест завершился успешно - а точнее: были использованы разные скорости, а сама подача страниц происходила пачками разным количеством (от 10-200-500-1000 страниц и т.д.) - был использован скетч указанный выше, а датчик установлен строго вдоль направления бумаги (левая картинка направления датчика).