Надежность чтения резистивных кнопок

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 28, 2014 07:54:21

Сообщение dim3740 »

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

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

Причем проблемы именно с дребезгом. Какие меры применимы? Они такие же как и для цифровых кнопок или нет?

На фото фрагмент из библиотеки.
Вложения
111.jpg
(57.19 КБ) 84 скачивания
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1431
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Ну а какой дребезг может быт у резистивных кнопок! Точность определения - да, дребезг - нет.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Измерьте свои собственные значения АЦП и поместите их в код. Напр. на мой keypad значения совпадают. Для дрезбега добавьте меры, доступные для цифровые кнопки, например, начать с элементарные: чтение, пауза, чтение или несколько раз прочитать и усреднить. До сих пор мне не приходилось делать код сложнее, чем эти два, хотя более сложные методы бесконечны. Но и устройства для простого использования.

Изображение

Код: Выделить всё

U usb = 5.03V
бутон / измерено / данни от производителя:
 
бутон 1 = 1023 / 1023
бутон 2 = 931 / 930
бутон 3 = 854 / 850
бутон 4 = 788 / 790
бутон 5 = 731 / 730
бутон 6 = 683 / 680
бутон 7 = 640 / 640
бутон 8 = 602 / 600
бутон 9 = 569 / 570
бутон 10 = 539 / 540
бутон 0 = 512 / 510
бутон 11 = 487 / 490

Код: Выделить всё

    if (kb > 965) button = 1;
    else if (kb > 890) button = 2;
    else if (kb > 820) button = 3;
    else if (kb > 760) button = 4;
    else if (kb > 705) button = 5;
    else if (kb > 660) button = 6;
    else if (kb > 620) button = 7;
    else if (kb > 585) button = 8;
    else if (kb > 555) button = 9;
    else if (kb > 525) button = 10;
    else if (kb > 500) button = 0;
    else if (kb > 470) button = 11;
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 28, 2014 07:54:21

Сообщение dim3740 »

Верно, ступил... Вывожу в монитор показатели ADC, и при отпускании кнопок проскальзывают значения, в корне отличные от диапазона. Чем объяснить? Провода? Не держит питание?

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

Конденсатор по входу может помочь? Организация цикла для повторных замеров и сброса, при отличных значений - эффективен?

Добавлено after 10 minutes 10 seconds:
veso74, вероятно, у меня что с питанием или с наводками на кеупад. Девиация до плюс\минус 10-15 значений.

Я бы мирился, но в момент отпускания скажем с 600 может пробить скажем и 300((((

Кнопки на 50 см проводке. Наверное надо смотреть как идет земля. Или экранированный?

Вообщем, особых мер надежности и не надо изобретать. Так?
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 437
Зарегистрирован: Пн май 27, 2019 07:18:28
Откуда: ВВХ-ск

Сообщение mont-oriol »

Если в серии из N замеров (N = 100 ... 1000) все значения лежат в диапазоне X1 ... X2, то нажата кнопка такая-то.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Трудно угадать дистанционно. Клавиатура не старая? Контакты кнопки окислились? Исключите варианты, которые перечислили, один за другим: измерите напрежение, попробуйте с более качественными проводами и их соединения с клавиатурой, поместите заземленную изолированную пластину под клавиатуру ... Дайте весь код программы. Сфотографируйте экспериментальную установку и поделитесь фото.
Последний раз редактировалось veso74 Пт авг 18, 2023 17:48:44, всего редактировалось 1 раз.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 28, 2014 07:54:21

Сообщение dim3740 »

Спасибо всем, я попробую все выложить тут... С АЦП почти не работал, посему и догадки причин. Если позволите, все же пара вопросов..

1. Как это "нет дребезга"? Нажимаю кнопку, пошел контакт, пошел потенциал, отпружинило, потенциал пропал и т.п.
2. Разве не нужно обязательно делать паузу перед считыванием? Ведь нажали, пошел ток, емкость/индуктивность проводов... конечно, АЦП защелкнет какое то значение НЕ достигшее устойчивого.
3. Как АЦП меряет? Т.е. "если напряжение 0, то ждем. Если напряжение больше хоть на 1, то запускаем измерение". Или он все время меряет?
4. Если делать "цикл" для проверки постоянства, то АЦП же нужно время, чтоб все обработать и повторно запускать измерение? Это в цикле надо учесть?

Конструкция готовая и сложная для переделки. Хочется найти решение программным путем. Назначение бытовое, время между кнопками - секунды и более .
Мучитель микросхем
Сообщения: 437
Зарегистрирован: Пн май 27, 2019 07:18:28
Откуда: ВВХ-ск

Сообщение mont-oriol »

Просто возьмте готовую библиотеку
Если ваша схема не совпадает с той, то соберите по той схеме для минимального количества кнопок, и разберитесь как оно там работает. Потом можно код адаптировать под вашу схему.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1486
Зарегистрирован: Вс май 13, 2012 00:01:54

Сообщение Ariadna-on-Line »

Если в роли клавиатуры используется схема делителя, где в одном плече постоянный резистор, а в другом плече резисторы кнопками коротятся на шину питания - то такая схема будет иметь резко нелинейной шаг на выходе. Зато без нажатия - не потребляет тока. Я использовал другую схему - цепочка одинаковых резисторов между плюсом и Землей. Кнопки подают на вход потенциалы с точек этого делителя. Делитель постоянно проводит ток, зато шаг одинаков. Чтобы без нажатых кнопок вход АЦП не "зависал" - он притянут на землю высокоомным резистором. Здесь возможна вероятность нажатия двух кнопок - крайней верхней и крайней нижней. Этот случай и определяет минимальное допустимое сопротивление резисторов цепи делителя. Но при желании можно слегка усложнить схему.
ПС. По-моему использовать библиотеки здесь - это как читать инструкцию по использованию туалетной бумаги.
Мучитель микросхем
Сообщения: 437
Зарегистрирован: Пн май 27, 2019 07:18:28
Откуда: ВВХ-ск

Сообщение mont-oriol »

[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4464079#p4464079"]По-моему использовать библиотеки здесь - это как читать инструкцию по использованию туалетной бумаги.[/uquote]
Если я правильно понял вашу мысль, то вам известно решение по анти-дребезгу кнопок настолько простое, что его не стоит заворачивать в отдельную библиотеку.
Вас не затруднит его опубликовать здесь? Ведь это именно то, о чём спрашивал автор вопроса. Поскольку, это не библиотека, тогда может быть скетч, чтобы его можно было протестировать?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1486
Зарегистрирован: Вс май 13, 2012 00:01:54

Сообщение Ariadna-on-Line »

Могу даже в двух словах объяснить -
В случае схемного решения описанного мною - дребезг погрешности не вносит. Низкоомный делитель по сравнению с высокоомным входом АЦП с первого же контакта заряжает входную ёмкость АЦП. Дальнейший дребезг уже ничего изменить не в состоянии. В коде не предусматривал мер по борьбе с ним и все работало чики-пуки. В алгоритме опознавания кнопки была проверка на попадание в диапазон значений. Например кнопка дает семпл 100 единиц, а соседние 80 и 120. Значит идет проверка, что семпл больше 90. но меньше 110. И так для всех кнопок. Естественно сначала было проведено измерение значений, высчитаны диапазоны и вписаны в скетч. Это неизбежно, тк резисторы имеют допуск до 5%.
ПС. В вашем коде совершенно напрасно используется функция map(). Работать надо с отсчетами АЦП - семплами, без привязки к вольтажу.
Ответить

Вернуться в «Arduino»