Устройство на Ardiuno для контроля пересечения барьера.

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Ну наконец-то в третьем релизе автор избавился от бесполезного трехкратного чтения входов. Хотя, убрав одну ошибку, наворотил ошибок других. Эх, "40 лет программирования" - 40 лет писания багов.

В третьем релизе предыдущая бесполезность заменена другой бесполезностью:

Код: Выделить всё

void cannal_1() {
imp1++;
}

void ReadSignals() {
if (imp1<3) sign1=1; else sign1=0; imp1=0;
Типа "если принято три вспышки светика, то..." Но это всё равно не имеет смысла, поскольку не отделяет истинный прием светика от ложного. Эти три импульса наберутся при любом раскладе. Чтобы отсеять ложные импульсы, помимо инкремента должен быть и декремент.
Правильность определения импульса здесь следует определять по обоим фронтам, сравнивая полученную длительность импульса с ожидаемым диапазоном, и на этом основании и выносить решение о том, принят ли реальный импульс или это была помеха.
В противном случае, вот эти вот три фронта - это пустая трата времени и кода. Любая серия коротких помех за интервал времени между вызовами ReadSignals() наберет эти ваши три импульса, и они будут неотличимы от реального сигнала.
А то, что сейчас "на столе" работает нормально, означает лишь то, что таких случайных помех сейчас нет.
Я ж говорю - ошибки в коде могут оставаться незамеченными и не портить работу в определенных условиях.

По стилю кодописания - по-прежнему жуть жуткая. В языке С принято каждую новую команду записывать с новой строки. Это убирает неоднозначность чтения, как в показанном блоке, когда команда imp1=0 фактически выполняется за пределами блока if-else.
Про ошибки с англ.названиями уже неоднократно говорил. "Вперед" - это не DIR, а forward. "Возможное пересечение вперед" - это "possible forward". Фраза "do back" переводится как "делай наоборот". Слово "channel" пишется именно так, через "h". "Rate" - это "скорость, темп". "Режим" - это "mode".
"Fire" - это "огонь" или "стрельба". А "свет" - это "light". А то из текста получается, что первый вошедший в сортир будет застрелен :))
Реклама
Грызет канифоль
Сообщения: 265
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Наверное, имеет смысл слать пачку высокочастотных импульсов, ширина которой сравнима с медленными процессами. Тогда полезный сигнал выделится простейшим RC-фильтром, помеха не пройдёт или пройдёт внутри пачки, что нестрашно.
(возможно, подобное уже советовали ранее, не читал всё.)
Rapra писал(а): Вт июн 23, 2026 04:38:20 первый вошедший в сортир будет застрелен :))
:))
Реклама
Друг Кота
Сообщения: 9225
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Блин... Опять перешли к программной части не доделав схему. .
Нельзя подключать мосфет напрямую к МК.
Ёмкость затвора посадит порт МК.
А ещё из-за ёмкости затвора будут смазанные импульсы. Хотя это уже мелочи.
А зачем там вообще мосфет ? Мосфеты используют для серьёзных нагрузок с большими токами. Там где важно низкое падение напряжения.
У нас же простой светодиод )) С током несколько десятков миллиампер максимум. В этом случае все используют простой биполярный транзистор. В пульте телевизора стоит простой биполярный транзистор. И никто не жалуется ))
Вот взяли себе все привычку пихать повсюду мосфеты. И где надо и где не надо ))
Грызет канифоль
Сообщения: 265
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

roman.com писал(а): Вт июн 23, 2026 11:55:46 Нельзя подключать мосфет напрямую к МК.
Ёмкость затвора посадит порт МК.
А ещё из-за ёмкости затвора будут смазанные импульсы. Хотя это уже мелочи.
А зачем там вообще мосфет ? Мосфеты используют для серьёзных нагрузок с большими токами. Там где важно низкое падение напряжения.
Специально отмечу для тех, кто начинающий и случайно прочтёт: сказанное roman.com и выделенное в цитате является бредом.
Сам порт GPIO современного микроконтроллера является комплементарной парой MOSFET. Полевые транзисторы, в том числе с изолированным затвором, имеют огромный ряд моделей, как маломощных (и со встроенными резисторами а-ля цифровые), так и мощных - точно так же, как и биполярные. Технология MOSFET не определяет область применения однозначно. Используется от чипов памяти до силового управления.
Рискну утверждать, сейчас область применения полевых транзисторов шире, чем у биполярных.

