Arduino кнопка по прерыванию, ложные срабатывания

7up
Offline
Зарегистрирован: 27.12.2016

Всем привет,

подскажите пожалуйста новичку, где и что я упустил.

Цель: фиксировать срабатывания кнопки (инкрементный счетчик). 

Кнопка подключена на прерывание таким образом (срабатывание по земле)

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. Ваш вариант :)

заранее спасибо за ответы.

vvadim
Offline
Зарегистрирован: 23.05.2012
7up
Offline
Зарегистрирован: 27.12.2016

vvadim пишет:

пин нужно подтянуть

по кнопкам здесь посмотрите

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); нет?

vvadim
Offline
Зарегистрирован: 23.05.2012

не перелистывать а почитать))))
подтяжка или внутренняя или наружная резистором 10ком

по ссылкам есть схемы правильного подключения кнопки

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up пишет:

"пин нужно понтянуть" - так вот же он подтянут digitalWrite(2, 1); нет?

да, подтянут. Измерьте напряжение на 2 пине, должно быть 5 вольт. Если ок, -нагрузите резистором где-то на 100кОм, напряжение должно просесть примерно до 3х вольт. Если всё так, то подтяжка работает исправно, и помехи вы ловите через что-то ещё. Как вариант диагностики отключить всё  от платы и запитать от другого БП. такого явления НЕ должно наблюдаться.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

7up пишет:

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

Прошу подсказать, что я делаю не так и почему так происходит.

подключай питание к устройству после сборки, а не до.

опубликуй конечную схему устройства.

7up
Offline
Зарегистрирован: 27.12.2016

dimax пишет:

7up пишет:

"пин нужно понтянуть" - так вот же он подтянут digitalWrite(2, 1); нет?

да, подтянут. Измерьте напряжение на 2 пине, должно быть 5 вольт. Если ок, -нагрузите резистором где-то на 100кОм, напряжение должно просесть примерно до 3х вольт. Если всё так, то подтяжка работает исправно, и помехи вы ловите через что-то ещё. Как вариант диагностики отключить всё  от платы и запитать от другого БП. такого явления НЕ должно наблюдаться.

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

первое что дало ощутимый результат (хотя ума не приложу почему)

digitalWrite(2, HIGH);
attachInterrupt(0, Catch, LOW);
 
поменял местами эти строки, сначало включаю подтягивающий, потом инициализация прерывания. Почему это дало эффект не понимаю.
 
2е - добавил еще внешний подтягивающий резистор.
 
Сейчас ложных срабатываний почти не наблюдаю,буду смотреть в реальной работе на погрешность.
 
А по прерываниям может кто подсказать? Суть в том, что во время срабатывания прерывания, например нажатия и удерживания кнопки, loop() и все остальные процессы останавливаются, пока не отпустишь кнопку ничего более не происходит. Как вариант, думаю считать таймером нажатие и при достижении например 2-3с выключать прерывание, что бы длительным нажатием не блокировать работу устройства.
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up пишет:

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

По-моему вы не понимаете как работает тип прерывания "LOW" ,  - прерывание вызывается бесконечно пока выполяется условие низкого уровня на входе INT0.

7up
Offline
Зарегистрирован: 27.12.2016

dimax пишет:

По-моему вы не понимаете как работает тип прерывания "LOW" ,  - прерывание вызывается бесконечно пока выполяется условие низкого уровня на входе INT0.

[/quote]

Верно, но ведь можно после фиксации срабатывания вызвать detachInterrupt(interrupt) для продолжения выполнения программы и после снова attachInterrupt()? или Вы хотите сказать что вариантов нет?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up, какой же изврат вам в голову лезет. Просто используйте режим FALLING вместо LOW

7up
Offline
Зарегистрирован: 27.12.2016

dimax пишет:

7up, какой же изврат вам в голову лезет. Просто используйте режим FALLING вместо LOW

я жписал выше, я не волшебник, я только учусь.

уж какие реализации нахожу в сети - те и пытаюсь использовать.

FALLING ранее пытался, но ложных срабатываний было значительно больше, чем при LOW. Сейчас попробовал,  вроде ложных пока нет.

спасибо за подсказку.

7up
Offline
Зарегистрирован: 27.12.2016

 

