Не работает Триггер Шмидта

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

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

Решил защитить кнопку от дребезга контактов, но схема не работает. Скретч

int buttonInt = 0;//Pin 2
int pinLed = 13;
volatile boolean shine = false;

void setup()
{
  pinMode(pinLed, OUTPUT);
  attachInterrupt(buttonInt, swap,RISING);
}

void swap()
{
  shine = !shine;
}

void loop()
{
  digitalWrite(pinLed, shine ? HIGH :LOW);
  delay(100);
}

13 лед беспомощно моргает, на нажатие кнопки реагирует как-то не внятно и не так как планировалось. Вообще по идее при нажатии на кнопку должно меняться состояние. Горит\потухнет.

Схема схема

10мф конденсатор, резистор на 10 ком, триггер Шмидта sn74act14n. Что не так в моей схеме или скретче?

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

faraddin
Offline
Зарегистрирован: 11.08.2013

Я бы сперва выбросил всю лабуду, оставив только кнопку, притянутую к 1 и посмотрел, работает ли скетч. А далее добавлял компоненты поштучно.

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

Спасибо за оперативный ответ. Да, нужно попробовать по шагам. Попробую завтра. Сеня уже заи..

Тут посмотрел ещё на конденсатор. Он на 50в. Это нормально?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

10мкф не многовато? сколько он будет заряжаться через 10ком

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Зачем такие сложности? Кнопку между землёй и пином прерывания, включаете подтягивающий резистор, ставите срабатывание при падении напряжения, в функции прерывания вначале ставите

int i=0;

while(i <100) {i++; }

это вместо delay, т.к в прерываниях он не работает. Конечно, будет простой, но это так плохо, если задача такая как у вас, тем более можно подобрать довольно малое число для сравнения.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Мы не ищем легких путей.
Глядя на схему я боюсь представить как чайник в розетку включаете.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Kipetcoff пишет:

Кстати на схеме нарисован конденс вроде как длинной ножкой на землю,я так понял, что это не правильно.

На схеме нарисован конденсатор, у которого минусовой пин на землю подключен. Минусовой пин помечается полоской, на которой нарисован либо минус либо минус с обводкой(похож на 0 ноль). Ножку можно откусить, если брать БУ конденсатор с какой-нибудь платы, они там уже откусаны. 

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

NikitosZs пишет:
На схеме нарисован конденсатор, у которого минусовой пин на землю подключен. Минусовой пин помечается полоской, на которой нарисован либо минус либо минус с обводкой(похож на 0 ноль). Ножку можно откусить, если брать БУ конденсатор с какой-нибудь платы, они там уже откусаны. 

Понял, увидел, спасибо.

 

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

Puhlyaviy пишет:
Мы не ищем легких путей. Глядя на схему я боюсь представить как чайник в розетку включаете.

Сначала я не заморачивался, но нашел пример аппаратной стабилизации http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:10-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

Я нашел несколько ресурсов, которые предалают такой способ решения проблемы дребезга. Решил попробоать как это работает. Зачем рассуждать о том как я включаю чайник в розетку? Конечно с помощью триггера шмидта, как вы уже наверное догадались.

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

jeka_tm пишет:

10мкф не многовато? сколько он будет заряжаться через 10ком

В примере  была именно эта емкость http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:10-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F там есть и расчет в видео

Leshiy
Offline
Зарегистрирован: 19.07.2014

Kipetcoff пишет:

jeka_tm пишет:

10мкф не многовато? сколько он будет заряжаться через 10ком

В примере  была именно эта емкость http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:10-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F там есть и расчет в видео

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

Возьмите мультиметр, или, если есть, осциллограф и замерьте напряжение на выходе триггера Шмидта при нажатой и ненажатой кнопке.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

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

Хотя не првильно всё это вам высказывать и смеяться над Вашим чайников, это же просто интересно и познавательно. 

Leshiy
Offline
Зарегистрирован: 19.07.2014

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

И ещё я не наблюдаю цепи разряда конденсатора.

А, блин, сама кнопка. Их симметричность сбивает с толку.

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

NikitosZs пишет:

Зачем такие сложности? Кнопку между землёй и пином прерывания, включаете подтягивающий резистор, ставите срабатывание при падении напряжения, в функции прерывания вначале ставите