Ёмкость затвора сигнальных полевых транзисторов крайне мала и заряжается мгновенно; в отличие от биполярных транзисторов управление не требует постоянного тока, только импульсный. Он ограничивается резистором так же, как и для биполярного. Что же касается "смазанности фронтов", то рекомендую ознакомиться с принципами работы обоих вариантов транзисторов и сделать самостоятельный, удивительный (для roman.com) вывод.
Последний раз редактировалось Zapolyarny Вт июн 23, 2026 13:17:30, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 9225
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Ёмкость крайне мала...
А можно цифры ? А не бла-бла...
Хотя ладно... Сам отвечу )) Вразумительного ответа тут все равно не дождешься ))
Ёмкость мосфета средней мощности в среднем несколько нанофарад. Достаточно чтоб нагрузить порт МК выше нормы.
:tea:
Реклама
Грызет канифоль
Сообщения: 265
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Большей частью стараюсь давать вразумительные ответы. Увы, но если для Вас они должны выглядеть картинками а-ля "дверной замок", то это пока для меня сложно.
Нет никакой сложности открыть предложения сигнальных MOSFET какого-либо производителя.
Например: https://www.way-on.com/Product-Center/info-350.html

WM05N02M - ток (продолжительный ) 200 мА, вполне достаточно для мощного IR. Типовая Ciss = 31 пФ. Фронты 14/18 нс.
roman.com писал(а): Вт июн 23, 2026 12:36:10 Ёмкость мосфета средней мощности в среднем несколько нанофарад. Достаточно чтоб нагрузить порт МК выше нормы.
Вы ранее смело нагружали 40 мА и даже не поперхнулись тем, что пьёте. Процесс заряда не является прямой во времени, да и вообще-то учитывается энергия. У биполярного транзистора также есть входная ёмкость. Возьмём для сравнения 2N3904 - 8 пФ. Добавим паразитные ёмкости резистора и проводника да и самого вывода МК - уже больше 10 пФ.
А теперь давайте вспомним и про паразитные индуктивности, чтобы прийти к выводу, что всё несколько сложнее, чем "у MOSFET ёмкость". И даже очень большая крутизна фронтов может быть больше проблемой, чем преимуществом.
--------------
Мои знания о транзисторах составляют, наверное, один жалкий процент от необходимых, поэтому здесь и в сообщении выше могут быть неточности и ошибки. Лучше обратиться к профессиональным источникам информации.
Вложения
wayon~wm05n02m.pdf
(312.06 КБ) 1 скачивание
Реклама
Друг Кота
Сообщения: 9225
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Далее .. Мы выяснили что входная ёмкость полевого транзистора в сотни раз больше входной ёмкости биполярного транзистора. Поэтому полевой транзистор напрямую подключать к МК нельзя. Нужен токоограничивающий резистор.
Но чаще используют усилитель тока. Так делают в нормальных схемах.

Значит подставим простой биполярный транзистор как в пульте телевизора. У него маленькая ёмкость и проблем нет.
:tea:

Рисовать графики заряда ёмкости мы не будем. Тут картинки не любят.))

Остальные ёмкости (выходная и проходная) мы рассматривать не будем. Иначе весь чат превратится в кружок "начинающих с 40-ка летним стажем" ))
:)))

Расчёт транзисторного усилителя производить не будем. И так много букаф )))

Фильтр по питанию - это резистор (несколько сотен Ом) и конденсатор (десяток микрофарад достаточно).
На каждый усилитель ставится свой отдельный фильтр.

Параллельно фотодиоду резистор не нужен. Т.к. фотодиод нагружен низким (десятки Ом) входным сопротивлением транзисторного усилителя.

Далее транзисторный усилитель подключается к МК по схеме с открытым коллектором. Тут вопросов нет.

А передатчик под вопросом.
У меня светодиод подключен к МК через резистор 500 Ом. Мне мощности для управления телевизором хватает.
Мощность передатчика можно оценить "на глаз" с помощью видеокамеры в телефоне. По яркости свечения светодиода.
Правда у меня приемник типа TSOP у которого чувствительность в несколько раз лучше даже трёх каскадного усилителя на транзисторах. Все благодаря полосовому фильтра TSOP. Но это уже отдельная тема ))
Думаю для дверного проёма 60 сантиметров транзистор в передатчика не нужен. Надо смотреть на месте. Все зависит от чувствительности приемника.
:tea:
Встал на лапы
Аватара пользователя
Сообщения: 94
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Сообщение Massaraksh7 »