попробовал использовать вот эту схему, взятую на данном форуме, работает идеально, дребезга нет совсем, все четко, возможно стоит добавить ее в FAQ как подключать кнопки :)

но, в моем случае выключать на прерывании и есть проблема, которую я никак не могу побороть, а именно повотрные срабатывания при отжатии. Приблизительно каждое 10е 20е нажатие при отжатии прерывания срабатывает повторно. Пробовал использовать триггер К561ТЛ1А, результат тот же, скоро приедет 40106N попробую еще его. На сколько мой опыт новичка помогает понять, то это какая-то проблема помехи. Как ее бороть? Возможно ли использовать более емкостной конденцатор?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

это неправильная схема - там, где ты её взял, я писал почему.

7up
Offline
Зарегистрирован: 27.12.2016

пардон за глупые вопросы, я еще не полностью в теме :) а повторно срабатывание при отпускании кнопки - это "дребезг" или "помега"? или "дребезг" - это и есть "помеха"?

P.S.

тему из которой взял схему все еще перечитываю в попытках найти пост о том, почему она "не правильная":( 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

7up пишет:

пардон за глупые вопросы, я еще не полностью в теме :) а повторно срабатывание при отпускании кнопки - это "дребезг" или "помега"? или "дребезг" - это и есть "помеха"?

P.S.

тему из которой взял схему все еще перечитываю в попытках найти пост о том, почему она "не правильная":( 

отсюда читай #318 #350 и до конца

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up, если вам не лень аппаратно давить дребезг - то самый идеальный вариант -взять кнопку с переключающимися контактами,

и включить её через RS-триггер. Подробнее тут. Метода давит дребезг -100% , я себе сделал пару таких кнопок для отладочных целей, очень помогают.

 

7up
Offline
Зарегистрирован: 27.12.2016

Клапауций 112 пишет:

отсюда читай #318 #350 и до конца

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

спасибо, полез читать....

dimax пишет:
7up, если вам не лень аппаратно давить дребезг - то самый идеальный вариант -взять кнопку с переключающимися контактами,

дык програмно не получается, дребезг при нажатии без проблем решаю вот таким кодом:

static unsigned long millis_prev;
  if(millis()-500 > millis_prev) { 
    count++;
   }
  millis_prev = millis();

прерывание в режиме FALLING

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

нажимаю, на пине появляется 0, просиходит срабатывание прерывания один раз, как положено, защита от дребезга работает, все красиво. Отпускаю 0->1 (это никак не FALLING) и снова срабатывание. Предполагаю, что не все так ровно из 0 в 1, где-то между попадаются всплески на границе между 0 и 1, которые и дают вторичное FALLING и после пин становиться 1. Вот эти всплески я и пытаюсь потушить. Пока лучше всего удалось схемой выше, но с конденцатором 10мкф, подозреваю, что это многовато.

Верно ли я мысли или опять не туда? :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up, никакой способ для 2х контактов не даст 100% защиты от дребезга. Есть правда спецчип, с ним пожалуй 99,9% :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

dimax пишет:

никакой способ для 2х контактов не даст 100% защиты от дребезга.

да ладно нагнетать, dimax - где это видано, что бы дребезг внезапно начался после ~10-50 миллисекунд покоя контактов.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 112, ну да, странно, тут только вскрытие осциллограф поможет выявить истину :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

dimax пишет:

Клапауций 112, ну да, странно, тут только вскрытие осциллограф поможет выявить истину :)

ок. я, таки, считаю, что после ~30 миллисекунд покоя дребезг возобновится не может в вероятностью 100%

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 112,  Ну контакты разные бывают...))

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

dimax пишет:

Клапауций 112,  Ну контакты разные бывают...))

ок. 200 миллисекунд

7up
Offline
Зарегистрирован: 27.12.2016

господа, а что на счет конденцатора 10мкф? можно такой использовать, не спалю вход ардуины? Или если я шунтирую его 10к резистором то не страшно?

просто на большинстве схем в примерах используется 0,1мкф, а мне удалось добиться более менее результата только от 10мкф. и то в 10% случаев при отпускании кнопки ловлю вторичное срабатывание.

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

Возможно есть более изящные решения подобных задач? Когда важно фиксировать срабатывания без погрешностей.

 

dimax пишет:

А Вы какой осцилограф используете? Красивые картинки у Вас :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