int i=0;

while(i <100) {i++; }

это вместо delay, т.к в прерываниях он не работает. Конечно, будет простой, но это так плохо, если задача такая как у вас, тем более можно подобрать довольно малое число для сравнения.

Попробовал со стягивающим резистором. Почти как надо работает, только все таки видно, что из-за дребезга иногда по 2 раза за нажатие сменяются состояние лэда.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Кнопка... Иногда её полезно развернуть по схеме на 90 градусов у неё пары замыкаются... , rising - Попробуйте заменить на falling  : это срабативание по срезу , и ризинг и фаллинг практически работают в этом применении ка триггер шмидта , а точнее , как триггер - защелка. . 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Kipetcoff пишет:

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

так замените счёт до ста, например, до 200. 

Kipetcoff
Offline
Зарегистрирован: 05.08.2014

Похоже все таки заработало. Ещё раз всю схему разобрал и собрал. Где-то накосячил наверное при сборке в ночи. Только пока явного преимущества не вижу. Так же как со стягивающим резистором работает. Ладно, будем подбирать оптимальные параметры.

Всем спасибо, коллеги.

leshak
Offline
Зарегистрирован: 29.09.2011

А вы не пробовали, кнопку напрямую к дуине подключить?

И я, если не совсем понимаю чем вам триггер Шмидта поможет в борьбе с дребезгом.
Дребезг, это же по сути "много-много" нажатий/отжатий кнопки. От 0v до 5v, а не "напряжение скачет/плавает".

Кстати, если не ошибаюсь, то триггер Шмидта, по сути является составной частью любого цифрового пина ардуины.
И ставить его снаружи - нет необходимости.

А "дребезг" аппаратно давиться с помощью конденсатора. Он у вас уже есть.
 

И програмно - тоже не сложно.
Главное понять откуда он  береться: в момент нажатия кнопки, когда она "уже почти нажалась". Возникает "неуверенный контакт". За миллисекунды может десятки раз "замкнутся/разомкнуться". Пока вы додавите пальцем в "четкое состояние".

Отсюда и способ борьбы: после того как словили первое нажатие, какое-то время нужно просто не обращать внимание на нажатия кнопки. Если с прошлого нажатия прошло слишком мало времени, то это явно не "человек так быстро жмет", а "дребезг". Нужно просто подождать и он прекратится.

 

volatile static unsigned long lastPressed=0;

void swap(){
  if(millis()-lastPressed<100)return;// если с прошлого нажатия прошло меньше 100ms - игнорируем этот импульс
   lastPressed=millis();// запомнили когда было последние нажатие

   shine=!shine;

}

Вообщем IMHO - одна деталька у вас лишняя. А в случае програмной борьбы - даже две (еще и кондер не нужен).

P.s. и delay() в loop() - лишний.

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

leshak пишет:

P.s. и delay() в loop() - лишний.

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

leshak
Offline
Зарегистрирован: 29.09.2011

NikitosZs пишет:

leshak пишет:

P.s. и delay() в loop() - лишний.

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

Вообщем-то "дело вкуса", но я бы все-таки в loop() это делал.
Во первых - "разделение отвественности".
Сегодня нам нужно просто светиком светить, завтра на LCD показывать, после завтра - в Serial выводить.
И далеко не все можно делать в "прерывании".

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

В третьих: ничего страшного в "переписывать его тысячи раз в секунду ничего не меняя" - тоже нет. "Моторесурс" у нас на это не тратиться :)

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

При переписывании тысячу раз в секунду расходуется электроэнергия(А у меня она с сентября 3.5 рубля за киловатт ваххаха, но всё же, друг батарейки или аккумуляторы). 

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

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

leshak
Offline
Зарегистрирован: 29.09.2011

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

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

Хотите экономии.... смотрите режими энергопотребления. "Засыпайте" между периодами активности, снижайте частоту, переходите на 3.3v, ставте регулятор импульсный и т.п.
 

 

NikitosZs
NikitosZs аватар
Offline
Зарегистрирован: 26.09.2013

Пустой loop тратит чуть-чуть меньше, примерно на 1мА =)