Ладно, на месте видно будет. Максимальный ток IR-светодиода 20ма. Тогда резистор 100 Ом с двойным запасом. Посмотрим. Но я бы для надёжности поставил 2N7000 из наличия.
Насчёт входной ёмкости:
Sa2.png
(55.6 КБ) 8 скачиваний
Грызет канифоль
Сообщения: 265
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

Massaraksh7 писал(а): Вт июн 23, 2026 16:52:42 Максимальный ток IR-светодиода 20ма.
У многих инфракрасных светодиодов 50 мА.
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Возвращаясь к программной части. Как выглядит печень здорового человека построил бы код программист с 40-летним стажем. Он бы не стал писать линейный связанный код, а разбил это на независимые блоки с набором входных и выходных данных.
Первым делом, выделил бы блок для проверки наличия/отсутствия импульсов сигнала на фотоприемнике:

Код: Выделить всё

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

Код: Выделить всё

enum class SensorEvent {
    OPENED,  // остается открытым
    CLOSING, // перешел в закрытое состояние
    CLOSED,  // остается закрытым
    OPENING  // перешел в открытое состояние
};
SensorEvent SensorEventRecognition(bool nowSignal, bool prevSignal)
{
    if(nowSignal == true)
    {
        if(prevSignal == true) return SensorEvent::OPENED;
        else return SensorEvent::OPENING;
    }else
    {
        if(prevSignal == false) return SensorEvent::CLOSED;
        else return SensorEvent::CLOSING;
    }
}
здесь при вызове этой ф-ции сравнивается наличие сигнала датчика в момент вызова ф-ции и в предыдущем вызове, и таким образом определяются переходы между состояниями.
Для каждого фотоприемника - отдельное определение наличия сигнала и его переходов.

Теперь можно совместить два фотоприемника для определения направления пересечения барьера.

Код: Выделить всё

enum class IntersectionEvent {
    NONE,     // не было пересечения
    ENTERED,  // вошел
    EXITED,  // вышел
    ENTERING,   // в процессе входа
    EXITING  // в процессе выхода
};
IntersectionEvent IntersectionRecognition(SensorEvent sensorA, SensorEvent sensorB);
здесь по необходимости можно добавить и другие условия, типа измерения времени прохождения датчиков и отсеивания ложных входов/выходов.
И в затем уже добавлять модуль подсчета вошедших/вышедших человеков и модуль включения/выключения света. Только называть его не FireOn, а LightOn, чтобы не получилось "открыть огонь (выстрелить) по первому вошедшему".

То есть, вот в таком ключе бы начал решать задачу программист с 40-летним стажем, пусть даже и не связанный с электроникой, но умеющий строить логику программы.
А то, что в который раз пишет топикстартер, это никак не вяжется с его утверждением, что он якобы 40 лет занимается программированием. Его писанина похожа на то, как пишут новички в течение первого полугода.
Как-то так, вопсчем.
Встал на лапы
Аватара пользователя
Сообщения: 94
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Сообщение Massaraksh7 »

Zapolyarny писал(а): Вт июн 23, 2026 17:23:21 У многих инфракрасных светодиодов 50 мА.
за что купил, за то продаю.
Screenshot_1.png
(118.12 КБ) 12 скачиваний
Грызет канифоль
Сообщения: 265
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

ох... но это же совсем не спецификация ни разу...
OKF
Это не хвост, это антенна
Сообщения: 1417
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Rapra писал(а): Ср июн 24, 2026 05:13:54 Возвращаясь к программной части...
Да уж. "Дурака учить - только портить".
Встал на лапы
Аватара пользователя
Сообщения: 94
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Сообщение Massaraksh7 »

Zapolyarny писал(а): Ср июн 24, 2026 11:29:41 ох... но это же совсем не спецификация ни разу...
А другой нету.
Грызет канифоль
Сообщения: 265
Зарегистрирован: Чт май 07, 2026 00:30:38

Сообщение Zapolyarny »

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

Вернуться в «Arduino»