тебе точно нужно прерывание?

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

7up
Offline
Зарегистрирован: 27.12.2016

Клапауций 112 пишет:

тебе точно нужно прерывание?

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

да, прерывание нужно, другого сопоба не нашел, мне очень важно не пропустить не одного срабатывание любого из датчиков, даже если они срабатывают одновременно, всего на ардуину вешаю 5 таких зон, 2 на external прерывания и 3 на PICINT. 

каждое срабатывание - это +1 к счетчику каждой зоны, лишний +1 недопустим. Потому подавляю дребезг. При отпускании кнопки также +1 не допустим. Как-то так.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

7up пишет:

да, прерывание нужно, другого сопоба не нашел, мне очень важно не пропустить не одного срабатывание любого из датчиков, даже если они срабатывают одновременно, всего на ардуину вешаю 5 таких зон, 2 на external прерывания и 3 на PICINT. 

каждое срабатывание - это +1 к счетчику каждой зоны, лишний +1 недопустим. Потому подавляю дребезг. При отпускании кнопки также +1 не допустим. Как-то так.

ещё раз сам себя внимательно перечитай. борьба с дребезгом - это и есть пропуск срабатываний датчиков.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up, Мне обычно хватает 0,1-1мкф, и ложных срабатываний нет тыц.   Осциллограф Rigol DS2072A, очень советую) Кстати учитывая ваши косяки в начале темы -покажите-ка свой скетч текущий, вдруг ещё там какая раскривушка..

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

dimax пишет:

7up, Мне обычно хватает 0,1-1мкф, и ложных срабатываний нет тыц.   Осциллограф Rigol DS2072A, очень советую) Кстати учитывая ваши косяки в начале темы -покажите-ка свой скетч текущий, вдруг ещё там какая раскривушка..

у него концевик с массивными контактами - там, возможно, и 50 мкф нужно.

*я пока в недоумении - нужны прерывания, но дребезг нужно бороть. как это?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

7up, присмотрись к концевику - там явно три контакта должно быть

bizzon
Offline
Зарегистрирован: 29.03.2016

Даже скорей не три, а четыре (если внутрь заглянуть) - замкнутые и разомкнутые.

7up
Offline
Зарегистрирован: 27.12.2016

dimax пишет:

7up, Мне обычно хватает 0,1-1мкф, и ложных срабатываний нет тыц.   Осциллограф Rigol DS2072A, очень советую) Кстати учитывая ваши косяки в начале темы -покажите-ка свой скетч текущий, вдруг ещё там какая раскривушка..

Осцилограф отличный! 

Скетч:

тут все просто вроде как.

результат в консоли такой (около 10% срабатываний при отпускании, при нажатии всегда четко по одному):

Клапауций 112 пишет:
*я пока в недоумении - нужны прерывания, но дребезг нужно бороть. как это?
не понял Вашего вопроса и недоумения.

Клапауций 112 пишет:
7up, присмотрись к концевику - там явно три контакта должно быть

bizzon пишет:
Даже скорей не три, а четыре (если внутрь заглянуть) - замкнутые и разомкнутые.

да, все верно, именно так, замкнутые и разомкнутые. Вы к тому, что бы использовать RS-триггер? т.е. тянуть к размыкателю не 2, а 3 провода и подключать их на RS-триггер, верно?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

7up пишет:

не понял Вашего вопроса и недоумения.

потому, что борьба с дребезгом - это борьба со срабатыванием датчика.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

7up пишет:

да, все верно, именно так, замкнутые и разомкнутые. Вы к тому, что бы использовать RS-триггер? т.е. тянуть к размыкателю не 2, а 3 провода и подключать их на RS-триггер, верно?

это мы к тому, что пиши код:
условия:
когда замкнуты контакты 1-2 и разомкнуты 2-3, то возвращает '0'.
когда замкнуты контакты 2-3 и разомкнуты 1-2, то возвращает '1'.
*контакт 2 - на землю.
*контакты 1 и 3 на пины дуино и подтянуть к питанию.
 
дребезга не будет.
7up
Offline
Зарегистрирован: 27.12.2016

Клапауций 112 пишет:

7up пишет:

не понял Вашего вопроса и недоумения.

потому, что борьба с дребезгом - это борьба со срабатыванием датчика.

