Покритикуйте быстродействие
- Войдите на сайт для отправки комментариев
Условия: затянувшийся на 4 лишних месяцев стартап, два обалдевших от претензий за неуплату аренды организатора, непонятки с железными решениями.
Задача: доска с декоративными камнями в проходе, отстёгивающаяся при исчезновении тока в электромагните. Требуется 100% reliability, доска НЕ должна никого ударить по башке. Датчик людей представляет собой 12 ИК-приёмников TSOP1738 или VS1838, по 6 по сторонам коридора, они подсвечены 4мя ИК светодиодами с разных углов, так чтобы если внутри окажется что-то больше 10х10 см, на каком-то из приёмников 100% окажется тень.
Суть непоняток с железом такова: по-идее, это всё делается элементарно на двух 555 и транзисторе. Суть проста, как старые взрывные устройства: имеется RC цепочка, подключенная к выходу приёмника и затвору МОП транзистора. Когда в приёмник прилетают импульсы, тот делает на выходе 0, разряжая конденсатор. Всё выглядит замечательно, пока нет попыток их параллелить. По идее - ну логично, вешаем диод, перекладиной к затвору, и получается нечто типа OneWire шины, которую можно притянуть наверх резистором. Если любой из приёмников пропустит очередной импульс - конденсатор, соединённый с ним, успеет зарядиться и открыть транзистор, сажая эту линию на землю. Ноль где-то - значит ноль есть. Значит человеки присутствуют. Значит отпускать доску нельзя. Но на деле не всё так радужно.
Во-первых, напряжение на этой линии не уходит в ноль. Несмотря на диоды, туда всё равно утекает сколько-то. 0.7 В которые падают на диоде? В общем, если подключить на выход светодиод и пытаться светить пультом во все приёмники, горящий светодиод не хочет гаснуть чётко и полностью. Он просто становится темнее.
Во-вторых, мутилово с таймерами и компараторами не происходит для меня абсолютно прозрачно. Расклад такой: я трачу хз сколько на трассировку платы, ночь не сплю, лужу, паяю, мусорю кусками МГТФа под ноги, и потом вижу, что генератор стоит. Или что компаратор не изменяет состояние выхода. И мне не особенно ясно, в чём причина. Где-то что-то забыто? Вышел из строя один из таймеров? Перепутаны входы, надо было подавать выходы в инвертирующий, а образцовый делитель - на неинвертирующий? Ещё хз что? Времени нет. Каждый час в вацап сыпятся фразы "давайдавайнадо". Паника. Психоз. Большое желание написать в чат "gg wp", если кто незнаком с жаргоном DotA - мне только сетку из окна вынуть, 8й этаж, нормально.
Перейдём к сути.
На данный момент схема такова: 12 TSOPов запараллеленных по питанию, 12 проводов от выходов, идущих в D0-D11. D13 - выход, единица если все до одного приемники засвечены. D14, он же A0 - выход светодиода, выдаёт пачки по 15 импульсов на частоте "где-то 38 кГц", раз в 300 мс.
#include <TimerOne.h> void IRLED(){ for(byte i=0;i<15;i++){ PORTC|=B00000001; delayMicroseconds(27); PORTC&=B11111110; delayMicroseconds(27); } } unsigned long ts[13]; bool state=0; bool flag[12]={0,0,0,0,0,0,0,0,0,0,0,0}; byte counter[12]={0,0,0,0,0,0,0,0,0,0,0,0}; byte pa=0, pb=0; void setup(){ for(byte i=0;i<13;i++) ts[i]=millis(); DDRD&=B00000000; DDRB&=B11110000; PORTD|=B11111111; PORTB|=B00001111; DDRC|=B00000001; PORTC&=B11111110; Timer1.initialize(300000); Timer1.attachInterrupt(IRLED); } void loop() { byte i; pa=PIND; pb=PINB; for(i=0;i<12;i++){ switch(i){ case 0: state=!(pa & B00000001); break; case 1: state=!((pa & B00000010)>>1); break; case 2: state=!((pa & B00000100)>>2); break; case 3: state=!((pa & B00001000)>>3); break; case 4: state=!((pa & B00010000)>>4); break; case 5: state=!((pa & B00100000)>>5); break; case 6: state=!((pa & B01000000)>>6); break; case 7: state=!((pa & B10000000)>>7); break; case 8: state=!(pb & B00000001); break; case 9: state=!((pb & B00000010)>>1); break; case 10: state=!((pb & B00000100)>>2); break; case 11: state=!((pb & B00001000)>>3); break; } if(state){ counter[i]=0; flag[i]=0; ts[i]=millis(); } if(millis()-ts[i]>=100){ counter[i]++; ts[i]=millis(); } if(counter[i]>=5){ flag[i]=1; } } state=0; for(i=0;i<12;i++) if(flag[i]) state=1; if(state) PORTB &=B11011111; else PORTB|=B00100000; }
Я надеюсь на некоторую инерцию выходов TSOP. Мне ради этой инерции не жалко повесить на каждый из выходов по конденсатору, хоть 1 мкФ. Потому что если прерывание будет происходить с ощутимой задержкой опроса портов, приводя к тому что порты будут читаться в тот момент, когда ноль на выходах уже перестал быть нулём, мне придётся ставить второй МК, который будет делать только delayMicroseconds() и мигание ИК светодиодами. Разумеется, делать это мне как-то впадлу.
Надеюсь на понимание, all.
Я вот не понимаю. Почему нельзя решить задачу в лоб. Понятно мой код надо еще обрабатывать напильником.
Во-первых, напряжение на этой линии не уходит в ноль. Несмотря на диоды, туда всё равно утекает сколько-то. 0.7 В которые падают на диоде? В общем, если подключить на выход светодиод и пытаться светить пультом во все приёмники, горящий светодиод не хочет гаснуть чётко и полностью. Он просто становится темнее.
После этих слов стоило бы точную схему подключений нарисовать. А то можно гадать долго что вы там напаяли. Городить что-либо на МК при данной задаче -считаю не имеет смысла. Разве что применить тини13 вместо ne555 :)
Ну так то да. Я ещё хочу обсудить этот вариант схемы, т. к. ИК "забор" оказался самым вменяемым датчиком из всего что мне доводилось испытывать.
Второй МК таки пришлось поставить, псевдомногозадачность нифига не многозадачность.
UPD. вернусь, нарисую.
Был когда-то похожий проект, контроль помещений банкоматов, чтобы не мог войти второй человек, если уже кто-то есть.
Сделано было несколько иначе, на одной стороне стояли ТСОПы, а на другой - передающие свтодиооды. Слысл в этом деле в том, что ТСОПы имеют очень высокую чувствителность и могут словить не только прямой, но и отраженный сигнал, а в такой схеме очень хорошо перерываются лучи, похоже в чем-то таком одна из проблем std.
Один светодиод светит сразу на несколько приемников и передача идет по очереди, т.е. так и создается плотная сетка.
Сейчас уже доподлинно не помню, но вроде у TS1738 должен быть выход с открытым коллектором, т.е. они просто объединяются по монтажному "или" (https://www.youtube.com/watch?v=GxwI7z2BHgY ) без всяких диодов.(надо уточнить)
Не нужно сначала передавать пачку, а потом проверять состояние выходов. Правильно начать передачу, подождать 5-10 периодов, а потом внутри все еще передаваемой пачки делать проверку.
------------------
посмотрел даташит на TSOP17хх, в общем, хотя там и не ОК на выходе, а просто большое сопротивление в коллетроре объдинять по монтажному "или" можно до 80 выходов .... вот только толку от этого абсолютно никакого применительно к этой задаче, т.к. логика работы получается инверсная, т.е. при прохождении хотя бы одного луча на выходе будет ноль.
Можно дополнить каждый выход одним н-п-н маломощным транзистором и уже на их коллекторах собрать монтажное "или", тогда ноль на выходе будет уже при пропадании хотя бы одного луча. (это при условии что при проверке все датчики должны быть засвечены) Тогда для контроля фотоприемников можно использовать всего один вход Ардуины.