Arduino кнопка по прерыванию, ложные срабатывания
- Войдите на сайт для отправки комментариев
Всем привет,
подскажите пожалуйста новичку, где и что я упустил.
Цель: фиксировать срабатывания кнопки (инкрементный счетчик).
Кнопка подключена на прерывание таким образом (срабатывание по земле)
attachInterrupt(0, Catch, LOW); digitalWrite(2, 1);
void Catch() { static unsigned long millis_prev; if(millis()-300 > millis_prev) { count++; temp="counts: "; temp+=count; Serial.println(temp); } millis_prev = millis(); }
так вот, если к пину ничего не подключено, все ок, срабатываний нет, как только подключаю просто провод, который в воздухе, происходят переодические срабатывания. Попробовал использовать оптопару, т.е. кнопка управляет оптопарой, которая в свою очередь управляет землей на пине. К-во срабатывания значительно снизилось, но опять же, как только подключаю оптопару(всего одной ножкой к пину), бывают срабатывания, хотя оптопара не активна. Выходит что длины ноги оптопары достаточно для неких наводок.
Прошу подсказать, что я делаю не так и почему так происходит.
Вижу следующие варианты:
1. управлять плюсом. на сколько это "правильно" и придется исползовать внешний подтягивающий резистор?
2. попробовать использоваться конденцатор, но какого номинала?
3. Ваш вариант :)
заранее спасибо за ответы.
пин нужно подтянуть
по кнопкам здесь посмотрите
http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
пин нужно подтянуть
по кнопкам здесь посмотрите
http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-taktovoi-knopki
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
спасибо за ссылки.
я уже перелистывал их, но там реализация кнопок не на прерываниях. возможно я конечно не верно понимаю сути :)
"пин нужно понтянуть" - так вот же он подтянут digitalWrite(2, 1); нет?
не перелистывать а почитать))))
подтяжка или внутренняя или наружная резистором 10ком
по ссылкам есть схемы правильного подключения кнопки
"пин нужно понтянуть" - так вот же он подтянут digitalWrite(2, 1); нет?
да, подтянут. Измерьте напряжение на 2 пине, должно быть 5 вольт. Если ок, -нагрузите резистором где-то на 100кОм, напряжение должно просесть примерно до 3х вольт. Если всё так, то подтяжка работает исправно, и помехи вы ловите через что-то ещё. Как вариант диагностики отключить всё от платы и запитать от другого БП. такого явления НЕ должно наблюдаться.
как только подключаю просто провод, который в воздухе, происходят переодические срабатывания. Попробовал использовать оптопару, т.е. кнопка управляет оптопарой, которая в свою очередь управляет землей на пине. К-во срабатывания значительно снизилось, но опять же, как только подключаю оптопару(всего одной ножкой к пину), бывают срабатывания, хотя оптопара не активна. Выходит что длины ноги оптопары достаточно для неких наводок.
Прошу подсказать, что я делаю не так и почему так происходит.
подключай питание к устройству после сборки, а не до.
опубликуй конечную схему устройства.
"пин нужно понтянуть" - так вот же он подтянут digitalWrite(2, 1); нет?
да, подтянут. Измерьте напряжение на 2 пине, должно быть 5 вольт. Если ок, -нагрузите резистором где-то на 100кОм, напряжение должно просесть примерно до 3х вольт. Если всё так, то подтяжка работает исправно, и помехи вы ловите через что-то ещё. Как вариант диагностики отключить всё от платы и запитать от другого БП. такого явления НЕ должно наблюдаться.
спасибо. попробовал как Вы описали, все так. Пробовал запитать от внешнего источника, результат был тот же. Пробовал разные способыи варианты, потому долго не отписывался.
первое что дало ощутимый результат (хотя ума не приложу почему)
Суть в том, что во время срабатывания прерывания, например нажатия и удерживания кнопки, loop() и все остальные процессы останавливаются, пока не отпустишь кнопку ничего более не происходит.
По-моему вы не понимаете как работает тип прерывания "LOW" , - прерывание вызывается бесконечно пока выполяется условие низкого уровня на входе INT0.
По-моему вы не понимаете как работает тип прерывания "LOW" , - прерывание вызывается бесконечно пока выполяется условие низкого уровня на входе INT0.
[/quote]
Верно, но ведь можно после фиксации срабатывания вызвать detachInterrupt(interrupt) для продолжения выполнения программы и после снова attachInterrupt()? или Вы хотите сказать что вариантов нет?
7up, какой же изврат вам в голову лезет. Просто используйте режим FALLING вместо LOW
7up, какой же изврат вам в голову лезет. Просто используйте режим FALLING вместо LOW
я жписал выше, я не волшебник, я только учусь.
уж какие реализации нахожу в сети - те и пытаюсь использовать.
FALLING ранее пытался, но ложных срабатываний было значительно больше, чем при LOW. Сейчас попробовал, вроде ложных пока нет.
спасибо за подсказку.
попробовал использовать вот эту схему, взятую на данном форуме, работает идеально, дребезга нет совсем, все четко, возможно стоит добавить ее в FAQ как подключать кнопки :)
но, в моем случае выключать на прерывании и есть проблема, которую я никак не могу побороть, а именно повотрные срабатывания при отжатии. Приблизительно каждое 10е 20е нажатие при отжатии прерывания срабатывает повторно. Пробовал использовать триггер К561ТЛ1А, результат тот же, скоро приедет 40106N попробую еще его. На сколько мой опыт новичка помогает понять, то это какая-то проблема помехи. Как ее бороть? Возможно ли использовать более емкостной конденцатор?
это неправильная схема - там, где ты её взял, я писал почему.
пардон за глупые вопросы, я еще не полностью в теме :) а повторно срабатывание при отпускании кнопки - это "дребезг" или "помега"? или "дребезг" - это и есть "помеха"?
P.S.
тему из которой взял схему все еще перечитываю в попытках найти пост о том, почему она "не правильная":(
пардон за глупые вопросы, я еще не полностью в теме :) а повторно срабатывание при отпускании кнопки - это "дребезг" или "помега"? или "дребезг" - это и есть "помеха"?
P.S.
тему из которой взял схему все еще перечитываю в попытках найти пост о том, почему она "не правильная":(
отсюда читай #318 #350 и до конца
*там дропбокс мне ссылко на картинко сломал, поэтому по контексту сообразишь, что конденсатор нужно подключать провивоположно замыканию кнопки.
7up, если вам не лень аппаратно давить дребезг - то самый идеальный вариант -взять кнопку с переключающимися контактами,
и включить её через RS-триггер. Подробнее тут. Метода давит дребезг -100% , я себе сделал пару таких кнопок для отладочных целей, очень помогают.
отсюда читай #318 #350 и до конца
*там дропбокс мне ссылко на картинко сломал, поэтому по контексту сообразишь, что конденсатор нужно подключать провивоположно замыканию кнопки.
спасибо, полез читать....
дык програмно не получается, дребезг при нажатии без проблем решаю вот таким кодом:
прерывание в режиме FALLING
дело в том, что в моем случае "кнопка" выражение фигуальное, в реальности - это не кнопка, а концевой выключатель, при срабатывании которого я и фиксирую событие. Использовать кнопку предложенную Вами не представляется возможным из за механической особенности фиксации.
нажимаю, на пине появляется 0, просиходит срабатывание прерывания один раз, как положено, защита от дребезга работает, все красиво. Отпускаю 0->1 (это никак не FALLING) и снова срабатывание. Предполагаю, что не все так ровно из 0 в 1, где-то между попадаются всплески на границе между 0 и 1, которые и дают вторичное FALLING и после пин становиться 1. Вот эти всплески я и пытаюсь потушить. Пока лучше всего удалось схемой выше, но с конденцатором 10мкф, подозреваю, что это многовато.
Верно ли я мысли или опять не туда? :)
7up, никакой способ для 2х контактов не даст 100% защиты от дребезга. Есть правда спецчип, с ним пожалуй 99,9% :)
никакой способ для 2х контактов не даст 100% защиты от дребезга.
да ладно нагнетать, dimax - где это видано, что бы дребезг внезапно начался после ~10-50 миллисекунд покоя контактов.
Клапауций 112, ну да, странно, тут только
вскрытиеосциллограф поможет выявить истину :)Клапауций 112, ну да, странно, тут только
вскрытиеосциллограф поможет выявить истину :)ок. я, таки, считаю, что после ~30 миллисекунд покоя дребезг возобновится не может в вероятностью 100%
Клапауций 112, Ну контакты разные бывают...))
Клапауций 112, Ну контакты разные бывают...))
ок. 200 миллисекунд
господа, а что на счет конденцатора 10мкф? можно такой использовать, не спалю вход ардуины? Или если я шунтирую его 10к резистором то не страшно?
просто на большинстве схем в примерах используется 0,1мкф, а мне удалось добиться более менее результата только от 10мкф. и то в 10% случаев при отпускании кнопки ловлю вторичное срабатывание.
я использую вот такой выключатель(включатель) на точке фиксирования. В реальных условиях до него будет порядка 10м провода, предполагаю, что меня еще ждут приключения :) в связи с длинной провода, верно? Но тут я уже запасся оптопарами.
Возможно есть более изящные решения подобных задач? Когда важно фиксировать срабатывания без погрешностей.
А Вы какой осцилограф используете? Красивые картинки у Вас :)
тебе точно нужно прерывание?
подумай внимательно - если ты юзаешь системы подавления дребезга, то зачем? что бы что?
тебе точно нужно прерывание?
подумай внимательно - если ты юзаешь системы подавления дребезга, то зачем? что бы что?
да, прерывание нужно, другого сопоба не нашел, мне очень важно не пропустить не одного срабатывание любого из датчиков, даже если они срабатывают одновременно, всего на ардуину вешаю 5 таких зон, 2 на external прерывания и 3 на PICINT.
каждое срабатывание - это +1 к счетчику каждой зоны, лишний +1 недопустим. Потому подавляю дребезг. При отпускании кнопки также +1 не допустим. Как-то так.
да, прерывание нужно, другого сопоба не нашел, мне очень важно не пропустить не одного срабатывание любого из датчиков, даже если они срабатывают одновременно, всего на ардуину вешаю 5 таких зон, 2 на external прерывания и 3 на PICINT.
каждое срабатывание - это +1 к счетчику каждой зоны, лишний +1 недопустим. Потому подавляю дребезг. При отпускании кнопки также +1 не допустим. Как-то так.
ещё раз сам себя внимательно перечитай. борьба с дребезгом - это и есть пропуск срабатываний датчиков.
7up, Мне обычно хватает 0,1-1мкф, и ложных срабатываний нет тыц. Осциллограф Rigol DS2072A, очень советую) Кстати учитывая ваши косяки в начале темы -покажите-ка свой скетч текущий, вдруг ещё там какая раскривушка..
7up, Мне обычно хватает 0,1-1мкф, и ложных срабатываний нет тыц. Осциллограф Rigol DS2072A, очень советую) Кстати учитывая ваши косяки в начале темы -покажите-ка свой скетч текущий, вдруг ещё там какая раскривушка..
у него концевик с массивными контактами - там, возможно, и 50 мкф нужно.
*я пока в недоумении - нужны прерывания, но дребезг нужно бороть. как это?
7up, присмотрись к концевику - там явно три контакта должно быть
Даже скорей не три, а четыре (если внутрь заглянуть) - замкнутые и разомкнутые.
7up, Мне обычно хватает 0,1-1мкф, и ложных срабатываний нет тыц. Осциллограф Rigol DS2072A, очень советую) Кстати учитывая ваши косяки в начале темы -покажите-ка свой скетч текущий, вдруг ещё там какая раскривушка..
Осцилограф отличный!
Скетч:
тут все просто вроде как.
результат в консоли такой (около 10% срабатываний при отпускании, при нажатии всегда четко по одному):
да, все верно, именно так, замкнутые и разомкнутые. Вы к тому, что бы использовать RS-триггер? т.е. тянуть к размыкателю не 2, а 3 провода и подключать их на RS-триггер, верно?
не понял Вашего вопроса и недоумения.
потому, что борьба с дребезгом - это борьба со срабатыванием датчика.
да, все верно, именно так, замкнутые и разомкнутые. Вы к тому, что бы использовать RS-триггер? т.е. тянуть к размыкателю не 2, а 3 провода и подключать их на RS-триггер, верно?
не понял Вашего вопроса и недоумения.
потому, что борьба с дребезгом - это борьба со срабатыванием датчика.
а в моем случае борьба с чем? :)
10мкф и резистор на 1,2к на пин пока что спасают, сводя срабатывание при размыкании до 1 ложный из 50, но совершенству же нет предела.
да, все верно, именно так, замкнутые и разомкнутые. Вы к тому, что бы использовать RS-триггер? т.е. тянуть к размыкателю не 2, а 3 провода и подключать их на RS-триггер, верно?
понял, спасибо за вариант, но в таком случае не возхможно использовать прерывания и необходимо на каждую зону(выключатель) отводить по 2 пина, итого на 5 моих выключателей я должен отвести 10 пинов, верно?
а в моем случае борьба с чем? :)
с показаниями датчика(концевик с двумя контактами) - ты не можешь знать, дребезг это или актуальные показания. тем более, если ты используешь прерывания, то тебе нужна максимально быстрая реакция на изменения, но... внезапно, уже не нужна - у тебя система антидребезга.
10мкф и резистор на 1,2к на пин пока что спасают, сводя срабатывание при размыкании до 1 ложный из 50, но совершенству же нет предела.
не занимайся ерундой - здесь #33 я тебе написал, что нужно делать + убери Сериал и миллис из функции, которая у тебя в прерывании - оставь только счётчик.
поставь БВК и не изобретай велосипед
поставь БВК и не изобретай велосипед
спасибо, но не подходит из за необходимости механической переделки фиксации. К тому же не факт что решит проблему.
В общем остановился я на 2.2мкф конденцаторе и вроде как работает стабильно, но радость моя длилась не долго :) тесты проводил на одном прерывании, при подключении остальных прерываний приехали новые приключения, а именно при использовании (включении кнопки) на одном прерывании переодически срабатывают другие.
подключаю через оптрон. на схеме показано подключение к прерыванию 2, точно так же подключаю к 3й ноге (2му прерыванию).
Пробовал убирать совсем R2, менять емкости, ничего не помогает. Только псли отпаиваю 2е прерывание от оптрона его ложные срабатывания прекращаются. Объясните пожалуйста, как так происходит? Оптрон подтекает? :) ведь он должен быть закрыт в момент, когда на его светодиод не подается питание, а оно не подается, +5в светодиода 2го оптрона (на 2е прерывание) не подключено не к одной кнопке, только земли о обеих оптронов и ардуины общие.
У меня только БВК решил проблему
приключения, а именно при использовании (включении кнопки) на одном прерывании переодически срабатывают другие.
Это бывает, когда на вход поступает напряжение отрицательной полярности. Чем вы там перекосили -вам виднее, скорее всего кривая разводка земли.
приключения, а именно при использовании (включении кнопки) на одном прерывании переодически срабатывают другие.
Это бывает, когда на вход поступает напряжение отрицательной полярности. Чем вы там перекосили -вам виднее, скорее всего кривая разводка земли.
Спасибо. Вот где-то такая же мысль и у меня зреет, но опыта не хватает понять как это происходит. А можно чуть подробнее про "разводка земли" и "напряжение отрицательной полярности"? Может это быть из за не верного баланса кондендцатора и резисторов?
7up, общая идеология -по сигнальной земле не должен течь посторонний ток. Вот тут у Дихалта с картинками изложено. В вашем случае это может быть ток разряжающегося конденсатора. А про отрицательное напряжение на входе и глюки от этого я уже как то писал тут.
PS нарисовал картинку :-)
7up, общая идеология -по сигнальной земле не должен течь посторонний ток. Вот тут у Дихалта с картинками изложено. В вашем случае это может быть ток разряжающегося конденсатора. А про отрицательное напряжение на входе и глюки от этого я уже как то писал тут.
PS нарисовал картинку :-)
да, возможно конденцатор, так как когда отпаиваю его, срабатывание соседних прерываний или значительно сокращаются или уходят вовсе, но приходит срабатывание используемого прерывания при отжатии кнопки (размыкании выключателя) :) как не одно так другое.
про земли понял, спасибо, попробую по эксперементировать.
В вашей картинке "какая-то нагрузка" это можно расценивать как наличие там выключателя, верно?
P.S.
а если я подключаю ардуину 5v на пин VIN от блока питания и после вставляю USB (через него в монитор порта контролирую нажатия) то как понять, от какого источника будет питаться микропроцессор?
7up, "какая-то нагрузка" -всё что может потреблять ток. Включая ваш вариант кнопка+конденсатор :) При смешении двух источников питания - нагрузка будет на бОльшее. Vin рассчитан на напряжения от 7 вольт. 5 вольт нужно подавать на Vcc