Дребезг резистивных кнопок

stx-121
Offline
Зарегистрирован: 08.05.2014

Всем привет!

Кто может подсказать как убрать дребезг резистивных кнопок:

Плата Arduino Leonardo+Джойстик Sony RM-X4S. Ардуинка определяется как клавиатура, отсылает горячие клавиши в Centrafuse.

Скетч нашел в инете, подправил значения под свой джойстик. Команды принимаются отлично, но дребезг очень мешает, нажимаю паузу - в плеере воспроизведение 3-4 раза успевает стартовать и остановиться... 



 

int analogPin=0;
int data;
void setup()
{
Keyboard.begin();
Serial.begin(115200);
}

void loop()
{
data=analogRead(analogPin); //читаем значение нажатой кнопки
Serial.println(data); //для определения кодов нажатых кнопок на мониторе порта

if (data>=393 && data<=413) Keyboard.write('0'); //pause
if (data>=886 && data<=906) Keyboard.write('1'); //vol+
if (data>=843 && data<=863) Keyboard.write('2'); //vol-
if (data>=467 && data<=487) Keyboard.write('3'); //>>
if (data>=444 && data<=464) Keyboard.write('4'); //<<
if (data>=791 && data<=811) Keyboard.write('6'); //next track
if (data>=730 && data<=750) Keyboard.write('5'); //prev track
if (data>=948 && data<=968) Keyboard.write('7'); //menu media
delay(100);
}

 

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

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

c13
Offline
Зарегистрирован: 08.05.2014

Принимай несколько значений, бери средне-арифметичесское. Вобщем софтово обрабатывай. 

Если лениво, ставь маленький конденсатор на входе, будет сглаживать. На первый момент сойдет.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

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

На завод напишите, на ХУНдай ! Это там инженеры такие глупые, нашим ни чета :)

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

brokly пишет:

На завод напишите, на ХУНдай ! Это там инженеры такие глупые, нашим ни чета :)

ок - напишу прислать топикстартеру джойстик от хюндай.

*запретить идиотов.

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

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

state=!digitalRead(BUTTON_PIN)

а у вас так

state= (data>=393) && (data<=413);

Все. Дальше вся логика "антидребезга" должна работать именно с "состоянием кнопки", и ей пофиг как было прочитано это состояние.

Вообщем все как в анегдоте:

Задача №1: Вскипятить чайник воды.
Дано: Чайник, газовая плита, раковина, на ней кран с водой, спички.
Решение:
(Физик): Налить воды в чайник, зажечь плиту, поставить чайник на огонь, дождаться кипения. Задача решена.
(Математик): Налить воды в чайник, зажечь плиту, поставить чайник на огонь, дождаться кипения. Задача решена.

Изменяем задачу. В Дано меняем «Чайник», на «Чайник с водой»
(физик): Зажечь плиту, поставить чайник на огонь, дождаться кипения. Задача решена.
(математик): Выливаем воду, тем самым сводим задачу к предыдущей!

Задача №2:
Потушить пожар.
Дано. Горящий объект. Пожарный кран с вентилем. Рукав.
(физик): Разматываем рукав и подключаем к крану. Направляем на огонь и открываем вентиль. Ждем полного гашения огня. Задача выполнена.
(математик): Разматываем рукав и подключаем к крану. Направляем на огонь и открываем вентиль. Ждем полного гашения огня. Задача выполнена.

Изменяем задачу: Объект не горит!
(физик): Задача решена!
(математик): Поджигаем объект, тем самым сводим задачу к предыдущей!!!

Мы в данном случае выступем "математиками".

1. Вначале учимся УВЕРЕННО работать с обычными кнопками. Понимая "что происходит", а не "скопировали кусок скетча - вроде работает".
2. Отделяем "чтение кнопки" (работа с физическим оборудованием) от "обработки и принятия решений". Что позволяет нам свести задачу к предыдущей. Воспользоватся теми же самыми методами.

 

stx-121
Offline
Зарегистрирован: 08.05.2014

brokly пишет:

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

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

На завод напишите, на ХУНдай ! Это там инженеры такие глупые, нашим ни чета :)

 


Схема моего джойстика.

По вашему - нужно его разобрать и сделать 12 выводов вместо 3-х. 
Для того чтоб обрабатывать 11 кнопок по 11 каналам?
Не можете помочь, зачем мешаете...
Клапауций
Offline
Зарегистрирован: 10.02.2013

stx-121 пишет:

По вашему - нужно его разобрать и сделать 12 выводов вместо 3-х. 
Для того чтоб обрабатывать 11 кнопок по 11 каналам?
Не можете помочь, зачем мешаете...

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

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

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

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

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

И этот же человек возмущался что "ему нотации читают". У самого-то с апломбом тоже все "будь здоров".

Если у человека уже есть джойстик. Почему его не заюзать?  Готовый корпус, готовая механика... Или вы думаете что многие могут изготовить клаву в домашних условиях лучшего качества? Я имею ввиду механику всю.

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

да, нечего сказать офигенно оптимальный путь.

Или вы хотели предложить купить "другой джойстик"/другую клаву? Или нужно всобачить туда тиньку и работать с ней по I2C?

Что вы предлагаете делать-то топикстартеру? Давайте не будем идиотничать, послучаем ваше мудрое предложение.

Глядишь просветимся и поймем почему ТИПИЧНОЕ решение клавы на резистивных делителях (которое, как любое решение имеет свои плюсы и недостатки) является идиотским и никогда не должно применятся.

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

сделайте защиту от дребезга, как это делается для обычных кнопок. 

т.е. 1) сохраняете значение порта.

2) если значение изменилось, ждем 50 mS, читаем еще раз

3) что прочитали после задержки, то правда :) сохраняем в data

дальше ваш код.

у меня такой код на обработку резиствных кнопок работает. задержка в 50 mS вполне достаточно. 

lastButtonState = buttonState;   
if (abs(lastButtonState - analogRead(KeyPin)) > 75){
    delay(50);
    buttonState = analogRead(KeyPin);
}

 

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

http://forum.aves-peugeot.ru/viewtopic.php?f=21&t=13494&start=120

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

Как то мне надо было применить резистивную клаву ( пока ехала мембранная ). Для удобства я повесил на самую дальнюю от земли кнопку компаратор, ноль с которого повесил на прерывание, настроенное по срезу импульса, которое выполняло по сути роль триггера, срабатывая по первому срезу из дребезговой пачки. Внутри прерывания делал небольшую задержку ( порядра 5 мкС , пустым циклом) .  Наличие прерывания и задержки не избавило от необходимости повесить ёмкость ( порядка 500 нФ).

Тем не менее, после ряда головняков, перестал  применять резистивные клавы. Перешел на мембранные 4х4 или 4х1 , в зависимости от тз, напрямую, или по i2c, в зависимости от количества оставшихся ног.

stx-121
Offline
Зарегистрирован: 08.05.2014

Спасибо!

Обошелся RS-триггером, теперь все отлично работает.