а в моем случае борьба с чем? :)

Клапауций 112 пишет:
у него концевик с массивными контактами - там, возможно, и 50 мкф нужно.

10мкф и резистор на 1,2к на пин пока что спасают, сводя срабатывание при размыкании до 1 ложный из 50, но совершенству же нет предела.

7up
Offline
Зарегистрирован: 27.12.2016

Клапауций 112 пишет:

7up пишет:

да, все верно, именно так, замкнутые и разомкнутые. Вы к тому, что бы использовать RS-триггер? т.е. тянуть к размыкателю не 2, а 3 провода и подключать их на RS-триггер, верно?

это мы к тому, что пиши код:
условия:
когда замкнуты контакты 1-2 и разомкнуты 2-3, то возвращает '0'.
когда замкнуты контакты 2-3 и разомкнуты 1-2, то возвращает '1'.
*контакт 2 - на землю.
*контакты 1 и 3 на пины дуино и подтянуть к питанию.
 
дребезга не будет.

понял, спасибо за вариант, но в таком случае не возхможно использовать прерывания и необходимо на каждую зону(выключатель) отводить по 2 пина, итого на 5 моих выключателей я должен отвести 10 пинов, верно?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

7up пишет:

а в моем случае борьба с чем? :)

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

7up пишет:

10мкф и резистор на 1,2к на пин пока что спасают, сводя срабатывание при размыкании до 1 ложный из 50, но совершенству же нет предела.

не занимайся ерундой - здесь #33 я тебе написал, что нужно делать + убери Сериал и миллис из функции, которая у тебя в прерывании - оставь только счётчик.

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

поставь БВК и не изобретай велосипед

7up
Offline
Зарегистрирован: 27.12.2016

ua6em пишет:

поставь БВК и не изобретай велосипед

спасибо, но не подходит из за необходимости механической переделки фиксации. К тому же не факт что решит проблему.

В общем остановился я на 2.2мкф конденцаторе и вроде как работает стабильно, но радость моя длилась не долго :) тесты проводил на одном прерывании, при подключении остальных прерываний приехали новые приключения, а именно при использовании (включении кнопки) на одном прерывании переодически срабатывают другие.

подключаю через оптрон. на схеме показано подключение к прерыванию 2, точно так же подключаю к 3й ноге (2му прерыванию). 

Пробовал убирать совсем R2, менять емкости, ничего не помогает. Только псли отпаиваю 2е прерывание от оптрона его ложные срабатывания прекращаются. Объясните пожалуйста, как так происходит? Оптрон подтекает? :) ведь он должен быть закрыт в момент, когда на его светодиод не подается питание, а оно не подается, +5в  светодиода 2го оптрона (на 2е прерывание) не подключено не к одной кнопке, только земли о обеих оптронов и ардуины общие.

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

У меня только БВК решил проблему

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up пишет:

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

Это бывает, когда на вход поступает напряжение отрицательной полярности. Чем вы там перекосили -вам виднее, скорее всего кривая разводка земли.

7up
Offline
Зарегистрирован: 27.12.2016

dimax пишет:

7up пишет:

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

Это бывает, когда на вход поступает напряжение отрицательной полярности. Чем вы там перекосили -вам виднее, скорее всего кривая разводка земли.

Спасибо. Вот где-то такая же  мысль и у меня зреет, но опыта не хватает понять как это происходит. А можно чуть подробнее про "разводка земли" и "напряжение отрицательной полярности"? Может это быть из за не верного баланса кондендцатора и резисторов?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

PS нарисовал картинку :-)

7up
Offline
Зарегистрирован: 27.12.2016

dimax пишет:

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

PS нарисовал картинку :-)

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

про земли понял, спасибо, попробую по эксперементировать.

В вашей картинке "какая-то нагрузка" это можно расценивать как наличие там выключателя, верно?

P.S.

а если я подключаю ардуину 5v на пин VIN от блока питания и после вставляю USB (через него в монитор порта контролирую нажатия) то как понять, от какого источника будет питаться микропроцессор?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

7up, "какая-то нагрузка" -всё что может потреблять ток. Включая  ваш вариант кнопка+конденсатор  :) При смешении двух источников питания - нагрузка будет на бОльшее. Vin рассчитан на напряжения от 7 вольт. 5 вольт нужно подавать на Vcc